WPF: TextBox, у которого есть событие, которое срабатывает при нажатии клавиши Enter - PullRequest
17 голосов
/ 03 мая 2009

Вместо того, чтобы прикреплять событие PreviewKeyUp с каждым TextBox в моем приложении и проверять, была ли нажатая клавиша клавишей Enter, а затем выполнить действие, я решил реализовать расширенную версию TextBox, которая включает действие по умолчанию событие, которое срабатывает при нажатии клавиши Enter в TextBox.

В основном я создал новый класс, который расширяется от TextBox с публичным событием DefaultAction, например:

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

Затем я использую это собственное текстовое поле из моего приложения, например (xaml):

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

Теперь, имея небольшой опыт в изучении WPF, я понял, что почти все время существует «более крутой» (и, надеюсь, более простой) способ реализации вещей

... поэтому мой вопрос, Как я могу улучшить вышеуказанный элемент управления? Или, может быть, есть другой способ, которым я могу выполнить вышеуказанный элемент управления? ... может быть, использовать только декларативный код вместо декларативного (xaml) и процедурного (C #)?

Ответы [ 5 ]

32 голосов
/ 03 мая 2009

Посмотрите это сообщение в блоге из нескольких месяцев назад, где я прикрепляю "глобальный" обработчик событий к TextBox.GotFocus, чтобы выделить текст.

По сути, вы можете обработать событие KeyUp в вашем классе приложений, например:

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

... и теперь каждый TextBox в вашем приложении будет вызывать метод TextBox_KeyUp, когда пользователи будут вводить их.

Обновление

Как вы указали в своем комментарии, это полезно, только если каждый TextBox должен выполнять один и тот же код.

Чтобы добавить произвольное событие, такое как нажатие клавиши Enter, вам лучше рассмотреть Attached Events . Я верю, что это может дать вам то, что вы хотите.

25 голосов
/ 21 декабря 2014

Поскольку этот вопрос был задан, в TextBox и других элементах управления теперь есть свойство InputBindings. При этом можно использовать чисто решение XAML, а не использовать пользовательские элементы управления. Назначение KeyBinding s для Return и Enter для указания на команду может сделать это.

Пример:

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

Некоторые упоминали, что Enter не всегда работает, и Return может использоваться в некоторых системах.

1 голос
/ 16 января 2018

Когда пользователь нажимает клавишу Enter в TextBox, ввод в текстовое поле появляется в другой области пользовательского интерфейса (* UI).

Следующий XAML создает пользовательский интерфейс, который состоит из StackPanel, TextBlock и 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>

Следующий код создает обработчик события KeyDown. Если нажатой клавишей является клавиша Enter, в текстовом блоке отображается сообщение.

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

Для получения дополнительной информации читайте MSDN Doc

0 голосов
/ 03 октября 2017

добавить событие в xaml в конкретное текстовое поле или объект:

KeyDown="txtBarcode_KeyDown"

0 голосов
/ 03 октября 2017
    private void txtBarcode_KeyDown(object sender, KeyEventArgs e)
    {
        string etr = e.Key.ToString();

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