我的控件使用了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;
}