如何将焦点设置在WPF数据网格或其第一行上
本文关键字:一行 网格 焦点 设置 数据网 数据 WPF | 更新日期: 2023-09-27 18:09:39
我在Window
上放置了WPF DataGrid
。我有一个按钮,它执行一些业务逻辑并填充网格。
当从按钮输入TAB
时,我想将焦点设置在DataGrid
上(最好是DataGrid中的第一行(我已经设置了TabIndex
,但不知何故,重点并没有放在DataGrid上。
表单XAML的相关部分在这里:
<StackPanel Orientation="Vertical" Grid.Column="2" Margin="20,10,10,10">
<Button Content="Search"
Height="25" HorizontalAlignment="Right" Margin="0,-25,0,0"
Name="btnSearch" VerticalAlignment="Top" Width="75" **TabIndex="1300"** Click="btnSearch_Click" Keyboard.KeyDown="btnSearch_PreviewKeyDown" LostFocus="btnSearch_LostFocus"/>
</StackPanel>
<DataGrid AutoGenerateColumns="False" Grid.Column="1" Margin="20,160,10,10" Name="dataGridOrganisations" **TabIndex="1400"**
BorderThickness="2" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" Focusable="True"
ScrollViewer.VerticalScrollBarVisibility="Auto" ScrollViewer.HorizontalScrollBarVisibility="Auto" GridLinesVisibility="None"
ItemsSource="{Binding}" CanUserReorderColumns="False" CanUserResizeRows="False" IsReadOnly="True" SelectionChanged="dataGridOrganisations_SelectionChanged" Keyboard.PreviewKeyDown="dataGridOrganisations_PreviewKeyDown" >
<DataGrid.Columns>
<DataGridTextColumn Header="Shortname" Width="100" Binding="{Binding ShortName}" />
<DataGridTextColumn Header="Internal Code" Width="100" Binding="{Binding LocalID}"/>
<DataGridTextColumn Header="Name" Width="*" Binding="{Binding Name}"/>
</DataGrid.Columns>
</DataGrid>
当我在Button的LostFocus
事件上添加以下代码时,它突出显示了第一行。但当我使用"向下"箭头键选择网格中的下一行时;它没有转到下一行,而是首先将焦点设置在"搜索"按钮上,然后下次转到第二行!
if (this.dataGridOrganisations != null && this.dataGridOrganisations.HasItems)
{
this.dataGridOrganisations.Focus();
if (dataGridOrganisations.Items != null && dataGridOrganisations.Items.Count > 0)
{
DataGridRow firstRow = this.dataGridOrganisations.ItemContainerGenerator.ContainerFromItem(dataGridOrganisations.Items[0]) as DataGridRow;
if (firstRow != null)
{
firstRow.IsSelected = true;
}
}
}
如何将焦点设置在DataGrid(或其第一行(上?为什么TabIndex
在这里不起作用?
如果控件层次结构中的Button
和DataGrid
之间没有可聚焦控件,则甚至不需要选项卡索引。你有很多处理程序,对我来说一切都有点复杂。我在代码中找不到任何东西(当然,也许其他人可以(,我的建议是,你应该尽量简化你的代码,直到它在默认情况下再次正常工作。例如,该代码的选项卡应该工作:
<StackPanel>
<Button Content="Lorem Ipsum"/>
<DataGrid ItemsSource="{Binding Source={StaticResource Items}}">
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding Name}"/>
</DataGrid.Columns>
</DataGrid>
</StackPanel>
此外,为什么要使用大选项卡索引增量?如果你使用1301&1302之间不可能有任何值,因此它应该自动成为更安全的代码。
在xaml 的数据网格中添加以下代码
SelectedIndex="0" Loaded="DataGrid_Loaded"
在.cs文件中添加以下代码
private void DataGrid_Loaded(object sender, RoutedEventArgs e)
{
DataGrid dataGrid = sender as DataGrid;
dataGrid.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
}
DataGrid1.SelectedIndex = 0;
DataGrid1.Focus();
您可以将任何想要的整数放入选定的索引中。