Неверно работает порядок вкладок WPF - PullRequest
4 голосов
/ 05 апреля 2011

У меня есть представление в WPF, что я боролся за правильность порядка табуляции.У меня есть три текстовых поля (назовем их Text1, Text2 и Text3) и два пользовательских элемента управления, каждый из которых имеет несколько других текстовых полей и различные элементы управления (давайте назовем их Custom1 и Custom2).

Макет таков, что поток вкладок должен переходить в Text1, Text2, Custom1, Custom2, Text3.Я установил свойство TabIndex на каждом элементе управления, чтобы соответствовать этому порядку, и проверил, что все они установлены в IsTabStop.

Проблема в том, что фактическим потоком вкладок является Текст1, Текст2, Текст3, а затем Пользовательский1, Пользовательский2, и я не могу понять, почему.Когда он переходит к пользовательским элементам управления, он правильно переходит все элементы управления в них, как я и ожидал.Я просто не могу понять, почему он переходит к третьему текстовому полю, прежде чем он перейдет к первому пользовательскому элементу управления.

Я перепробовал все, что мог придумать, включая проверку того, что все элементы 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>

Ответы [ 2 ]

10 голосов
/ 06 апреля 2011

У меня нет вашего пользовательского элемента управления, поэтому я создал элемент, содержащий только TextBox.После подключения этого к вашему XAML я обнаружил, что порядок табуляции выглядит следующим образом:

TextBox1, TextBox2, CustomControl1, CustomControl2, TextBox3, TextBox в CustomControl1, TextBox в CustomControl2.

Обратите внимание, чтопосле того, как вкладка TextBox2 перемещает фокус на сами пользовательские элементы управления , а не на дочерние элементы управления, которые у них есть.TextBox в моем пользовательском элементе управления не имел TabIndex, поэтому его значение TabIndex предполагалось значением по умолчанию, Int32.MaxValue (см. Документацию MSDN для свойства TabIndex ).Следовательно, они идут последними в порядке табуляции.

Я обнаружил, что все работает лучше, если я пометил пользовательские элементы управления как IsTabStop="False" (я не понимаю, почему я хотел бы сосредоточиться на самих пользовательских элементах управления)и установите для tab-index элемента TextBox в пользовательском элементе управления значение, указанное в элементе <my:CustomControl />, добавив атрибут TabIndex="{TemplateBinding TabIndex}" в TextBox в пользовательском элементе управления.Как только я это сделал, порядок вкладок был, как и следовало ожидать,

TextBox1, TextBox2, TextBox в CustomControl1, TextBox в CustomControl2, TextBox3.

Конечно, мой пользовательский элемент управления состоит изтолько одного TextBox, так что установка единого таб-индекса для меня исправлена.У меня нет вашего кода, поэтому я не могу сказать наверняка, но этого может быть достаточно, чтобы таким же образом установить индекс табуляции всех дочерних элементов управления в ваших пользовательских элементах управления в элементе <my:CustomControl />.

РЕДАКТИРОВАТЬ : если вы не можете использовать TemplateBinding и вместо этого иметь файл .xaml с соответствующим файлом .xaml.cs, то у вас есть то, что называется пользовательэлемент управления , а не пользовательский элемент управления.В этом случае вы можете попробовать установить индекс вкладки внутри XAML для CustomControlA, используя что-то вроде следующего:

TabIndex="{Binding Path=TabIndex, RelativeSource={RelativeSource AncestorType={x:Type my:CustomControlA}}}"
1 голос
/ 05 апреля 2011

Пожалуйста, оставьте свой код XAML.В то же время следует учитывать следующие факторы:

  • Проверьте значения атрибута KeyboardNavigation.TabIndex еще раз
  • Вы динамически добавляете пользовательские вкладки во время выполнения?
  • Вы программно изменяете или взаимодействуете с пользовательскими элементами управления во время выполнения?
  • Убедитесь, что вкладки перечислены в правильном порядке, в разметке XAML
...