2010-11-01 126 views
2

我得到了一個窗體上有一些按鈕(假設20)。在中間,我得到了一個完全空的用戶控制。問題是:我怎樣才能做到這一點,使用戶控制單擊時,它將獲得鍵盤焦點?用戶控制鍵盤焦點

原因:我用鼠標在該用戶控件中繪製形狀。形狀實際上是其他用戶控件。我想要做的就是能夠使用鍵盤移動這些形狀。但我似乎無法正確地抓住鍵盤焦點。 Key_Down事件只是沒有達到我的主要(繪製)用戶控制。

換句話說,我們如何讓鍵盤焦點在控件上沒有可聚焦的項目呢?如何才能使鍵盤無法對焦的控制,捕捉這些事件?除了進入原始的WIN32 API硬核之外,還可以在窗口範圍內捕獲這些事件?

回答

6

UserControl的設計非常適合其他控件的容器控件。它憎恨焦點並試圖首先把它傳遞出去。你不應該在這裏使用UserControl,因爲你沒有在其中放置任何控件。面板控件就足夠了。它有完全相同的問題,它不想獲得焦點。

手術需要覆蓋其行爲。您所需要的一切都在this answer

+0

你好漢斯,謝謝你的回答:: - )。我在其中添加控件。其他用戶控件。而且我使用了用戶控件(不是面板),因爲我自定義繪製所有內容。我在另一個線索中回顧了你的答案。好東西。你有一個很好的理由高分 - ::)。 +2。 – Axonn 2010-11-01 16:57:37

1

添加到您的用戶控件的代碼來捕獲鍵盤輸入:

/// <summary>Keys which can generate OnKeyDown event.</summary> 
    private static readonly Keys[] InputKeys = new [] 
     { Keys.Left, Keys.Up, Keys.Right, Keys.Down, }; 

    protected override void OnPreviewKeyDown(PreviewKeyDownEventArgs e) 
    { 
     if(Array.IndexOf<Keys>(InputKeys, e.KeyCode) != -1) 
     { 
      e.IsInputKey = true; 
     } 
     base.OnPreviewKeyDown(e); 
    } 

    protected override void OnKeyDown(KeyEventArgs e) 
    { 
     base.OnKeyDown(e); 
     // just to illustrate this works 
     MessageBox.Show("KeyDown: " + e.KeyCode); 
    } 
+0

很酷,謝謝你的回答! :: - D. +1。 – Axonn 2010-11-01 17:23:17

0

您需要將控件上的CommandRouting標誌設置爲true。 命令路由依賴項屬性在公共API(MS.VS.Editor.dll)中定義,您的裝飾將希望使用該API來指示它正在處理其命令,而不是允許包含文本視圖處理它們。您可以從您的控件的初始化中完成此操作。 Microsoft.VisualStudio.Editor.CommandRouting.SetInterceptsCommandRouting(this,true);