2012-03-29 67 views
1

我想做一個遊戲的地圖編輯器。它的一個程序將有Windows窗體UI(如propertyGrid編輯對象的屬性),但它也將有一個面板將繪製地圖。C#重點形式和箭頭鍵

我想要什麼:

當重點是與地圖面板上,我想用鍵盤來移動地圖(箭頭鍵),添加對象(數字鍵)等焦點時未啓用上這個小組,我想的按鈕正常工作在Windows窗體 - 控件等之間允許標籤

我的形式如下:

它具有的MenuStrip(主菜單ToolStripControl )和一個statusStrip(用於狀態欄)。在窗體(或者工具欄控件)的中間,SplitControl被停靠(dock = fill),它有兩個面板。面板1有PanelMap - 顯示地圖的面板,面板2有其他所有東西,如propertygrid,tabcontrols,按鈕等。

我將KeyPreview的form設置爲true,並在窗體的keydown事件處理程序中處理鍵盤事件。

現在,如果我將焦點分配給PanelMap,下一次按下箭頭鍵,NO KeyDown事件觸發時會發生什麼。沒有一個!即使是應該處理所有事件的形式,因爲它具有「KeyPreview」,甚至不會觸發它。當我按下箭頭時,PanelMap失去了對SplitControl的重點。

好吧,我想,也許PanelMap不應該有焦點,讓焦點SplitControl(如果我按下箭頭鍵,而它有焦點,我可以處理它,所以它不會走得更遠)。但是,如果任何類似於SplitControl內部的文本框的內容都有焦點,那麼SplitControl無法獲得焦點。 .Focus()將不會執行任何操作 - 焦點將保留在已有的控件中!

它爲什麼這麼奇怪?爲什麼當面板具有焦點並按下箭頭鍵時,Form的KeyDown不會觸發?爲什麼當我調用.Focus()即使CanFocus = true時,SplitControl也不會被聚焦?

最終,我如何實現我想要的?有沒有辦法做到這一點?

+0

覆蓋窗體的ProcessCmdKey()吞下按鍵。如果您沒有進一步處理按鍵,只需返回false即可。 – 2012-03-30 18:19:09

回答

1

我想你會遇到小部件,在你的事件進入導航之前進行擊鍵。我有這個問題,這樣做:

private void RemoveCursorNavigation(Control.ControlCollection controls) 
    { 
     foreach(Control ctrl in controls) 
     { 
      ctrl.PreviewKeyDown += new PreviewKeyDownEventHandler(MainWin_PreviewKeyDown); 
      RemoveCursorNavigation(ctrl.Controls); 
     } 
    } 

我呼籲在主窗體的Load處理程序這個功能,像這樣:

RemoveCursorNavigation(this.Controls); 

在你PreviewKeyDown處理器,你需要做到這一點:

public void MainWin_PreviewKeyDown(Object sender, PreviewKeyDownEventArgs e) 
    { 
     switch(e.KeyCode) 
     { 
      case Keys.Up: 
      case Keys.Down: 
      case Keys.Left: 
      case Keys.Right: 
       e.IsInputKey = true; 
       break; 
      default: 
       break; 
     } 
    } 

e.IsInputKey = true;告訴你使用這個事件,並且不希望它去任何地方外面。

現在,您可以在進入小部件之前看到擊鍵,並且您將無法通過光標鍵在它們之間進行導航。

+0

問題是,他們仍然進入小部件!我試着做預覽鍵 - 沒有辦法讓事件被抑制或在預覽鍵中處理,這意味着它將被對象處理...因此,將圍繞形式 – Istrebitel 2012-03-30 17:33:11

+0

跳躍焦點怎麼樣'e.IsInputKey =真的;'這就是我使用的。 – Almo 2012-03-30 18:02:22

+0

恩,謝謝。我的方法對我來說完美無瑕(即使有人貶低它),但我會考慮這樣做。 – Istrebitel 2012-03-31 13:58:36

0

我找到了答案是這樣的:

我提出,是面板下隱藏(但啓用和可見的)文本框。當我想「鎖定」我的PanelMap上的焦點時,此文本框被給予焦點。它甚至與e。suppress = true,以便文本框永遠不會受到任何擊鍵的影響。

原油替代方法,但可以創造奇蹟......典型的M $的業務...