WPF: текстовое поле, которое имеет событие, которое срабатывает при нажатии клавиши ввода
Вместо прикрепления события PreviewKeyUp
с каждым TextBox
в моем приложении и проверки того, был ли нажатый ключ клавишей Enter, а затем выполните действие, я решил реализовать расширенную версию TextBox
, которая включает в себя DefaultAction событие, которое срабатывает при нажатии клавиши ввода в 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) и процедурного (С#)?
Ответы
Ответ 1
Взгляните на этот пост в блоге через несколько месяцев назад, где я прикрепляю "глобальный" обработчик событий к TextBox.GotFocus
, чтобы выбрать текст.
По существу вы можете обрабатывать событие KeyUp
в своем классе App, например:
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. Я верю, что это может сделать то, что вы хотите.
Ответ 2
Поскольку этот вопрос задан, в TextBoxes и других элемента управления теперь есть свойство InputBindings
. При этом вместо использования пользовательских элементов управления можно использовать чисто решение XAML. Назначение KeyBinding
для Return
и Enter
для указания на команду может сделать это.
Пример:
<TextBox Text="Test">
<TextBox.InputBindings>
<KeyBinding Command="{Binding SomeCommand}" Key="Return" />
<KeyBinding Command="{Binding SomeCommand}" Key="Enter" />
</TextBox.InputBindings>
</TextBox>
Некоторые упомянули, что Enter
не всегда работает, а Return
может использоваться в некоторых системах.
Ответ 3
private void txtBarcode_KeyDown(object sender, KeyEventArgs e)
{
string etr = e.Key.ToString();
if (etr == "Return")
{
MessageBox.Show("You Press Enter");
}
}
Ответ 4
добавить событие в xaml
в конкретное текстовое поле или объект:
KeyDown="txtBarcode_KeyDown"
Ответ 5
Когда пользователь нажимает клавишу 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, в TextBlock отображается сообщение.
private void OnKeyDownHandler(object sender, KeyEventArgs e)
{
if (e.Key == Key.Return)
{
textBlock1.Text = "You Entered: " + textBox1.Text;
}
}
Для получения дополнительной информации прочитайте MSDN Doc