Focus и TabIndex для пользовательских элементов управления - PullRequest
6 голосов
/ 01 ноября 2011

У меня странное поведение: У меня есть MainWindow, содержащее текстовые поля и (простые) пользовательские элементы управления (текстовое поле и кнопка), но я удалил это только для текстового поля в целях отладки.

Когда я использую текстовые поля и элементы управления пользователя БЕЗ установки свойства TabIndex, курсор перемещается по элементам управления в правильном порядке (в порядке добавления элементов управления в окно)

Когда я использую текстовые поля и usercontrols WITH, устанавливая свойство TabIndex, курсор перемещается по элементам управления в недопустимом порядке (сначала все usercontrols, затем все текстовые поля), это также верно, если для TabIndex установлено значение, соответствующее порядку контроль был добавлен

Вот мой пользовательский контроль

<UserControl x:Class="SmallControl"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             >
        <TextBox x:Name="txTEXT" Text="{Binding Text}" />
</UserControl>

Следующее xaml Mainwindow приводит к порядку 000000,111111,222222,333333, вот и все

    <GroupBox Header="Small,Textbox,Small,TextBox without TabIndex">
        <UniformGrid Columns="4">
            <local:SmallControl Text="000000" />
            <TextBox Text="111111" />
            <local:SmallControl Text="222222" />
            <TextBox Text="333333" />
        </UniformGrid>
    </GroupBox>

Следующее xaml Mainwindow приводит к порядку 000000,222222,111111,333333, это НЕ нормально

    <GroupBox Header="Small,Textbox,Small,TextBox with TabIndex">
        <UniformGrid Columns="4">
            <local:SmallControl TabIndex="0" Text="000000" />
            <TextBox TabIndex="1" Text="111111" />
            <local:SmallControl TabIndex="2" Text="222222" />
            <TextBox TabIndex="3" Text="333333" />
        </UniformGrid>
    </GroupBox>

Есть ли способ использовать TabIndex без необходимости добавлять элементы управления в «правильном» порядке в xaml?

С уважением Клаус

1 Ответ

28 голосов
/ 01 ноября 2011

По умолчанию WPF считывает все элементы управления, как внутри, так и снаружи UserControls, на одном уровне вкладок (если не указано иное).Поскольку элементы управления внутри UserControl не имеют заданного TabIndex, они вкладываются на последнюю после первого цикла вкладки.

Чтобы изменить это поведение, я обычно устанавливаю IsTabStop="False" в своем определении UserControl, затем я связываю внутреннийуправляет TabIndex для пользовательского элемента управления TabIndex

UserControl XAML

<TextBox x:Name="txTEXT" Text="{Binding Text}" 
         TabIndex="{Binding Path=TabIndex, RelativeSource={RelativeSource 
             AncestorType={x:Type local:SearchView}}}"/>

Использование XAML

<GroupBox Header="Small,Textbox,Small,TextBox with TabIndex">
    <UniformGrid Columns="4">
        <local:SmallControl TabIndex="0" Text="000000" IsTabStop="False" />
        <TextBox TabIndex="1" Text="111111" />
        <local:SmallControl TabIndex="2" Text="222222" IsTabStop="False" />
        <TextBox TabIndex="3" Text="333333" />
    </UniformGrid>
</GroupBox>

Вы также можете правильно настроить вкладки, установив KeyboardNavigation.TabNavigation прикрепленное свойство в вашем UserControl к Local .Кажется, у меня возникли проблемы с этим, но я, честно говоря, не могу вспомнить подробности, поэтому это может сработать.

<UserControl x:Class="SmallControl" ...
             KeyboardNavigation.TabNavigation="Local"  />
...