【问题标题】:WPF DataGrid top left select all header button doesn't focus the gridWPF DataGrid 左上角选择所有标题按钮不聚焦网格
【发布时间】:2013-01-08 11:51:35
【问题描述】:

我的控件使用 WPF DataGrid。如果单击左上角的空标题,它将选择所有行。这是 DataGrid 的标准部分,不是我添加的任何内容。

但是,我的用户遇到了麻烦,因为这个“按钮”没有聚焦 DataGrid。我该如何解决这个问题?

System.Windows.Controls.DataGrid

编辑:这是我正在谈论的 DataGrid 按钮的 Excel 模拟。这不是一个真正的按钮,而是某种标题:

【问题讨论】:

    标签: c# .net wpf datagrid


    【解决方案1】:

    如果您查看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();           
    }
    

    【讨论】:

      【解决方案2】:

      我使用了一种不依赖于控件的可视化树的替代方法:

      在 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() 才能使其工作
      猜你喜欢
      • 2016-08-12
      • 2019-07-30
      • 1970-01-01
      • 2014-04-06
      • 2014-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多