2009-05-03 15 views
12

Invece di collegare un evento PreviewKeyUp con ogni nella mia app e controllare se il tasto premuto era un tasto Invio e quindi eseguire un'azione, ho deciso di implementare la versione estesa di un TextBox che include un evento DefaultAction che si attiva quando viene premuto un tasto Invio in un TextBox.WPF: un TextBox che ha un evento che si attiva quando si preme il tasto Invio

Quello che ho fatto è stato fondamentalmente creare una nuova classe che si estende da TextBox con un evento pubblico DefaultAction, come ad esempio:

public class DefaultTextBoxControl:TextBox 
{ 
    public event EventHandler<EventArgs> DefaultAction = delegate { }; 

    public DefaultTextBoxControl() 
    { 
     PreviewKeyUp += DefaultTextBoxControl_PreviewKeyUp; 
    } 

    void DefaultTextBoxControl_PreviewKeyUp(object sender, System.Windows.Input.KeyEventArgs e) 
    { 
     if (e.Key != Key.Enter) 
     { 
      return; 
     } 
     DefaultAction(this, EventArgs.Empty); 
    } 
} 

Ho quindi utilizzare questo campo testo personalizzato dal mio app come tale (XAML):

<Controls:DefaultTextBoxControl DefaultAction="DefaultTextBoxControl_DefaultAction"> 
</Controls:DefaultTextBoxControl> 

Ora nella mia piccola esperienza che ho avuto in apprendimento WPF mi sono reso conto che quasi la maggior parte del tempo c'è un "più fresco" (e, si spera più facile) wa y per implementare le cose

... quindi la mia domanda è, Come posso migliorare il controllo di cui sopra? O forse c'è un altro modo in cui posso fare il controllo di cui sopra? ... magari usando solo il codice dichiarativo invece di entrambi dichiarativo (xaml) e procedurale (C#)?

risposta

23

Dai un'occhiata a this blog post da alcuni mesi indietro in cui allego un gestore di eventi "globale" a TextBox.GotFocus per selezionare il testo.

In sostanza si può gestire l'evento KeyUp nella classe App, in questo modo:

protected override void OnStartup(StartupEventArgs e) 
{ 
    EventManager.RegisterClassHandler(typeof(TextBox), 
     TextBox.KeyUpEvent, 
     new System.Windows.Input.KeyEventHandler(TextBox_KeyUp)); 

    base.OnStartup(e); 
} 

private void TextBox_KeyUp(object sender, System.Windows.Input.KeyEventArgs e) 
{ 
    if (e.Key != System.Windows.Input.Key.Enter) return; 

    // your event handler here 
    e.Handled = true; 
    MessageBox.Show("Enter pressed"); 
} 

... e ora ogni TextBox nell'applicazione chiamerà il metodo TextBox_KeyUp come gli utenti digitano in loro.

Aggiornamento

Come hai sottolineato nel tuo commento, questo è utile solo se ogni TextBox necessità di eseguire lo stesso codice.

Per aggiungere un evento arbitrario come una pressione di tasto Invio, è preferibile cercare Attached Events. Credo che questo possa farti ottenere quello che vuoi.

+0

Ma con questo, come si fa assegnare cosa succede quando si preme il tasto di invio? perché ogni TextBox fa qualcosa di diverso –

+0

Oh! Aggiornerò la risposta –

+0

la migliore risposta! –

12

Dato che è stata posta questa domanda, esiste ora una proprietà InputBindings su TextBox e altri controlli. Con questo, è possibile utilizzare una soluzione puramente XAML anziché utilizzare controlli personalizzati. Assegnazione di KeyBinding s per Return e a un comando può fare ciò.

Esempio:

<TextBox Text="Test"> 
    <TextBox.InputBindings> 
     <KeyBinding Command="{Binding SomeCommand}" Key="Return" /> 
     <KeyBinding Command="{Binding SomeCommand}" Key="Enter" /> 
    </TextBox.InputBindings> 
</TextBox> 

alcuni hanno detto che Enter non sempre funziona, e Return può essere utilizzato in alcuni sistemi.

+0

Sembra carino, quindi l'ho provato ma non funziona. Usando un pulsante il mio comando viene attivato con la casella di testo che non ha. Ho persino aggiunto una fonte = {StaticResource viewModel} ma non funziona. –

0
private void txtBarcode_KeyDown(object sender, KeyEventArgs e) 
    { 
     string etr = e.Key.ToString(); 

     if (etr == "Return") 
     { 
      MessageBox.Show("You Press Enter"); 
     } 
    } 
+0

È necessario fornire spiegazioni sul codice – Ibo

0

evento aggiuntivo nel xaml alla casella di testo o oggetto specifico:

KeyDown="txtBarcode_KeyDown"

0

Quando l'utente preme il tasto Invio nel controllo TextBox, l'ingresso nella casella di testo appare in un'altra zona della interfaccia utente (UI).

Il seguente XAML crea l'interfaccia utente, che consiste in uno StackPanel, un TextBlock e un TextBox.

<StackPanel> 
    <TextBlock Width="300" Height="20"> 
    Type some text into the TextBox and press the Enter key. 
    </TextBlock> 
    <TextBox Width="300" Height="30" Name="textBox1" 
      KeyDown="OnKeyDownHandler"/> 
    <TextBlock Width="300" Height="100" Name="textBlock1"/> 
</StackPanel> 

Il seguente codice sottostante crea il gestore di eventi KeyDown. Se il tasto premuto è il tasto Invio, un messaggio viene visualizzato in TextBlock.

private void OnKeyDownHandler(object sender, KeyEventArgs e) 
{ 
    if (e.Key == Key.Return) 
    { 
     textBlock1.Text = "You Entered: " + textBox1.Text; 
    } 
} 

Per maggiori informazioni leggi MSDN Doc