Проблема с фокусом с сеткой данных Wpf

#.net #wpf #focus #wpfdatagrid #datagridcell

#.net #wpf #фокус #wpfdatagrid #ячейка сетки данных

Вопрос:

Я использую WPFToolkit DataGrid для отображения данных; В моем случае использования

  1. пользователь нажимает на ячейку и вводит значение (я перехватываю событие и устанавливаю фокус на TextBox )
  2. Нажимает Enter
  3. Значение зафиксировано
  4. Фокус смещается на следующую ячейку

Теперь пользователь не может ввести какое-либо значение в TextBox DataGridCell ), если он не нажмет на ячейку. TextBox Может быть частью различных элементов управления (таких как NumericUpDown , Calendar и т.д.).

Это поведение похоже на Excel, но я не могу переключить фокус на базовый, TextBox поскольку в DataGridCell есть различные другие пользовательские элементы управления оболочки (что-то вроде DataGridCell contains 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]);
          }
    }
    }
 }
  

Но я знаю, что будет лучший способ добиться этого!

Ответ №1:

Как вы устанавливаете фокус на следующую ячейку?

WPF имеет две версии фокуса: логический фокус и фокус клавиатуры. Я подозреваю, что вы используете myDataGridCell.Focus() , который устанавливает только логический фокус.

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

Комментарии:

1. На самом деле я нигде не устанавливаю фокус в коде, это поведение DataGrid по умолчанию для переключения фокуса на клавишу ввода (хотя я не уверен). Я также проверил это в обработчике событий DataGridCell_Selected, и оба isFocused и IsKeyboardFocused для ячейки сбываются.

Ответ №2:

Наконец-то я согласился с этим —

 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();
        }
    }
}
  

Тем не менее, я все еще ищу лучший подход…