2016年11月25日 星期五

[VS]取消textbox的輸入狀態

在form中加入了快捷鍵的功能後在textBox中輸入文字竟然也會觸發快鍵
難怪快捷鍵都設定成ctrl+blablabla
但是我就是為了方便程式運作不用用滑鼠按按鈕,所以快捷鍵只想按鍵盤上的一個鍵,因此在textbox輸入時要阻止form的快捷鍵運作。

大致的做法是在textbox獲得關注@@?的時候解除form的快捷鍵,當text又取得關注的時候再將form的快捷鍵恢復。

but有個小問題是,要讓textbox的輸入狀態取消,就只能選取其他control,例如點其他textBox或是button,如此難免產生期望外的行為。
而textBox.Focused是唯讀事件,將Focus轉移到Form上也無法解除textbox的Focused。最後發現只能用
targetForm.ActiveControl = null;
從parent form去取消active control

        class GeneralCallbakSetter
        {
            Form targetForm;
            public GeneralCallbakSetter(Form inForm)
            {
                targetForm = inForm;
            }
            public void SetCallbacks(Control textBox)
            {
                targetForm = textBox.FindForm();
                textBox.Enter += Enter;
                textBox.Leave += Leave;
                textBox.KeyUp += KeyUp;
            }
            void Leave(object sender, EventArgs e)
            {
                targetForm.KeyPreview = true;
            }

            void Enter(object sender, EventArgs e)
            {
                targetForm.KeyPreview = false;
            }

            void KeyUp(object sender, KeyEventArgs e)
            {
                if (e.KeyCode == Keys.Escape)
                {
                    TextBox tb = (TextBox)sender;
                    targetForm.ActiveControl = null;
                }
            }
        }

沒有留言:

張貼留言