2009-12-16 8 views
8

Sto meditando di fare il grande passo a WPF da WinForms per alcune delle mie app, attualmente sto lavorando al programma combinato di lettura di codici a barre/immissione di testo (moduli paziente sanitario).Equivalente a una proprietà di keypreview in WPF

Per essere in grado di elaborare i caratteri del codice a barre, mi affido alla proprietà Keypreview in WinForms (perché i codici a barre possono essere scansionati indipendentemente da quale controllo ha l'attenzione).

Ma non riesco a trovare una proprietà KeyPreview né in VS2008 né VS2010, per un'app WPF.

Esiste un approccio/soluzione alternativa per gestire i caratteri del codice a barre in WPF?

Rgrds Henry

risposta

3

WPF utilizza spumeggiante evento e tunneling. In altre parole, gli eventi viaggiano lungo l'albero degli elementi visivi. Alcuni eventi avranno un evento di anteprima corrispondente. Quindi MouseDown avrà un PreviewMouseDown a cui è possibile rispondere. Controlla this link e scorri verso il basso fino alla sezione Eventi di input di WPF.

+0

Grazie per il collegamento, dovrebbe essere possibile per me prendere l'evento PreviewKeyDown in qualche modo, esaminarlo ... –

5

utilizzare l'override nei propri controlli utente o controlli (questo è un override da UIElement)

protected override void OnPreviewKeyDown(System.Windows.Input.KeyEventArgs e) { 
    base.OnPreviewKeyDown(e); 
    } 

se si desidera visualizzare in anteprima il tasto basso su ogni elemento che tu non crei si può fare questo:

Label label = new Label(); 
label.PreviewKeyDown += new KeyEventHandler(label_PreviewKeyDown); 

e poi avere un gestore in questo modo: -

void label_PreviewKeyDown(object sender, KeyEventArgs e) { 

    } 

se si contrassegna l'evento come gestito (e.Handled = true;) interromperà l'evento KeyDown.

3

Grazie ha funzionato! L'unico problema era che sto codificando in VB not C#, ma l'idea di base vale. Neat per creare un'etichetta dal nulla e usarla per inserirti nel flusso di eventi.

Se qualcun altro è interessato della stessa soluzione, ma in VB per WPF, ecco il mio programma di test, riesce a gettare tutti 'a' caratteri digitati, non importa quale controllo è l'attivo:

Class MainWindow 

    Dim WithEvents labelFromThinAir As Label 

    Private Sub Window_Loaded(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles MyBase.Loaded 
     AddHandler MainWindow.PreviewKeyDown, AddressOf labelFromThinAir_PreviewKeyDown 
    End Sub 

    Private Sub labelFromThinAir_PreviewKeyDown(ByVal sender As Object, ByVal e As KeyEventArgs) 
     TextBox1.Text = e.Key ' watch 'em coming 
     If (44 = e.Key) Then e.Handled = True 
    End Sub 

End Class 

PS Questo è stato il mio primo post su StackOverflow, davvero un sito utile. Forse sarò in grado di rispondere ad alcune domande qui più avanti :-)

Problemi correlati