Wpf DataGrid的焦点问题

时间:2011-10-20 14:22:56

标签: .net wpf focus wpfdatagrid datagridcell

我正在使用WPFToolKit DataGrid来显示数据;在我的用例中

  1. 用户点击一个单元格并输入一个值(我捕获该事件并将焦点设置为TextBox
  2. 按下
  3. 提交的价值
  4. 焦点转移到Next Cell
  5. 现在,用户无法在TextBoxDataGridCell)中输入任何值,除非他点击该单元格。 TextBox可以是各种控件的一部分(例如NumericUpDownCalendar等。)

    此行为与Excel类似但我无法将焦点转移到底层TextBox,因为DataGridCell中包含各种其他包装器用户控件(类似DataGridCell的内容) MatrixCellContainer,其中包含MatrixCell,其中包含UpDown控件)

    任何指针都非常有用。

    更新

    通过像这样处理DataGridCell_Selected事件,我可以实现我想要的目标:

    private void DataGridCell_Selected(object sender, RoutedEventArgs e)
    {
            Microsoft.Windows.Controls.DataGridCell dataGridCell = 
                   sender as Microsoft.Windows.Controls.DataGridCell;
    
        // ToDo: This is a very bad hack; 
        // should be replaced by some proper technique
        if (dataGridCell != null)
        {
            NumericUpDownBase<int>[] IntUpDownControls = 
                dataGridCell.GetChildrenOfType<NumericUpDownBase<int>>();
            if (IntUpDownControls.Count() != 0)
            {
                IntUpDownControls[0].Focus();
                //Keyboard.Focus(IntUpDownControls[0]);
            }
        else
        {
            NumericUpDownBase<double>[] DblUpDownControls = 
                    dataGridCell.GetChildrenOfType<NumericUpDownBase<Double>>();
             if (DblUpDownControls.Count() != 0)
             {
                     DblUpDownControls[0].Focus();
                     //Keyboard.Focus(DblUpDownControls[0]);
              }
        }
        }
     }
    

    但我知道会有更好的方法来实现这个目标!

2 个答案:

答案 0 :(得分:2)

你如何将焦点设置到下一个单元格?

WPF有两个版本的焦点,逻辑焦点和键盘焦点。我怀疑你使用的是myDataGridCell.Focus(),它只设置了Logical Focus。

myDataGridCell.Focus();         // Sets Logical Focus
Keyboard.Focus(myDataGridCell); // Sets Keyboard Focus

答案 1 :(得分:0)

最后我决定这个 -

private void HandleCellSelected(object sender, RoutedEventArgs e)
{
    DataGridCell dataGridCell = sender as DataGridCell;
    if (dataGridCell != null)
    {
        TextBox[] textboxcontrols = dataGridCell.GetChildrenOfType<TextBox>();
        if (textboxcontrols.Count() != 0)
        {
            textboxcontrols[0].Focus();
        }
    }
}

仍在寻找更好的方法......