2009-05-03 30 views
12

イベントをアプリケーション内にそれぞれTextBoxと添付し、押されたキーがEnterキーであるかどうかを確認してアクションを実行するのではなく、 EnterキーがTextBoxで押されたときに起動するDefaultActionイベントを含むTextBoxの拡張バージョンを実装します。WPF:Enterキーが押されたときに発生するイベントを持つTextBox

私は基本的に、このようなように、公共のイベント DefaultActionTextBoxから拡張する新しいクラスを作成してなかった

:私はそのような(XAML)のように私のアプリからこのカスタムテキストボックスを使用し

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); 
    } 
} 

今、私はWPFを学ぶに持っていた私の小さな経験で、私はほとんどの時間の中で最も「クーラー」(そして、できれば簡単に)WAがあることに気づきました
<Controls:DefaultTextBoxControl DefaultAction="DefaultTextBoxControl_DefaultAction"> 
</Controls:DefaultTextBoxControl> 

yを実装するには

...私の質問は、上記のコントロールを改善するにはどうすればよいですか?また、私は上記のコントロールを行うことができる別の方法がありますか? ...おそらく、宣言型(xaml)と手続き型(C#)の代わりに宣言型コードのみを使用していますか?

答えて

23

this blog postを参照してください。ここでは、「グローバル」イベントハンドラを添付してTextBox.GotFocusにテキストを選択します。

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メソッドを呼び出します:

は基本的に、あなたは、このように、あなたのアプリケーションクラスで KeyUpイベントを処理することができます。

更新

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

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

+0

を読んしかし、これで、あなたはどのように入力するキーが押されたときに何が起こるかを割り当てていますか?すべてのTextBoxが異なる何かをするので –

+0

ああ!私は答えを更新します。 –

+0

ベスト・アンサー! –

12

この質問が尋ねられたので、TextBoxなどのコントロールにはInputBindingsというプロパティが追加されました。これにより、カスタムコントロールを使用するのではなく、純粋にXAMLソリューションを使用できます。 ReturnEnterKeyBindingを割り当てると、コマンドを指すことができます。

例:

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

一部はEnterが常に動作しないことを言及している、とReturnは、いくつかのシステムで使用することができます。

+0

私はそれを試したのでいいですが、これは動作しません。ボタンを使用すると、myコマンドはテキストボックスで起動します。私はSource = {StaticResource viewModel}を追加しましたが、何も動作しません。 –

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

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

コードの説明を入力する必要があります – Ibo

0

は、特定のテキストボックスまたはオブジェクトへxamlにイベントを追加:

KeyDown="txtBarcode_KeyDown"

0

をユーザーがテキストボックスで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ドク

関連する問題