6 Stimmen

Überschreiben Sie die Eingabetaste, aber behalten Sie das Standardverhalten für andere Tasten in einer WPF-Datentabelle

Es stört mich wirklich, dass das Drücken der Eingabetaste in einem Datagrid die Auswahl um ein Element nach unten verschiebt, ich möchte in der Lage sein zu entscheiden, was es in einem normalen Keydown-Ereignis tut.

Also, was ich tat, war eine neue Klasse erstellen, die DataGrid erbt und überschreiben das OnKeyDown-Ereignis und verwenden Sie, dass als meine Datagrid.

Dies schafft eine ganze Reihe neuer Probleme, da ich anscheinend alle anderen Tastendrücke (Pfeiltastennavigation, Umschalt+Pfeiltastenauswahl, pgup/pgdn, usw.) neu schreiben muss. Ich habe versucht, es zu hacken, aber es scheint einfach so sinnlos, Zeit damit zu verbringen, etwas neu zu schreiben, das bereits geschrieben wurde und wahrscheinlich besser ist als das, was ich mir ausdenke.

Also, wie kann ich die Enter-Taste tun, was ich will, ohne mit den anderen Standard-Tastaturbindungen der Datentabelle durcheinander zu bringen?

Vielen Dank im Voraus

12voto

Robin Maben Punkte 20864

Sie müssen eine PreviewKeyDown Handler für das Datagrid und prüfen Sie dann manuell, ob der Schlüsselwert Key.Enter .

Wenn ja, setzen Sie e.Handled = true .

4voto

anthonyvd Punkte 7109

Prüfen Sie einfach, ob die gedrückte Taste die Eingabetaste ist, wenn nicht, rufen Sie den Basis-Ereignishandler für KeyDown auf (etwas wie base.OnKeyDown(sender, args); )

3voto

Hunter Punkte 2260

Eine viel einfachere Umsetzung. Die Idee ist, das Keydown-Ereignis zu erfassen und wenn die Taste "Enter" ist, zu entscheiden, in welche Richtung Sie gehen wollen.
FocusNavigationDirection hat mehrere Eigenschaften, anhand derer der Fokus geändert werden kann.

/// <summary>
/// On Enter Key, it tabs to into next cell.
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void LiquidityInstrumentViewsGrid_OnPreviewKeyDown(object sender, KeyEventArgs e)
{
    var uiElement = e.OriginalSource as UIElement;
    if (e.Key == Key.Enter && uiElement != null)
    {
        e.Handled = true;
        uiElement.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
    }
}

1voto

epox Punkte 6406

PreviewKeyDown con Handled = true ist eine schlecht Lösung. Es würde aufhören, die Taste in der Tunnelling-Phase zu verarbeiten, und das Tastenereignis nie aufblasen. Einfach ausgedrückt, es würde alle Enter-Tastendrücke verschlucken. Das bedeutete, dass obere Panels, würde nie bekommen KeyDown Ereignis (stellen Sie sich vor, dass Ihr Fenster bei ENTER etwas annimmt KeyDown ...).

Die richtige Lösung ist das, was Anthony vorgeschlagen hat: die Handled = false damit es weiter sprudelt - und überspringen Sie die Behandlung von Enter im DataGrid

public class DataGridWithUnhandledReturn : DataGrid
{
    /// <inheritdoc/>
    protected override void OnKeyDown(KeyEventArgs e)
    {
        if (e.Key == Key.Return && e.KeyboardDevice.Modifiers == ModifierKeys.None)
        {
            return;
        }

        base.OnKeyDown(e);
    }
}

0voto

mservidio Punkte 12442

Wenn es ähnlich wie bei Winforms funktioniert, für die Tastendrücke, die Sie nicht behandeln, als Flagge die behandelt als false, und es wird die Tastendruck weitergeben. KeyEventArgs-Klasse

Handled Liest oder setzt einen Wert, der den aktuellen Status der Ereignisbehandlung für ein weitergeleitetes Ereignis auf dem Weg dorthin angibt. (Geerbt von RoutedEventArgs.)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X