2012-03-29 104 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 $的业务...