CHill60
Настройка Tabindex должна работать как в WPF, так и в WinForms. Вы можете установить его в XAML. например
<Button x:Name="Button1" TabIndex="2" Height="60" Width="75" Margin="221,26,221,20" Grid.Row="0"/>
<Button x:Name="Button2" TabIndex="1" Height="60" Width="75" Margin="221,26,221,20" Grid.Row="1"/>
<Button x:Name="Button3" TabIndex="0" Height="60" Width="75" Margin="221,26,221,20" Grid.Row="2"/>
Или в окне свойств каждого элемента управления. Или в коде, стоящем за ним, например
Button1.TabIndex = 2;
Button2.TabIndex = 0;
Button3.TabIndex = 1;
При нормальных обстоятельствах WPF назначит порядок вкладок на основе логического дерева (
Tab Order | 2000 вещей, которые вы должны знать о WPF[
^]). Если он ведет себя не так, как ожидалось, правильно ли вы обслуживали контейнерный контроль?
Вероятно, лучшим способом было бы вообще не использовать TabIndex, а вырезать и вставить ваш код так, чтобы элементы управления были упорядочены в XAML в том порядке, в котором вы хотите, чтобы они имели tabindex, например
<Button x:Name="Button2" Height="60" Width="75" Margin="221,26,221,20" Grid.Row="1"/>
<Button x:Name="Button1" Height="60" Width="75" Margin="221,26,221,20" Grid.Row="0"/>
<Button x:Name="Button3" Height="60" Width="75" Margin="221,26,221,20" Grid.Row="2"/>
Примечание. при удалении TabIndex может быть полезно проверить, что свойство (в окне свойств) вернулось к значению по умолчанию 2147483647.
Если он все еще работает не так, как вы хотите, то максимально упростите свою форму, чтобы все еще продемонстрировать проблему и опубликовать XAML с помощью
Улучшить вопрос ссылка
[Править - как просили некоторые "полные" решения]
Этот (весь) код демонстрирует, что именно порядок появления элементов управления в XAML определяет порядок табуляции, когда сам индекс табуляции не изменяется (т. е. окно свойств имеет индекс табуляции по умолчанию = 2147483647)
<Window x:Class="MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<Grid.RowDefinitions><RowDefinition/><RowDefinition/><RowDefinition/></Grid.RowDefinitions>
<Grid.ColumnDefinitions><ColumnDefinition/><ColumnDefinition/><ColumnDefinition/></Grid.ColumnDefinitions>
<TextBox x:Name="TextBox1" Grid.Column="0" Grid.Row="0" Text="TextBox1" />
<TextBox x:Name="TextBox2" Grid.Column="2" Grid.Row="1" Text="TextBox2" />
<TextBox x:Name="TextBox3" Grid.Column="1" Grid.Row="1" Text="TextBox3" />
<TextBox x:Name="TextBox4" Grid.Column="1" Grid.Row="0" Text="TextBox4" />
<TextBox x:Name="TextBox5" Grid.Column="2" Grid.Row="2" Text="TextBox5" />
<TextBox x:Name="TextBox6" Grid.Column="0" Grid.Row="2" Text="TextBox6" />
</Grid>
</Window>
Текст в текстовых полях показывает порядок, в котором я ожидаю, что элементы управления будут сфокусированы при использовании клавиши tab. Сама форма выглядит немного так при первой загрузке:
TextBox1 TextBox4 (BlankCell)
(BlankCell) TextBox3 TextBox2
TextBox6 (BlankCell) TextBox5
В этой версии кода текстовые поля вкладываются в обратном порядке, т. е. TextBox6 является первым в этом порядке, а затем 5, 4, 3, 2, 1
<Window x:Class="MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<Grid.RowDefinitions><RowDefinition/><RowDefinition/><RowDefinition/></Grid.RowDefinitions>
<Grid.ColumnDefinitions><ColumnDefinition/><ColumnDefinition/><ColumnDefinition/></Grid.ColumnDefinitions>
<TextBox x:Name="TextBox1" Grid.Column="0" Grid.Row="0" Text="TextBox1" TabIndex ="5"/>
<TextBox x:Name="TextBox2" Grid.Column="2" Grid.Row="1" Text="TextBox2" TabIndex ="4"/>
<TextBox x:Name="TextBox3" Grid.Column="1" Grid.Row="1" Text="TextBox3" TabIndex ="3"/>
<TextBox x:Name="TextBox4" Grid.Column="1" Grid.Row="0" Text="TextBox4" TabIndex ="2"/>
<TextBox x:Name="TextBox5" Grid.Column="2" Grid.Row="2" Text="TextBox5" TabIndex ="1"/>
<TextBox x:Name="TextBox6" Grid.Column="0" Grid.Row="2" Text="TextBox6" TabIndex ="0"/>
</Grid>
</Window>
Поведение формы будет таким же, если я заменю параметр XAML TabIndex на код позади При загрузке формы. Обратите внимание, что в проекте нет другого кода (кроме автоматически сгенерированного Application.xaml и т. д.), И я нацелился на .NET Framework 3.5.
Если ваша проблема заключается в том, что первое текстовое поле не выбирается до тех пор, пока вы не нажмете клавишу Tab в первый раз, попробуйте сделать это:
<Grid FocusManager.FocusedElement="{Binding ElementName=TextBox1}">
Обратите внимание на изменение поведения-с помощью этого FocusManager TextBox1 имеет фокус после загрузки формы, а клавиша Tab перемещает нас в TextBox6. Без FocusManager ничто не имеет фокуса при загрузке формы и клавиша Tab перемещает нас прямо в TextBox6