我的控件使用 WPF DataGrid。如果单击左上角的空标题,它将选择所有行。这是 DataGrid 的标准部分,不是我添加的任何内容。
但是,我的用户遇到了麻烦,因为这个“按钮”没有聚焦 DataGrid。我怎样才能解决这个问题?
System.Windows.Controls.DataGrid
编辑:这是我正在谈论的 DataGrid 按钮的 Excel 模拟。这不是一个真正的按钮,而是某种标题:
我的控件使用 WPF DataGrid。如果单击左上角的空标题,它将选择所有行。这是 DataGrid 的标准部分,不是我添加的任何内容。
但是,我的用户遇到了麻烦,因为这个“按钮”没有聚焦 DataGrid。我怎样才能解决这个问题?
System.Windows.Controls.DataGrid
编辑:这是我正在谈论的 DataGrid 按钮的 Excel 模拟。这不是一个真正的按钮,而是某种标题:
如果您查看Snoop,您会注意到此按钮。
因此,您可以将事件处理程序写入Click
此按钮的事件,并且在此处理程序中您可以聚焦网格。
private void myGrid_Loaded(object sender, RoutedEventArgs e)
{
DataGrid dg = sender as DataGrid;
Border border = VisualTreeHelper.GetChild(dg, 0) as Border;
ScrollViewer scrollViewer = VisualTreeHelper.GetChild(border, 0) as ScrollViewer;
Grid grid = VisualTreeHelper.GetChild(scrollViewer, 0) as Grid;
Button button = VisualTreeHelper.GetChild(grid, 0) as Button;
if (button != null && button.Command != null && button.Command == DataGrid.SelectAllCommand)
{
button.Click += new RoutedEventHandler(button_Click);
}
}
void button_Click(object sender, RoutedEventArgs e)
{
myGrid.Focus();
}
我使用了一种不依赖于控件的可视化树的替代方法:
在 XAML 中:
<DataGrid.CommandBindings>
<CommandBinding Command="SelectAll" Executed="MyGrid_SelectAll"/></DataGrid.CommandBindings>
在代码中:
private void MyGrid_SelectAll(object sender, ExecutedRoutedEventArgs e)
{
var myGrid = (DataGrid)sender;
myGrid.Focus();
if (myGrid.SelectedCells.Count == myGrid.Columns.Count * myGrid.Items.Count)
{
myGrid.SelectedCells.Clear();
}
else
{
myGrid.SelectAll();
}
e.Handled = true;
}
如果选择了所有单元格,这也使我能够实现取消全选。