【问题标题】:How to prevent MDI child form changing when input arrow keys?输入方向键时如何防止 MDI 子窗体发生变化?
【发布时间】:2017-02-20 05:01:03
【问题描述】:

我实施的内容

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

我要停止的事情

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

我已经搜索了很长时间,有一些关于捕获密钥的解决方案,但任何解决方案都可以阻止这种情况。

请帮帮我。

+重现此问题的条件

  • MDI 父级在右侧有 ToolStripPanel 和 ToolStrip 停靠
  • 父级也有 MenuStrip(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 我想要阻止它
  • 我的 mdi 应用程序中没有这个。你能描述一下我需要在我的 mdi 应用程序中做什么来重现问题吗
  • @GuidoG 我上传图片和示例代码。
  • 请有人编辑语法错误

标签: c# .net forms winforms mdi


【解决方案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;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-05
    • 1970-01-01
    • 2018-10-30
    • 2012-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多