4

我有一个 MDI 容器表单,以及一些独立更新其标题栏文本的子表单。在子窗体上更改 Text 属性后,在打开菜单时,不会在窗口列表菜单中更新来自子窗体的新标题栏文本。这是 .NET 通过 MdiWindowListItem 属性提供的自动生成的窗口列表。

仅当另一个事件以物理方式更改窗口列表(打开一个新子项、关闭一个子项、切换到另一个子项)时,更改才会传播。

有没有办法以编程方式强制更新窗口列表?我已经有一些代码可以在更改孩子的标题栏文本的同时进行菜单启用/禁用。

我尝试了以下但没有成功:

  • 主 MenuStrip 上的 Update()
  • 主 MenuStrip 上的 Refresh()
  • 窗口 MenuStrip 上的 Invalidate()
  • 在运行时对窗口列表项之一进行 Invalidate()
  • 在运行时在窗口列表项之一上切换两次检查状态

在菜单项、其父 ToolStrip 或包含菜单系统的父窗体上似乎没有任何其他远程可行的函数可以调用。

4

3 回答 3

9

上述解决方案对我不起作用。但是我点击了链接,发现了这个,效果很好:

private void windowMenu_DropDownOpening(object sender, EventArgs e)
{
    if (this.ActiveMdiChild != null)
    {
        Form activeChild = this.ActiveMdiChild;

        ActivateMdiChild(null);
        ActivateMdiChild(activeChild);
    }
}

谢谢!

于 2009-08-28T17:45:01.470 回答
2

您需要使用以下处理程序将 TextChanged 事件添加到子表单:

private void childForm_TextChanged(object sender, EventArgs e) {
    this.ActivateMdiChild( null );
    this.ActivateMdiChild( sender as Form );
} 

http://social.msdn.microsoft.com/forums/en-US/winforms/thread/a36b89aa-57aa-48b5-87a6-49fbddc9c92d

于 2009-08-28T17:20:34.640 回答
0

每当窗口标题更改时,您可以将 WM_MDIREFRESHMENU 消息发送到 MDI 客户端(不是框架)窗口,而不是激活/停用。

http://msdn.microsoft.com/en-us/library/windows/desktop/ms644919%28v=VS.85%29.aspx

于 2011-12-02T12:56:21.013 回答