WPF: OnKeyDown () non viene chiamato per la chiave di spazio nel controllo derivata da TextBox WPF

In un’applicazione WPF, ho un controllo che ho derivato da TextBox come questo:

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

Il metodo OnKeyDown non viene chiamato quando si immette uno spazio nel TextBox, né quando si colpisce Backspace, ma si triggers per altri input compresi i normali caratteri stampabili (ad esempio ‘a’) e i tasti modificatori (ad esempio).

Sto usando questo controllo con IsReadOnly impostato su true in modo da poter visualizzare testo selezionabile e non modificabile. Il controllo utilizzato in DataGrid di WPFToolkit, e voglio che gli eventi KeyDown si propaghino sulla griglia di dati, anche se il SelectableTextBlock è focalizzato, motivo per cui sto usando un controllo personalizzato per contrassegnare esplicitamente l’evento come non gestito.

Il problema è che l’evento non riesce nemmeno a controllarlo per determinate chiavi. Non posso semplicemente utilizzare OnPreviewKeyDown nel DataGrid per aggirare questo, dal momento che voglio altri controlli utilizzati nella griglia di dati per ingoiare lo spazio KeyDown evento.

Qualcuno sa come posso far propagare l’evento KeyDown per lo Space Key?

Grazie.

L’evento PreviewKeyDown esiste esattamente per questo genere di cose.

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

Il tuo gestore KeyDown non riceverà mai l’evento KeyDown per la barra spaziatrice.

Sembra che il problema sia che l’evento key-down dello spazio (e del backspace, ecc.) Viene gestito già all’interno del TextBox, prima che raggiunga il mio controllo derivato. Presumo come parte del processo di composizione del testo, come Wim ha pubblicato.

Per ovviare al problema, ho aggiunto un gestore che riceverà l’evento key down anche se è già stato gestito e imposta il suo membro Handled su false, per consentirgli di continuare a girare normalmente. Nell’esempio seguente lo fa solo per le chiavi dello spazio, ma nel mio caso dovrò farlo per qualsiasi evento chiave che davvero non voglio maneggiare nel mio SelectedableTextBlock, dato che non so quali eventi chiave i genitori potrebbero essere interessati a ancora.

 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; } } ... } 

Sono ovviamente ancora interessato se qualcuno ha una soluzione migliore …

Grazie, E.

Ho avuto questo problema con spazi ed eventi una volta in una casella di testo. Gli eventi NON sono triggersti ​​solo quando aggiungi o rimuovi uno spazio?

Questo è quello che ho ottenuto come risposta: ( http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/446ec083-04c8-43f2-89dc-1e2521a31f6b )

Poiché alcuni IME trattano il tasto dello spazio bianco come parte del processo di composizione del testo, è per questo che viene utilizzato da Avalon per riportare il testo composto e corretto tramite l’evento TextInput.

Potrei essere completamente fuori dal campo di applicazione ma leggere questo thread emmideatly mi ha fatto pensare a quel problema che ho avuto una volta.

Cordiali saluti, Wim

Ricavare un argomento, RestrictKeysTextBox da TextBox.

 public class RestrictKeysTextBox : TextBox { .... } 

Sostituisci l’evento OnPreviewKeyDown in RestrictKeysTextBox.

Metti la logica in questo override in questo modo:

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

Associa l’istanza di RestrictKeysTextBox al tuo DataGrid.

Questo dovrebbe funzionare senza sovrascrivere OnPreviewKeyDown nel DataGrid ed eliminare i problemi associati.