如何将焦点设置在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在这里不起作用?

如何将焦点设置在WPF数据网格或其第一行上

如果控件层次结构中的ButtonDataGrid之间没有可聚焦控件,则甚至不需要选项卡索引。你有很多处理程序,对我来说一切都有点复杂。我在代码中找不到任何东西(当然,也许其他人可以(,我的建议是,你应该尽量简化你的代码,直到它在默认情况下再次正常工作。例如,该代码的选项卡应该工作:

  <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();

您可以将任何想要的整数放入选定的索引中。