Fokussproblem mit WPF DataGrid
-
27-10-2019 - |
Frage
Ich benutze wpftoolkit DataGrid
Daten anzuzeigen; In meinem Anwendungsfall
- Der Benutzer klickt auf eine Zelle und betritt einen Wert (fangen Sie das Ereignis ein und setzen Sie den Fokus auf die
TextBox
) - Pressen eingeben
- Wert wird begangen
- Fokus verschiebt sich auf die nächste Zelle
Jetzt kann der Benutzer keinen Wert in die eingeben TextBox
(in dem DataGridCell
) Es sei denn, er klickt auf die Zelle. Das TextBox
kann Teil verschiedener Kontrollen sein (wie NumericUpDown
, Calendar
etc.).
Dieses Verhalten ähnelt Excel, aber ich kann den Fokus nicht auf die zugrunde liegenden verschieben TextBox
Da sind verschiedene andere Wrapper -Benutzersteuerungen in der vorhanden DataGridCell
(etwas wie DataGridCell
enthält MatrixCellContainer
, was beinhaltet MatrixCell
, was beinhaltet UpDown
Kontrolle)
Jeder Zeiger wird sehr hilfreich sein.
Aktualisieren:
Ich kann das erreichen, wonach ich suche DataGridCell_Selected
Ereignis wie folgt:
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]);
}
}
}
}
Aber ich weiß, dass es einen besseren Weg geben wird, dies zu erreichen!
Lösung 2
Schließlich habe ich mich damit entschieden -
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();
}
}
}
Ich suche immer noch nach einem besseren Ansatz ...
Andere Tipps
Wie setzen Sie sich auf die nächste Zelle konzentrieren?
WPF verfügt über zwei Versionen von Fokus, logischer Fokus und Tastaturfokus. Ich vermute, Sie verwenden myDataGridCell.Focus()
, was nur logischen Fokus legt.
myDataGridCell.Focus(); // Sets Logical Focus
Keyboard.Focus(myDataGridCell); // Sets Keyboard Focus