我在DataGrid
上放置了WPF Window
。我有一个按钮,它执行一些业务逻辑并填充网格。
我希望在按钮的DataGrid
时将焦点设置在TAB
(最好是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
在这里不起作用?
答案 0 :(得分:2)
如果控件层次结构中的Button
和DataGrid
之间没有可聚焦控件,则甚至不需要制表符索引。你有很多处理程序,一切似乎有点让我感到困惑。我无法在该代码中发现任何内容(当然也许其他人可以),我的建议是您尝试简化代码,直到它再次正常工作,默认情况下应该如此。例如这段代码的标签应该有效:
<StackPanel>
<Button Content="Lorem Ipsum"/>
<DataGrid ItemsSource="{Binding Source={StaticResource Items}}">
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding Name}"/>
</DataGrid.Columns>
</DataGrid>
</StackPanel>
另外,为什么大的tab-index delta?如果你使用1301&amp; 1302之间没有任何值,所以它应该自动成为更安全的代码。
答案 1 :(得分:1)
在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));
}
答案 2 :(得分:0)
DataGrid1.SelectedIndex = 0;
DataGrid1.Focus();
您可以将想要的任何整数放入所选索引。