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

时间:2017-02-20 05:01:04

标签: c# .net forms winforms mdi

我实施的内容

  • 我的应用程序在用户打开其他子项以保留最后输入数据时保留mdi子表单(不要关闭)。
  • 子表格显示为最大化。

我想停止

  • 当用户输入超过两个子表格后的箭头键(我认为是儿童表格聚焦时),导航子表格(上/左:上一个孩子打开,下/右:下一个孩子)并显示为最大化的属性被释放(有些案例没有)。

我已经搜索了很长时间,有一些关于捕获键的解决方案,但有任何解决方案可以阻止它。

请帮帮我。

+重现此问题的条件

  • MDI父级有ToolStripPanel&右侧的ToolStrip停靠
  • parent也将MenuStrip(Visible属性设置为false)停靠在顶部以隐藏子窗体的控件框
  • ToolStripButton的Click Event Handler显示使用意大利面条功能的子窗体
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 enter image description here
  2. 单击每个ToolStripButton并加载子表单 enter image description here
  3. 只按一次“向上”箭头键 enter image description here

1 个答案:

答案 0 :(得分:1)

PreviewKeyDown事件处理程序添加到您的MDI子窗体。它可以过滤您希望子表单处理的键。

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;
    }
}