我的控件使用WPF DataGrid。如果您单击左上角的空头,则会选择所有行。这是DataGrid的标准部分,而不是我添加的任何东西。WPF DataGrid左上角选择所有标题按钮不会聚焦网格
但是,我的用户遇到麻烦,因为这个'按钮'不会聚焦DataGrid。我怎样才能解决这个问题?
System.Windows.Controls.DataGrid
编辑:这是DataGrid的按键我谈论的Excel的模拟。这是不是一个真正的按钮,但有些类型的标题:
我的控件使用WPF DataGrid。如果您单击左上角的空头,则会选择所有行。这是DataGrid的标准部分,而不是我添加的任何东西。WPF 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;
}
这也让我有能力实现如果所有单元格都被选中,全部取消选择。
更好的解决方案我会说,但我想也许你应该删除额外的代码来取消选择单元格,因为它不是OP所询问的。没有这一点,你会得到一个非常明确和简单的答案,比接受的答案更具说明性。 从你的回答中我不清楚的一件事是,即使你设置e.Handled为false,你仍然必须执行myGrid.SelectAll()以使其工作。 –
哪个按钮? – iltzortz