WPF рассматривает все дерево пользовательского интерфейса как одну область вкладок. Это не разбито на меньшие области, такие как вы ожидаете. Это включает в себя элементы управления внутри UserControls.
Например, если у вас было
<StackPanel>
<TextBox Name="TextBox1" />
<MyUserControl />
<TextBox Name="TextBox3" />
</StackPanel>
А MyUserControl
выглядел как
<MyUserControl>
<TextBox Name="TextBox2" />
</MyUserControl>
Цикл вкладок по умолчанию будет TextBox1, TextBox2, TextBox3. Это связано с тем, что свойства TabIndex не определены, поэтому все элементы управления работают в том порядке, в котором они по умолчанию добавляются в пользовательский интерфейс.
Если вы установите TabIndex на своих элементах управления, например, ниже,
<StackPanel>
<TextBox Name="TextBox1" TabIndex="1" />
<MyUserControl TabIndex="2" />
<TextBox Name="TextBox3" TabIndex="3" />
</StackPanel>
Ваша вкладка изменится на TextBox1, TextBox3, TextBox2. Это связано с тем, что TextBox2 не имеет указанного TabIndex, поэтому предполагается, что используется значение по умолчанию, и он добавляется после того, как все другие элементы управления с указанным TabIndex будут циклически проходить.
Обычно я обхожу это, связывая TabIndex
элементов управления внутри UserControl с UserControl.TabIndex.
Например, добавление следующей привязки к UserControl вернет цикл Tab снова
<MyUserControl>
<TextBox Name="TextBox2" TabIndex="{Binding Path=TabIndex, RelativeSource={RelativeSource AncestorType={x:Type local:MyUserControl}}}" />
</MyUserControl>
Обычно я предпочитаю устанавливать эту привязку в событии Loaded
пользовательского элемента управления вместо того, чтобы не забывать устанавливать эту привязку на всех элементах управления внутри пользовательского элемента управления. Я уверен, что есть и более эффективные способы сделать это, однако проблема не возникала достаточно часто, чтобы я мог сесть и найти время, чтобы изучить, как правильно использовать области табуляции, чтобы избежать этого обходного пути.