如何在输入箭头键时防止 MDI 子窗体更改?

3

我实现的功能

  • 我的应用程序在用户打开其他子窗体时,保留mdi子窗体(不要关闭)以保留上次输入的数据。
  • 子窗体显示为最大化。

我想要停止的问题

  • 当用户在已经打开了两个以上子窗体之后输入箭头键(我认为是当焦点在子窗体上时),子窗体会被导航(向上/向左:打开前一个子窗体,向下/向右:打开下一个子窗体)并释放最大化属性(某些情况下没有释放)。

我已经搜索了很长时间,有一些关于捕获按键的解决方案,但没有解决这个问题的解决方案。

请帮帮我。

+ 重现该问题的条件

  • MDI父窗体具有位于右侧的ToolStripPanel和ToolStrip停靠。
  • 父窗体还具有菜单栏(Visible属性设置为false)停靠在顶部以隐藏子窗体的控制框。
  • ToolStripButton的Click事件处理程序使用类似于意面式函数的方式显示子窗体。
private void tsbChildForm1_Click(object sender, EventArgs e)
{
    Cursor.Current = Cursors.WaitCursor;                    
    if (m_frmChild != null)                                 
    {
        if (typeof(Form1) != this.ActiveMdiChild.GetType()) 
        {
            m_frmChild = new Form1();                       
            OpenChildForm(m_frmChild);                      
        }
        else
        {
            // do nothing. prevent memory increase
        }
    }
    else
    {
        m_frmChild = new Form1();                           
        OpenChildForm(m_frmChild);                          
    }
}

private void OpenChildForm(Form frmChild)
{
    if (LoadExistForm(frmChild))
    {
        // do nothing.
    }
    else
    {
        frmChild.MdiParent = this;
        frmChild.WindowState = FormWindowState.Maximized;
        frmChild.Show();
    }
}

private bool LoadExistForm(Form frmChild)
{
    foreach (Form frmEach in this.MdiChildren)
    {
        if (frmEach.Name.Equals(frmChild.Name, StringComparison.OrdinalIgnoreCase))
        {
            frmEach.Select();
            frmEach.WindowState = FormWindowState.Maximized;
            frmChild.Dispose();
            return true;
        }
    }
    return false;
}
  1. 加载 MDIParent 这里输入图片描述
  2. 单击每个 ToolStripButton 并加载子窗体 这里输入图片描述
  3. 仅按一次“向上”箭头键 这里输入图片描述

你想要构建这个导航还是已经有了并且想要停止它? - GuidoG
@GuidoG 我上传了图片和示例代码。 - Tony Jang
请有人编辑语法错误。 - Tony Jang
你的问题与 MDI 无关,而是与你正在使用的侧边栏有关。如果它获得了焦点,那么单击箭头按钮将移动到该侧边栏上的下一个/上一个项目。你为什么要使用这个侧边栏? - GuidoG
@GuidoG 我使用侧边栏(ToolStripPanel&ToolStrip)是因为这是我知道的最好的提供菜单的方式。感谢您的意见,但我不这么认为。我的问题肯定与 MDI 有关,因为当我使用按钮(System.Windows.Forms.Button)时除了侧边栏之外都会重复出现。最重要的是,*_Click 事件处理程序显示子窗体时从未在我按键盘的箭头键时被调用。我认为这意味着子窗体被聚焦,而不是侧边栏,并且点击箭头键是导致焦点在子窗体之间改变,而不是在具有单击事件处理程序的侧边栏项目之间改变。 - Tony Jang
显示剩余8条评论
1个回答

1
在你的MDI子窗体中添加PreviewKeyDown事件处理程序。它可以过滤你想让子窗体处理的按键。
private void Form_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
{
    switch (e.KeyCode)
    {
        case Keys.Up:
        case Keys.Down:
        case Keys.Left:
        case Keys.Right:
            e.IsInputKey = true;
            break;
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接