アプリのPreviewKeyUp
イベントごとにTextBox
イベントをアタッチし、押されたキーがEnterキーであるかどうかを確認してからアクションを実行する代わりに、TextBox
には、TextBox
でEnterキーが押されたときに発生するDefaultActionイベントが含まれています。
私がしたことは、基本的に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
に接続してテキストを選択します。
基本的に、次のように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ソリューションを使用できます。コマンドを指すようにKeyBinding
とReturn
にEnter
sを割り当てると、これを行うことができます。
例:
<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 [〜#〜] Docを参照してください