23

PreviewKeyUpアプリでそれぞれにイベントを添付しTextBox、押されたキーが Enter キーであるかどうかを確認してからアクションを実行する代わりにTextBox、 で Enter キーが押されたときに発生する DefaultAction イベントを含む の拡張バージョンを実装することにしましたTextBox

私がしたことは、基本的に次のようなTextBoxpublic eventから拡張する新しい Class を作成することでした: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#) の両方ではなく、宣言型コードのみを使用していますか?

4

5 に答える 5

45

テキストを選択するために 「グローバル」イベント ハンドラーをアタッチする、数か月前のこのブログ投稿をご覧ください。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を調べたほうがよい場合があります。私はこれがあなたが望むものを得ることができると信じています。

于 2009-05-03T08:11:31.037 に答える
-1
    private void txtBarcode_KeyDown(object sender, KeyEventArgs e)
    {
        string etr = e.Key.ToString();

        if (etr == "Return")
        {
            MessageBox.Show("You Press Enter");
        }
    }
于 2017-10-03T02:08:13.887 に答える