Порядок вкладок WPF работает неправильно

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

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

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

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

person captncraig    schedule 05.04.2011    source источник


Ответы (2)


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

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

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

Я обнаружил, что все работает лучше, если я помечу настраиваемые элементы управления как IsTabStop="False" (я не понимаю, почему я хочу сосредоточить внимание на самих настраиваемых элементах управления) и установить для индекса табуляции 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}}}"
person Luke Woodward    schedule 05.04.2011
comment
Моему настраиваемому элементу управления не нравится TemplateBinding, потому что я не использую шаблоны. Есть ли другой способ унаследовать его или мне нужно его создать по шаблону? Это проблема, однако, если я жестко закодирую правильный порядок табуляции в дочерних элементах управления относительно родительской формы, это сработает. Мне просто нужно сделать это более обобщенным. - person captncraig; 06.04.2011
comment
Я только что столкнулся с аналогичной проблемой при использовании настраиваемого элемента управления, в котором отсутствовал TabIndex = {TemplateBinding TabIndex}. Огромное спасибо! - person louisgab; 25.10.2011

Опубликуйте свой код XAML. А пока стоит подумать о следующих вещах:

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