Focus questione con WPF DataGrid
-
27-10-2019 - |
Domanda
Sto usando wpftoolkit DataGrid
per visualizzare i dati; Nel mio caso d'uso
- L'utente fa clic su una cella ed inserisce un valore (intrappolo l'evento e impostato il focus su
TextBox
) - Premi INVIO
- Il valore è impegnato
- Focus si sposta sulla cella successiva
Ora, l'utente non può inserire alcun valore in TextBox
(nel DataGridCell
) a meno che non scatta sulla cella. Il TextBox
può far parte di vari controlli (come NumericUpDown
, Calendar
eccetera.).
Questo comportamento è simile a Excel ma non sono in grado di spostare l'attenzione sulla sottostante TextBox
Poiché vari altri controlli degli utenti wrapper ci sono in DataGridCell
(qualcosa di simile a DataGridCell
contiene MatrixCellContainer
, che contiene MatrixCell
, che contiene UpDown
Controllo)
Qualsiasi puntatore sarà davvero utile.
Aggiornare:
Posso ottenere ciò che sto cercando maneggiando DataGridCell_Selected
Evento come questo:
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]);
}
}
}
}
Ma so che ci sarà un modo migliore per raggiungere questo obiettivo!
Soluzione 2
Finalmente mi sono sistemato con questo -
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();
}
}
}
Sto ancora cercando un approccio migliore però ...
Altri suggerimenti
Come stai impostando la messa a fuoco sulla cella successiva?
WPF ha due versioni di messa a fuoco, focus logico e focus della tastiera. Sospetto che tu stia usando myDataGridCell.Focus()
, che imposta solo l'obiettivo logico.
myDataGridCell.Focus(); // Sets Logical Focus
Keyboard.Focus(myDataGridCell); // Sets Keyboard Focus