首页 文章

C#聚焦于表单和箭头键

提问于
浏览
1

我想为游戏做一个 Map 编辑器 . 它是一个具有Windows窗体UI的程序(如propertyGrid来编辑对象的属性),但它也有一个面板,将在其上绘制 Map .

我想要的是:

当焦点在带有 Map 的面板上时,我想使用键盘来移动 Map (箭头键),添加对象(数字键)等 . 当焦点不在此面板上时,我希望这些按钮可用作在Windows窗体中正常 - 允许在控件之间切换等

我的表单看起来像这样:

它有一个ToolStripControl,它有一个menuStrip(用于主菜单)和一个statusStrip(用于状态栏) . 在窗体(或toolstripcontrol)的中间,SplitControl停靠(dock = fill),它有两个面板 . Panel 1有PanelMap - 一个显示 Map 的Panel,Panel 2有所有其他东西,如propertygrid,tabcontrols,button等 .

我将表单的KeyPreview设置为true,并在表单的keydown事件处理程序中处理键盘事件 .

现在,如果我将焦点分配给PanelMap,下次按箭头键,则不会发生KeyDown事件 . 不是一个人!即使是应该处理所有事件的形式,因为它具有“KeyPreview”也不会触发它 . 当我按箭头时,PanelMap失去了对SplitControl的关注 .

好吧,我想,也许PanelMap不应该有焦点,让我们把焦点放在SplitControl上(如果我在有焦点时按箭头键,我可以处理它,所以它不会进一步) . 但是,如果像SplitControl内部的文本框之类的内容有焦点,那么SplitControl就无法获得焦点 . .Focus()什么都不做 - 焦点仍然存在于拥有它的控制器中!

为什么这么奇怪?当面板具有焦点并按下箭头键时,为什么Form的KeyDown不会触发?当我调用.Focus()时,为什么SplitControl没有聚焦,即使CanFocus = true?

最终,我如何实现我想要的?有办法吗?

2 回答

  • 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

    我找到了这样的答案:

    我制作了一个隐藏在面板下面的文本框(但已启用且可见) . 当我想要将焦点“锁定”在我的PanelMap上时,此文本框将获得焦点 . 即使使用e.suppress = true,它也有onkeydown,因此文本框永远不会受到影响它的任何击键 .

    原油解决方案,但工作奇迹...典型的M $业务...

相关问题