WPF: OnKeyDown (), die nicht für die Leertaste in der Steuerung aufgerufen wird abgeleitet von WPF TextBox

StackOverflow https://stackoverflow.com/questions/1458748

  •  12-09-2019
  •  | 
  •  

Frage

In einer WPF-Anwendung, habe ich eine Kontrolle, die ich von TextBox wie folgt abgeleitet haben:

public class SelectableTextBlock : TextBox
{
    protected override void OnKeyDown(KeyEventArgs e)
    {
        base.OnKeyDown(e);
        e.Handled = false;
    }
}

Die OnKeyDown Methode aufgerufen wird, nicht, wenn ein Raum in das Textfeld einzugeben, noch beim Rück Schlagen, aber er Feuer für anderen Eingang einschließlich normalen druckbare Zeichen (z.B. ‚A‘) und Zusatztasten (z).

Ich verwende diese Kontrolle mit IsReadOnly auf true eingestellt, damit ich frei wählbar, uneditable Text anzeigen kann. Die Steuerung verwendete innerhalb WPFToolkit des Datagrid, und ich mag KeyDown- Ereignisse das Datenraster zu verbreiten, auch wenn die SelectableTextBlock Fokus hat, weshalb ich eine benutzerdefinierte Steuerung verwenden ausdrücklich das Ereignis als nicht behandelte zu markieren.

Das Problem ist, dass das Ereignis nicht einmal, es zu meiner Kontrolle für bestimmte Schlüssel. Ich kann einfach nicht in dem Datagrid verwenden OnPreviewKeyDown das zu umgehen, da ich im Datenraster verwendet, um andere Steuerelemente tun will, den Raum zu schlucken KeyDown-Ereignis.

Wer weiß, wie ich das KeyDown-Ereignis für die Leertaste erhalten kann propagieren bis?

Danke.

War es hilfreich?

Lösung 2

Es scheint, das Problem ist, dass der Raum (und Backspace etc.) Taste gedrückt Ereignis innerhalb des TextBox bereits behandelt wird, bevor es bis zu meiner abgeleiteten Steuer Blasen. Ich gehe davon als Teil der Textkomposition Prozess, wie Wim geschrieben.

Um dies zu umgehen, ich habe einen Handler hinzugefügt, die den Schlüssel nach unten Ereignis empfangen wird selbst wurde bereits behandelt worden ist, und setzt seine behandelter Mitglied falsch, es zu ermöglichen, die normalerweise auf sprudeln zu tragen. Im Beispiel unten, damit er tut genau dies für den Raumschlüssel, aber in meinem Fall werde ich muß es dies für alle wichtigen Veranstaltungen machen tut, dass I wirklich nicht in meinem SelectedableTextBlock behandelt werden soll, wie ich nicht wissen, welche Schlüsselereignisse Eltern könnten in noch interessiert.

public class SelectableTextBlock : TextBox
{
    public SelectableTextBlock() : base()
    {
        this.AddHandler(SelectableTextBlock.KeyDownEvent, new RoutedEventHandler(HandleHandledKeyDown), true);
    }

    public void HandleHandledKeyDown(object sender, RoutedEventArgs e)
    {
        KeyEventArgs ke = e as KeyEventArgs;
        if (ke.Key == Key.Space)
        {
            ke.Handled = false;
        }
    }
    ...
}

Ich bin natürlich immer noch interessiert, wenn jemand eine bessere Lösung hat ...

Danke, E.

Andere Tipps

Das PreviewKeyDown Ereignis existiert genau für diese Art der Sache.

private void spacebarHandler_PreviewKeyDown(object sender, KeyEventArgs e)
{
    if (e.Key == Key.Space)
        e.Handled = true;
}

Ihre KeyDown-Handler wird nie das KeyDown-Ereignis für Leer erhalten.

Ich hatte dieses Problem mit Leerzeichen und Ereignissen einmal in einer Textbox. Werden die Ereignisse nicht nur ausgelöst, wenn Sie hinzufügen oder ein Leerzeichen entfernen?

Das ist das, was ich als Antwort bekam: ( http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/446ec083-04c8-43f2-89dc-1e2521a31f6b )

Da einige IMEs Leerzeichen Tastendruck als Teil der Textkomposition Verfahrens behandeln, das ist, warum es nach oben von Avalon isst richtig Compositing Text durch TextInput- Ereignis zu melden.

kann ich völlig den Umfang aus, aber das Lesen dieses Themas emmideatly mich diese Frage denken ließ ich einmal hatte.

Mit freundlichen Grüßen, Wim

Man leitet ein Mitspracherecht, RestrictKeysTextBox von TextBox.

public class RestrictKeysTextBox : TextBox
{
    ....
}

Überschreiben Sie die OnPreviewKeyDown Ereignis im RestrictKeysTextBox.

Put Logik in dieser Überschreibung wie folgt aus:

if (e.Key == Key.Space)
{
    e.Handled = true;
}

Binden Sie die Instanz des RestrictKeysTextBox zu Ihrem Datagrid.

Das soll ohne arbeiten, um die OnPreviewKeyDown im Datagrid überschreibt und die damit verbundenen Probleme beseitigen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top