2013-01-24 36 views
1

我在Windows窗體中實現我自己的控件。這是一個樹形視圖,所以我必須實現導航鍵:箭頭,向上/向下翻頁和它們的組合以及移位和控制來處理多重選擇。Ctrl + PageUp/Down會有些奇怪嗎?

最近我發現,Ctrl + PageUp/PageDown的組合有點奇怪。主要是,它不會觸發OnKeyDown(只有ControlKey被捕獲)。此外,沒有其他按鍵被捕獲,直到我用鼠標點擊控制(它看起來像它失去焦點),我實現IsInputKey:

protected override bool IsInputKey(Keys keyData) 
    { 
     // Capture arrow keys 
     if ((keyData & (Keys.Up | Keys.Down | Keys.Left | Keys.Right | 
      Keys.PageDown | Keys.PageUp | Keys.ControlKey | Keys.Control)) != 0) 
      return true; 
     else 
      return base.IsInputKey(keyData); 
    } 

沒有什麼特別的onkeydown事件處理程序。

這是怎麼回事?

+0

你應該實施'KeyDown' –

+0

你爲什麼這麼說? – Spook

回答

1

您的代碼確實有效。我收到的onkeydown行動:

protected override void OnKeyDown(KeyEventArgs e) { 
    if (e.KeyData == (Keys.Control | Keys.PageDown)) { 
    // Control + Page Down 
    } else if (e.KeyData == Keys.PageDown) { 
    // Page Down 
    } 
    base.OnKeyDown(e); 
} 

這裏是你的代碼的一個精簡版的作品:

public class VirtualTreeView : UserControl { 

    protected override void OnKeyDown(KeyEventArgs e) { 
    if (e.KeyCode == Keys.Up || e.KeyCode == Keys.Down || e.KeyCode == Keys.PageUp || e.KeyCode == Keys.PageDown || e.KeyCode == Keys.Home || e.KeyCode == Keys.End) { 
     if (e.Control) { 
     MessageBox.Show("Ctrl - " + e.KeyCode.ToString()); 
     } 
    } else 
     base.OnKeyDown(e); 
    } 

    protected override bool IsInputKey(Keys keyData) { 
    // Capture arrow keys 
    if ((keyData & (Keys.Up | Keys.Down | Keys.Left | Keys.Right | Keys.PageDown | Keys.PageUp | Keys.ControlKey | Keys.Control)) != 0) 
     return true; 
    else 
     return base.IsInputKey(keyData); 
    } 
} 

衝壓控制-上一頁顯示一個消息框。

+0

我的項目是開源的,如果你願意的話,你可以自己檢查一下:http://spkcontrols.codeplex.com/ – Spook

+0

@Spook我把你的開源代碼的一些部分和你的OnKeyDown代碼的實現工作。問題可能在其他地方。 – LarsTech

+0

它從一開始就工作嗎?你懷疑特定的系統配置,還是其他部分代碼負責?你剝去了哪些部分? – Spook