web-dev-qa-db-ja.com

WPF:Enterキーが押されたときに発生するイベントを持つTextBox

アプリの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#)の両方ではなく、宣言型コードのみを使用していますか?

18
Andreas Grech

数か月前の このブログ投稿 を見て、「グローバル」イベントハンドラーを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");
}

...そして、ユーザーが入力すると、アプリケーション内のすべてのTextBoxTextBox_KeyUpメソッドを呼び出します。

更新

コメントで指摘したように、これはすべてのTextBoxが同じコードを実行する必要がある場合にのみ役立ちます。

Enterキーを押すなどの任意のイベントを追加するには、 添付イベント を調べた方がよい場合があります。私はこれがあなたが望むものを手に入れることができると信じています。

34
Matt Hamilton

この質問が行われたため、TextBoxesおよびその他のコントロールにInputBindingsプロパティがあります。これにより、カスタムコントロールを使用するのではなく、純粋にXAMLソリューションを使用できます。コマンドを指すようにKeyBindingReturnEntersを割り当てると、これを行うことができます。

例:

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

Enterが常に機能するとは限らず、一部のシステムではReturnが使用される可能性があると述べた人もいます。

26
Cyral

ユーザーが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を参照してください

1
Ali Asad