0

UserControl を適切にタブに移動しようとしていて、困惑しています。論理ツリーは次のようになります。

|-Window
  -Grid
    -TabControl
      -TabItem
        -StackPanel
          -MyUserControl
            |-StackPanel
              -GroupBox
                -Grid
                  -ComboBox
                    -Textbox1
                      -Textbox2

ComboBox の可視性コンバーターが返された場合Visibility.Collapsed(ユーザーがデータベース モードを変更できないようにする) を除いて、すべて正常に動作し、textbox1 が選択された場合、UserControl のコントロールをタブで移動する代わりに、フォーカスがボタンに移動します。ウィンドウの下部に宣言されています。表示されるコントロール以外には、TabIndex または FocusManager プロパティが設定されているものはありません。

レンガの壁に頭をぶつけていますが、何かが欠けているに違いありません。IsFocusScope=True/False を試してみましたが、FocusedElement で遊んでいましたが、その ComboBox が非表示の場合は何も機能しません ( Visibility.Collapsed)。

<Window x:Class="MyNamespace.Client.WinInstaller"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    FocusManager.FocusedElement="{Binding ElementName=tabWizard}">
    <Window.Resources>
        <props:Settings x:Key="settings" />
    </Window.Resources>
    <Grid Grid.IsSharedSizeScope="True">
        <!-- row and column definitions omitted -->

        <loc:SmallHeader Grid.Row="0" x:Name="headerBranding" HeaderText="Setup" />
        <TabControl x:Name="tabWizard" DataContext="{StaticResource settings}" SelectedIndex="0" FocusManager.IsFocusScope="True">
            <TabItem x:Name="tbStart" Height="0">
                <StackPanel>
                    <TextBlock Text="Database Mode"/>
                    <loc:DatabaseSelector x:Name="dbSelector" AllowChangeMode="False" TabIndex="1"
                                          AvailableDatabaseModes="SQLServer" IsPortRequired="False"
                                          DatabaseMode="{Binding Default.DbMode,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"
                                          DatabasePath="{Binding Default.DatabasePath,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"/>
                </StackPanel>
            </TabItem>
        ...

ユーザー コントロールの上部は次のとおりです。

<UserControl x:Class="MyNamespace.Client.DatabaseSelector"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    x:Name="root"
    FocusManager.IsFocusScope="True"
    FocusManager.FocusedElement="{Binding ElementName=cboDbMode}">
    <UserControl.Resources>
        <conv:DatabaseModeIsFileBased x:Key="DatabaseModeIsFileBased"/>
        <BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter"/>
    </UserControl.Resources>
    <StackPanel DataContext="{Binding}">
        <GroupBox>
            <Grid>
                <!-- row and column definitions omitted -->
                <Label Content="Database Mode"/>
                <ComboBox x:Name="cboDbMode" SelectedValue="{Binding ElementName=root,Path=DatabaseMode,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"
                          DisplayMemberPath="Value" SelectedValuePath="Key" TabIndex="1" Visibility="{Binding AllowChangeMode,ElementName=root,Converter={StaticResource BooleanToVisibilityConverter}}" />
                   <!-- AllowChangeMode is a DependencyProperty on the UserControl -->
                <Grid><!-- row and column definitions omitted -->
                    <Label "Host"/>
                    <TextBox x:Name="txtDBHost" Text="{Binding ElementName=root,Path=DatabaseHost,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" TabIndex="2" />
                    <TextBox x:Name="txtDBPort" Text="{Binding ElementName=root,Path=DatabasePortString,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" TabIndex="3" />
4

2 に答える 2

5

私はこの応答がかなり遅いことを知っています...しかし、あなたは試しましたか:

<UserControl ... KeyboardNavigation.TabNavigation="Local">

そうすることで、UserControl がフォーカスを受け取ると、(アプリ全体で TabIndex 値の競合を心配する代わりに) UserControl 内の TabStop のみをナビゲートすることが保証されます。UserControl の TabStops をループした後、TabNavigation はその外側の TabStop に戻ります。

http://msdn.microsoft.com/en-us/library/system.windows.input.keyboardnavigationmode.aspx

于 2011-05-13T22:52:34.263 に答える
0

おそらく問題は、FocusManager.FocusedElement を非表示にすることです。とにかく、いくつかの複雑な要因を排除するだけで、生活を楽にすることができます。

  1. FocusManager.FocusedElement を削除します... とにかく、ComboBox は最初のコントロールです。
  2. FocusManager.IsFocusScope を削除します... usercontrol に入るたびに、最初のコントロールがフォーカスされ、前に離れたときにフォーカスされたコントロールではなく、問題ないと思います。ユーザーコントロールを周囲のコントロールで「インライン」にするだけです。
  3. UserControl の明示的な TabIndices を削除します。あなたのレイアウトはすでに同じ順序を意味しています。

これら 3 つの複雑な要因を排除すれば、すでに完了している可能性があります。おそらく、UserControl Focusable=False を設定する必要があるかもしれません。フォーカスは、comboBox または TextBox1 内の最初のフォーカス可能なコントロールに渡されます。

于 2010-03-26T07:51:35.717 に答える