WPF:Enterキーが押されたときに発生するイベントを持つTextBox
-
03-07-2019 - |
質問
アプリの各 TextBox
に PreviewKeyUp
イベントを添付し、押されたキーがEnterキーであるかどうかを確認してからアクションを実行する代わりに、拡張を実装することにしました TextBox
でEnterキーが押されたときに起動するDefaultActionイベントを含む TextBox
のバージョン。
基本的には、 TextAction
からパブリックイベント 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
にアタッチして、テキストを選択しました。
本質的に、次のようにAppクラスで 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キーを押すなどの任意のイベントを追加するには、添付イベント。これであなたが望むものが得られると思います。
他のヒント
この質問が尋ねられて以来、TextBoxesおよびその他のコントロールに InputBindings
プロパティがあります。これにより、カスタムコントロールを使用するのではなく、純粋にXAMLソリューションを使用できます。 Return
および Enter
に KeyBinding
を割り当ててコマンドを指すようにできます。
例:
<TextBox Text="Test">
<TextBox.InputBindings>
<KeyBinding Command="{Binding SomeCommand}" Key="Return" />
<KeyBinding Command="{Binding SomeCommand}" Key="Enter" />
</TextBox.InputBindings>
</TextBox>
Enter
が常に機能するとは限らず、一部のシステムでは Return
が使用される場合があると言及している人もいます。
ユーザーがTextBoxでEnterキーを押すと、テキストボックスの入力がユーザーインターフェイス(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 ドキュメント
private void txtBarcode_KeyDown(object sender, KeyEventArgs e)
{
string etr = e.Key.ToString();
if (etr == "Return")
{
MessageBox.Show("You Press Enter");
}
}
特定のテキストボックスまたはオブジェクトへの xaml
のイベントの追加:
KeyDown =&quot; txtBarcode_KeyDown&quot;