ВПФ:TextBox с событием, которое срабатывает при нажатии клавиши Enter.

StackOverflow https://stackoverflow.com/questions/816334

  •  03-07-2019
  •  | 
  •  

Вопрос

Вместо того, чтобы прикреплять PreviewKeyUp событие с каждым TextBox в моем приложении и проверив, была ли нажатая клавиша клавишей Enter, а затем выполнить действие, я решил реализовать расширенную версию TextBox который включает событие DefaultAction, которое срабатывает при нажатии клавиши 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#)?

Это было полезно?

Решение

Посмотри на этот пост в блоге несколько месяцев назад, когда я прикрепил «глобальный» обработчик событий к 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, возможно, вам лучше изучить Прикрепленные события.Я верю, что это может дать вам то, что вы хотите.

Другие советы

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

Пример:

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

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

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

Следующий 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 Док

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

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

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

KeyDown="txtBarcode_KeyDown"

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top