Domanda

Invece di allegare un evento PreviewKeyUp con ogni TextBox nella mia app e verificare se il tasto premuto era un tasto Invio e quindi eseguire un'azione, ho deciso di implementare esteso versione di un TextBox che include un evento DefaultAction che viene generato quando si preme un tasto Invio in un TextBox .

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

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

Uso quindi questa casella di testo personalizzata della mia app come tale (xaml):

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

Ora nella mia piccola esperienza che ho avuto nell'apprendimento del WPF mi sono reso conto che quasi la maggior parte delle volte c'è un "più freddo" (e si spera più facile) modo di implementare le cose

... quindi la mia domanda è, Come posso migliorare il controllo sopra? O forse c'è un altro modo in cui posso fare il controllo sopra? ... forse usando solo codice dichiarativo anziché sia ??dichiarativo (xaml) che procedurale (C #)?

È stato utile?

Soluzione

Dai un'occhiata a questo post sul blog da un qualche mese fa dove allego un gestore di eventi "globale" a TextBox.GotFocus per selezionare il testo.

Essenzialmente puoi gestire l'evento KeyUp nella tua 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 nella tua applicazione chiamerà il metodo TextBox_KeyUp man mano che gli utenti digitano.

Aggiorna

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

Per aggiungere un evento arbitrario come un tasto Invio, potresti fare meglio a guardare Eventi allegati . Credo che questo possa darti quello che vuoi.

Altri suggerimenti

Da quando questa domanda è stata posta, ora c'è una proprietà InputBindings su TextBox e altri controlli. Con questo, è possibile utilizzare una soluzione puramente XAML, anziché utilizzare controlli personalizzati. Assegnare KeyBinding per Return e Enter per puntare a un comando può fare questo.

Esempio:

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

Alcuni hanno menzionato che Enter non funziona sempre e Return può essere utilizzato su alcuni sistemi.

Quando l'utente preme il tasto Invio nella casella di testo, l'input nella casella di testo viene visualizzato in un'altra area dell'interfaccia utente (UI).

Il seguente XAML crea l'interfaccia utente, che è composta da StackPanel, TextBlock e 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 dietro crea il gestore eventi KeyDown. Se il tasto premuto è il tasto Invio, nel TextBlock viene visualizzato un messaggio.

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

Per maggiori informazioni leggi MSDN Doc

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

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

aggiungi evento in xaml nella specifica casella di testo o oggetto:

TastoGiù = " txtBarcode_KeyDown "

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top