Проблема фокусировки с WPF DataGrid
-
27-10-2019 - |
Вопрос
Я использую wpftoolkit DataGrid
отобразить данные; В моем случае использования
- Пользователь нажимает на ячейку и вводит значение (я поймаю событие и устанавливаю фокус на
TextBox
) - Нажимает Enter
- Стоимость совершена
- Фокус переключается на следующую ячейку
Теперь пользователь не может ввести какое -либо значение в TextBox
(в DataGridCell
), если он не нажимает на камеру. А TextBox
может быть частью различных элементов управления (например NumericUpDown
, Calendar
так далее.).
Такое поведение похоже на 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
Наконец я устроился с этим -
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();
}
}
}
Все еще ищу лучший подход, хотя ...
Другие советы
Как вы уделяете фокус на следующую ячейку?
У WPF есть две версии фокуса, логический фокус и фокус клавиатуры. Я подозреваю, что вы используете myDataGridCell.Focus()
, который только устанавливает логический фокус.
myDataGridCell.Focus(); // Sets Logical Focus
Keyboard.Focus(myDataGridCell); // Sets Keyboard Focus