如何让DataGrid整体单站关注方向键行选择遍历?
How to make DataGrid a single stop as a whole on focus traversal with arrow keys row selection?
我有一个 Window
,上面几乎没有控件。其中之一是DataGrid
。我想实现一些非默认的焦点遍历。即:
DataGrid
是整体单站,不是每一行。
- 当
DataGrid
获得焦点时,用户可以使用向上和向下键浏览行。
- 不允许使用左右键在列中导航。
- 第一列(也是唯一与导航相关的列)的类型为
DataGridHyperlinkColumn
。当用户点击 Space 或 Enter 键时,它会执行超链接。
目前我有以下代码:
<DataGrid x:Name="DocumentTemplatesGrid"
Grid.Row="2"
ItemsSource="{Binding Source={StaticResource DocumentTemplatesView}}"
IsReadOnly="True"
AutoGenerateColumns="False"
SelectionUnit="FullRow"
SelectionMode="Single"
TabIndex="1"
IsTabStop="True">
<DataGrid.CellStyle>
<Style TargetType="DataGridCell">
<Setter Property="IsTabStop" Value="False"/>
</Style>
</DataGrid.CellStyle>
<DataGrid.RowStyle>
<Style TargetType="DataGridRow">
<Setter Property="IsTabStop" Value="False"/>
</Style>
</DataGrid.RowStyle>
<DataGrid.Columns>
<DataGridHyperlinkColumn Header="Name"
Width="2*"
Binding="{Binding Name}"/>
<DataGridTextColumn Header="Description"
Width="5*"
Binding="{Binding Description}"/>
<DataGridTextColumn Header="Type"
Width="*"
Binding="{Binding Type}"/>
</DataGrid.Columns>
</DataGrid>
很遗憾,没有达到我的预期。
您能否解释一下如何实现这一目标?
所以,我给你的建议是:
<DataGrid x:Name="DocumentTemplatesGrid"
Grid.Row="2"
ItemsSource="{Binding Items}"
IsReadOnly="True"
AutoGenerateColumns="False"
SelectionMode="Single"
SelectionUnit="FullRow"
TabIndex="1"
IsTabStop="True"
PreviewKeyDown="DocumentTemplatesGrid_PreviewKeyDown">
<DataGrid.CellStyle>
<Style TargetType="DataGridCell">
<Setter Property="IsTabStop" Value="False"/>
<Setter Property="BorderThickness" Value="0"/>
<Setter Property="FocusVisualStyle" Value="{x:Null}"/>
</Style>
</DataGrid.CellStyle>
<DataGrid.RowStyle>
<Style TargetType="DataGridRow">
<Setter Property="IsTabStop" Value="False"/>
</Style>
</DataGrid.RowStyle>
我在 DataGrid 上添加了 PreviewKeyDown 事件,并且从每个单元格中删除了单元格选择。因此,选择似乎只在行上。
在后面的代码中,这是用 Space 打开链接的内容 / 输入:
private void DocumentTemplatesGrid_PreviewKeyDown(object sender, System.Windows.Input.KeyEventArgs e)
{
if (e.Key == System.Windows.Input.Key.Space || e.Key == System.Windows.Input.Key.Enter)
{
if (e.Source is DataGrid)
{
string navigationUri = ((e.Source as DataGrid).SelectedItem as Class).Name;
Process.Start(navigationUri);
}
e.Handled = true;
}
}
希望这就是您要找的,或者至少能提供一些帮助。
我有一个 Window
,上面几乎没有控件。其中之一是DataGrid
。我想实现一些非默认的焦点遍历。即:
DataGrid
是整体单站,不是每一行。- 当
DataGrid
获得焦点时,用户可以使用向上和向下键浏览行。 - 不允许使用左右键在列中导航。
- 第一列(也是唯一与导航相关的列)的类型为
DataGridHyperlinkColumn
。当用户点击 Space 或 Enter 键时,它会执行超链接。
目前我有以下代码:
<DataGrid x:Name="DocumentTemplatesGrid"
Grid.Row="2"
ItemsSource="{Binding Source={StaticResource DocumentTemplatesView}}"
IsReadOnly="True"
AutoGenerateColumns="False"
SelectionUnit="FullRow"
SelectionMode="Single"
TabIndex="1"
IsTabStop="True">
<DataGrid.CellStyle>
<Style TargetType="DataGridCell">
<Setter Property="IsTabStop" Value="False"/>
</Style>
</DataGrid.CellStyle>
<DataGrid.RowStyle>
<Style TargetType="DataGridRow">
<Setter Property="IsTabStop" Value="False"/>
</Style>
</DataGrid.RowStyle>
<DataGrid.Columns>
<DataGridHyperlinkColumn Header="Name"
Width="2*"
Binding="{Binding Name}"/>
<DataGridTextColumn Header="Description"
Width="5*"
Binding="{Binding Description}"/>
<DataGridTextColumn Header="Type"
Width="*"
Binding="{Binding Type}"/>
</DataGrid.Columns>
</DataGrid>
很遗憾,没有达到我的预期。 您能否解释一下如何实现这一目标?
所以,我给你的建议是:
<DataGrid x:Name="DocumentTemplatesGrid"
Grid.Row="2"
ItemsSource="{Binding Items}"
IsReadOnly="True"
AutoGenerateColumns="False"
SelectionMode="Single"
SelectionUnit="FullRow"
TabIndex="1"
IsTabStop="True"
PreviewKeyDown="DocumentTemplatesGrid_PreviewKeyDown">
<DataGrid.CellStyle>
<Style TargetType="DataGridCell">
<Setter Property="IsTabStop" Value="False"/>
<Setter Property="BorderThickness" Value="0"/>
<Setter Property="FocusVisualStyle" Value="{x:Null}"/>
</Style>
</DataGrid.CellStyle>
<DataGrid.RowStyle>
<Style TargetType="DataGridRow">
<Setter Property="IsTabStop" Value="False"/>
</Style>
</DataGrid.RowStyle>
我在 DataGrid 上添加了 PreviewKeyDown 事件,并且从每个单元格中删除了单元格选择。因此,选择似乎只在行上。
在后面的代码中,这是用 Space 打开链接的内容 / 输入:
private void DocumentTemplatesGrid_PreviewKeyDown(object sender, System.Windows.Input.KeyEventArgs e)
{
if (e.Key == System.Windows.Input.Key.Space || e.Key == System.Windows.Input.Key.Enter)
{
if (e.Source is DataGrid)
{
string navigationUri = ((e.Source as DataGrid).SelectedItem as Class).Name;
Process.Start(navigationUri);
}
e.Handled = true;
}
}
希望这就是您要找的,或者至少能提供一些帮助。