簡體   English   中英

C#自定義ENTER鍵行為

[英]C# custom ENTER key behaviour

我有一個小型項目,希望單擊或Ctrl + Clicked時多個按鈕的行為有所不同。 為了實現這一點,這些按鈕中的每個按鈕都將這種功能附加到其Click()事件:

private void Button1_Click(object sender, EventArgs e)
    {
        int value = 10 //default value
        bool boool = false; 
        if (ModifierKeys == Keys.Control)
        {
            using (var form = new NUP_Popup(0, value, value, "maximum ?")) 
            { //creates a simple window that allows user to change the value of 'value'
                form.ShowDialog();
                if (form.DialogResult == DialogResult.OK)
                {
                    value = form.retVal;
                    boool = true;
                }
                else return;
            }
        }
        //do stuff here, either with default or user value
    }

現在,Clicking或Ctrl + Clicking的行為符合此功能的預期。 我的問題是,使用Enter鍵激活按鈕時,此行為不適用:僅Enter鍵會觸發“正常”行為,而Ctrl + Enter則不執行任何操作(按鈕未激活)。

按下Escape鍵時,我已經重寫了ProcessDialogKey()函數來關閉窗口,所以我想我可以使用它來使Enter鍵按下來觸發Click()事件函數:

protected override bool ProcessDialogKey(Keys keyData)  //Allows quit when Esc is pressed
    {
        if (Form.ModifierKeys == Keys.None && keyData == Keys.Escape)
        {
            this.Close();
            return true;
        }
        if (keyData == Keys.Return)
        {
            this.OnClick(new EventArgs());
        }
        return base.ProcessDialogKey(keyData);
    }

那就是我被困住的地方。 當然,這什么也沒做,但是我真的不知道在第二種條件下鍵入什么才能起作用。

也許我使用了錯誤的方法? 有人可以指出正確的方向嗎?

假設您放置了一個ID為Label Label1的標簽和一個ID為Button1的按鈕,則將執行以下操作:

    private void button1_Click(object sender, EventArgs e)
    {
        label1.Text = "Button Clicked";
        if (Control.ModifierKeys == Keys.Control) label1.Text += " with Ctrl";
    }

    private void button1_KeyPress(object sender, KeyPressEventArgs e)
    {
        if (e.KeyChar == '\n') button1_Click(sender, new EventArgs());
    }

解決方案中,只需將KeyPress事件添加到Button1,然后在按鍵事件Button1_KeyPress中應用以下代碼:

if (e.KeyChar == '\n') Button1_Click(sender, new EventArgs());

我找到了一種解決方案,可讓您單擊Enter或Ctrl + Enter:

private void txtIP_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar == '\n' || e.KeyChar == '\r') btnStart_Click(sender, new EventArgs());
        }

好的,所以我終於找到了一個可行的解決方案,方法是將其添加到重寫的ProcessDialogKey()方法中:

if (keyData == (Keys.Enter | Keys.Control))
        {
            (this.ActiveControl as Button).PerformClick();
        }

我不知道它是否符合“干凈”代碼的要求,但是它具有滿足我的2個要求的優點:將Ctrl + Enter函數設置為Ctrl + Click,而不必為每個Button聲明2個方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM