5

タブオーダーを正しくするために戦ってきたWPFのビューがあります。3 つのテキスト ボックス (Text1、Text2、および Text3 と呼びます) と 2 つのカスタム コントロールがあり、それぞれに他のいくつかのテキスト ボックスとさまざまなコントロールがあります (Custom1 と Custom2 と呼びましょう)。

レイアウトは、タブ フローが Text1、Text2、Custom1、Custom2、Text3 になるようになっています。この順序に一致するように各コントロールの TabIndex プロパティを設定し、すべてが IsTabStop に設定されていることを確認しました。

問題は、実際のタブ フローが Text1、Text2、Text3、Custom1、Custom2 の順に進むことです。その理由がわかりません。カスタム コントロールに移動すると、期待どおりに、それらのすべてのコントロールを適切にステップオーバーします。最初のカスタム コントロールに移動する前に、3 番目のテキスト ボックスに移動する理由がわかりません。

すべての xaml 要素がタブ オーダーで配置されていることを確認するなど、考えられるすべてを試しましたが、何も役に立たないようです。

カスタムコントロールに焦点を当てる前に、基本的なコントロールをすべて調べているのではないかと思いますが、アイデアがありません。どんな助けでも素晴らしいでしょう。

編集: これが私のxamlです:

<Grid>
    <GroupBox x:Name="_groupBox" BorderBrush="Transparent" BorderThickness="0">
        <Grid x:Name="_card">
            <Label Content="A:" Height="28" HorizontalAlignment="Left" Margin="5,3,0,0" Name="_labelA" VerticalAlignment="Top" />
            <Label Content="B:" Height="28" HorizontalAlignment="Left" Margin="5,25,0,0" Name="_labelB" VerticalAlignment="Top" />
            <TextBox Name="_a" Height="20" HorizontalAlignment="Left" Text="{Binding AText, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" IsEnabled="{Binding AEnabled}" Margin="94,5,0,0"  VerticalAlignment="Top" LostFocus="InputNameLeave" Width="221" TabIndex="0" />
            <TextBox Name="_b" Height="20" HorizontalAlignment="Left" Margin="94,26,0,0" Text="{Binding BText, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" VerticalAlignment="Top" Width="102" TabIndex="1" />
            <my:CustomControlA HorizontalAlignment="Left" Margin="-6,55,0,0" x:Name="_custom1" VerticalAlignment="Top" TabIndex="2" IsTabStop="True" />
            <my:CustomControlB HorizontalAlignment="Left" Margin="334,0,0,0" x:Name="_custom2" VerticalAlignment="Top" Width="320" TabIndex="3" IsTabStop="True" />
            <Label Content="C:" Height="28" HorizontalAlignment="Left" Margin="342,59,0,0" Name="_labelC" VerticalAlignment="Top" />
            <TextBox Name="_c" Height="20" HorizontalAlignment="Left" Margin="417,60,0,0" Text="{Binding CText, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" IsEnabled="{Binding CEnabled}"  VerticalAlignment="Top" Width="154" TabIndex="4" />
        </Grid>
    </GroupBox>
</Grid>
4

2 に答える 2

12

私はあなたのカスタム コントロールを手元に持っていないので、TextBox だけを含むコントロールを作成しました。これを XAML に接続した後、タブ オーダーが次のようになっていることがわかりました。

TextBox1、TextBox2、CustomControl1、CustomControl2、TextBox3、CustomControl1 内の TextBox、CustomControl2 内の TextBox。

TextBox2 のタブ移動がカスタム コントロール自体にフォーカスを移動した後、それらがたまたま持つ子コントロールではないことに注意してください。カスタム コントロールの TextBox には TabIndex がなかったため、その TabIndex は既定値の Int32.MaxValue であると想定されていました ( TabIndex プロパティについては、MSDN のドキュメントを参照してください)。したがって、それらはタブ オーダーの最後になります。

カスタム コントロールを次のようにマークしIsTabStop="False"(カスタム コントロール自体に焦点を当てたい理由がわかりません)、カスタム コントロールの TextBox のタブ インデックスを、カスタム コントロールのTextBox に<my:CustomControl />属性を追加することによって要素。TabIndex="{TemplateBinding TabIndex}"それを実行すると、タブ オーダーは予想どおり、

TextBox1、TextBox2、CustomControl1 内の TextBox、CustomControl2 内の TextBox、TextBox3。

もちろん、私のカスタム コントロールは 1 つの TextBox だけで構成されているため、1 つのタブ インデックスを設定することで問題が解決しました。私はあなたのコードを持っていないので、確かなことは言えませんが、カスタム コントロール内のすべての子コントロールのタブ インデックスを<my:CustomControl />、同じ方法で要素内のタブ インデックスに設定するだけで十分かもしれません。

編集: を使用できずTemplateBinding、代わりに対応する .xaml.cs ファイルを含む .xaml ファイルがある場合、カスタム コントロールではなく、ユーザー コントロールと呼ばれるものがあります。その場合は、次のようなものを使用して、CustomControlA の XAML 内にタブ インデックスを設定してみてください。

TabIndex="{Binding Path=TabIndex, RelativeSource={RelativeSource AncestorType={x:Type my:CustomControlA}}}"
于 2011-04-05T21:59:23.393 に答える
1

XAML コードを投稿してください。それまでの間、考慮すべき事項には次のようなものがあります。

  • KeyboardNavigation.TabIndex 属性値をもう一度確認してください
  • 実行時にカスタム タブを動的に追加していますか?
  • 実行時にカスタム コントロールをプログラムで変更または操作していますか?
  • タブが XAML マークアップで適切な順序でリストされていることを確認します
于 2011-04-05T19:03:00.433 に答える