簡體   English   中英

自定義RichTextBox OnKeyDown覆蓋無效

[英]Custom RichTextBox OnKeyDown override doesn't work

我有RichTextBox繼承的此類。 我重寫了void OnKeyDown來檢查傳入的Tab,因為我不希望它們。

使用斷點,我看到了覆蓋的void被調用,但是它沒有完成其工作。

這是代碼:

class ProgrammingTextBox : RichTextBox
{
    protected override void OnKeyDown(KeyEventArgs e)
    {
        if (e.KeyCode == Keys.Tab)
        {
            // Tab was pressed, replace it with space
            e.SuppressKeyPress = true; // Don't press Tab
            for (int i = 0; i < 4; i++)
            {
                base.OnKeyDown(new KeyEventArgs(Keys.Space); // Repeat space 4 times
            }
        }
        else base.OnKeyDown(e);
    }
}

所需的輸出應為帶有4個空格的文本,但結果應以Tab鍵形式顯示,例如未調用for循環中的OnKeyDown調用。

知道該怎么辦嗎?

使用Tab (不是普通鍵 -可以對其進行預處理並移動焦點控制)時,您必須覆蓋另一個方法ProcessCmdKey

https://msdn.microsoft.com/en-us/library/system.windows.forms.control.processcmdkey(v=vs.110).aspx

像這樣

   protected override bool ProcessCmdKey(ref Message msg, Keys keyData) {
     if (keyData == Keys.Tab) {
       //TODO: Your code here

       return true;
     }

     return base.ProcessCmdKey(ref msg, keyData);
   }

也可以看看

https://msdn.microsoft.com/en-us/library/system.windows.forms.textboxbase.acceptstab.aspx

    base.OnKeyDown(new KeyEventArgs(Keys.Space);

OnKeyPress()上的OnKeyDown()僅生成通知 ,其工作不是修改Text屬性。 由您決定,分配SelectedText屬性。 像這樣:

class ProgrammingTextBox : RichTextBox {
    protected override bool IsInputKey(Keys keyData) {
        if (keyData == Keys.Tab) return true;
        return base.IsInputKey(keyData);
    }
    protected override void OnKeyDown(KeyEventArgs e) {
        if (e.KeyCode == Keys.Tab) {
            const string tabtospaces = "    ";
            var hassel = this.SelectionLength > 0;
            this.SelectedText = tabtospaces;
            if (!hassel) this.SelectionStart += tabtospaces.Length;
            e.SuppressKeyPress = true;
        }
        else base.OnKeyDown(e);
    }
}

暫無
暫無

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

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