none
コントロールのIsPressed状態をEnterキーでも行う方法 RRS feed

  • 質問

  • Button、RadioButton、CheckBoxなどでスペースキーを押すとIsPressedで設定したスタイルが適用されますが、Enterキーでも同じ動作をさせることは可能でしょうか。
    2016年3月12日 8:54

回答

  • めんどくさいので継承でやってみる

    class ButtonEx : Button 
    {
        protected override void OnKeyDown(System.Windows.Input.KeyEventArgs e)
        {
            base.OnKeyDown(e);
            if (e.Key == System.Windows.Input.Key.Enter && IsFocused)
            {
                this.IsPressed=true;
            }
        }
        protected override void OnKeyUp(System.Windows.Input.KeyEventArgs e)
        {
            base.OnKeyDown(e);
            if (e.Key == System.Windows.Input.Key.Enter && IsFocused)
            {
                this.IsPressed = false;
            }
        }
    }
    class CheckBoxEx : CheckBox
    {
        protected override void OnKeyDown(System.Windows.Input.KeyEventArgs e)
        {
            base.OnKeyDown(e);
            if (e.Key == System.Windows.Input.Key.Enter && IsFocused)
            {
                this.IsPressed = true;
            }
        }
        protected override void OnKeyUp(System.Windows.Input.KeyEventArgs e)
        {
            base.OnKeyDown(e);
            if (e.Key == System.Windows.Input.Key.Enter && IsFocused)
            {
                this.IsPressed = false;
            }
        }
    }
    class RadioButtonEx : RadioButton
    {
        protected override void OnKeyDown(System.Windows.Input.KeyEventArgs e)
        {
            base.OnKeyDown(e);
            if (e.Key == System.Windows.Input.Key.Enter && IsFocused)
            {
                this.IsPressed = true;
            }
        }
        protected override void OnKeyUp(System.Windows.Input.KeyEventArgs e)
        {
            base.OnKeyDown(e);
            if (e.Key == System.Windows.Input.Key.Enter && IsFocused)
            {
                this.IsPressed = false;
            }
        }
    }


    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    2016年3月12日 9:59
  • gekkaさんのコードを参考に以下の方法で実現できました。

        public class ButtonEx : Button
        {
            protected override void OnKeyDown(KeyEventArgs e)
            {
                if (e.Key == Key.Enter && IsFocused)
                {
                    this.IsPressed = true;
                    return;
                }
    
                base.OnKeyDown(e);
            }
            protected override void OnKeyUp(KeyEventArgs e)
            {
                if (e.Key == Key.Enter && IsFocused)
                {
                    this.IsPressed = false;
                    base.OnKeyDown(e);
                    return;
                }
    
                base.OnKeyUp(e);
            }
        }
    

    2016年3月12日 11:15

すべての返信

  • こんにちは。

    スタイルの適用のみであれば以下のような方法でVisualStateManagerを使って制御する必要がありそうです。

    WPF Pressing Enter Key How to Make Button look pressed

    動作を含めた話であれば、キーのコンバートを行ったほうが楽そうですが。

    2016年3月12日 9:40
    モデレータ
  • スタイル、動作ともにスペースキーと同じように行いたいと思っています。

            private void button_PreviewKeyDown(object sender, System.Windows.Input.KeyEventArgs e)
            {
                if (e.Key == System.Windows.Input.Key.Enter)
                {
                    // 読み取り専用のため設定できないが
                    // 以下のようにEnterキーのイベントをスペースキーが押されたように振るまうイメージ
                    //e.Key = System.Windows.Input.Key.Space;
                }
            }
    

    >動作を含めた話であれば、キーのコンバートを行ったほうが楽そうですが

    上記のような方法があるのでしょうか?

    2016年3月12日 9:58
  • めんどくさいので継承でやってみる

    class ButtonEx : Button 
    {
        protected override void OnKeyDown(System.Windows.Input.KeyEventArgs e)
        {
            base.OnKeyDown(e);
            if (e.Key == System.Windows.Input.Key.Enter && IsFocused)
            {
                this.IsPressed=true;
            }
        }
        protected override void OnKeyUp(System.Windows.Input.KeyEventArgs e)
        {
            base.OnKeyDown(e);
            if (e.Key == System.Windows.Input.Key.Enter && IsFocused)
            {
                this.IsPressed = false;
            }
        }
    }
    class CheckBoxEx : CheckBox
    {
        protected override void OnKeyDown(System.Windows.Input.KeyEventArgs e)
        {
            base.OnKeyDown(e);
            if (e.Key == System.Windows.Input.Key.Enter && IsFocused)
            {
                this.IsPressed = true;
            }
        }
        protected override void OnKeyUp(System.Windows.Input.KeyEventArgs e)
        {
            base.OnKeyDown(e);
            if (e.Key == System.Windows.Input.Key.Enter && IsFocused)
            {
                this.IsPressed = false;
            }
        }
    }
    class RadioButtonEx : RadioButton
    {
        protected override void OnKeyDown(System.Windows.Input.KeyEventArgs e)
        {
            base.OnKeyDown(e);
            if (e.Key == System.Windows.Input.Key.Enter && IsFocused)
            {
                this.IsPressed = true;
            }
        }
        protected override void OnKeyUp(System.Windows.Input.KeyEventArgs e)
        {
            base.OnKeyDown(e);
            if (e.Key == System.Windows.Input.Key.Enter && IsFocused)
            {
                this.IsPressed = false;
            }
        }
    }


    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    2016年3月12日 9:59
  • まさしく求めていた内容になります。

    回答ありがとうございました。

    2016年3月12日 10:09
  • まさしく求めていた内容になります。

    動作はEnterキーのままだと思うのですが、これを求めていたのですか?
    Enterキー押下でチェックなどはされませんが。
    2016年3月12日 10:16
    モデレータ
  • Tak1waさんご指摘ありがとうございます。Buttonでプレス状態が出来ていたため動作のことを失念しておりました。

    KeyDown、KeyUpでIsPressedを制御してもEnterキーの動作のままのためKeyDown時にClickイベントがきてしまっておりました。

    2016年3月12日 10:58
  • gekkaさんのコードを参考に以下の方法で実現できました。

        public class ButtonEx : Button
        {
            protected override void OnKeyDown(KeyEventArgs e)
            {
                if (e.Key == Key.Enter && IsFocused)
                {
                    this.IsPressed = true;
                    return;
                }
    
                base.OnKeyDown(e);
            }
            protected override void OnKeyUp(KeyEventArgs e)
            {
                if (e.Key == Key.Enter && IsFocused)
                {
                    this.IsPressed = false;
                    base.OnKeyDown(e);
                    return;
                }
    
                base.OnKeyUp(e);
            }
        }
    

    2016年3月12日 11:15