#.net #wpf #focus #wpfdatagrid #datagridcell
#.net #wpf #фокус #wpfdatagrid #ячейка сетки данных
Вопрос:
Я использую WPFToolkit DataGrid
для отображения данных; В моем случае использования
- пользователь нажимает на ячейку и вводит значение (я перехватываю событие и устанавливаю фокус на
TextBox
) - Нажимает Enter
- Значение зафиксировано
- Фокус смещается на следующую ячейку
Теперь пользователь не может ввести какое-либо значение в 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();
}
}
}
Тем не менее, я все еще ищу лучший подход…