【发布时间】:2012-02-04 15:35:38
【问题描述】:
在我的应用程序中,我有一个表单,其中一个顶级菜单项的子菜单项是动态创建的。所以目标是我一直有一个名为“Actions”的顶级菜单项,但子项是动态生成的。我遇到的问题是,对于每个子项目,我都会添加整个 MainMenu 重绘和闪烁。由于我猜测更多的绘画调用而添加的子菜单项越多,问题就越明显,例如,如果我只添加一个子菜单项,它不会经常闪烁,但如果我添加 15 个(其中对我的应用程序来说是典型的)它几乎每次都很明显。请注意,这是使用 MenuItems 而不是 MenuStrip,我们开发了自定义控件来支持 MenuItems,但尚未过渡到使用 MenuStrip。
我创建了一个简单的示例来演示这一点,我只需单击一个按钮即可将 15 个子项添加到每个顶级菜单项(我的演示中有两个“文件”和“编辑”),你会看到它调用“DrawMenuBar”30 次。这是代码在单击按钮时所做的事情:
private void CreateSubMenus()
{
foreach (MenuItem menu in this.Menu.MenuItems)
{
for (int i = 1; i <= 15; i++)
{
MenuItem newSubMenu = new MenuItem();
newSubMenu.Text = "TestSub" + i;
menu.MenuItems.Add(newSubMenu);
}
}
}
无法以新用户身份嵌入图像,但这里有一个指向分析显示的链接Profiling Adding Sub Menus
所以 DrawMenuBar 被调用了 30 次。
我尝试过使用类似的东西:
this.Menu.MenuItems[0].AddRange(
但这最终会导致相同数量的绘图调用。我能想到的最好的方法是从 MainMenu 中删除顶级菜单项,然后进行所需的更改,然后重新链接它,但这看起来也不是很好,因为菜单项消失而不是重新出现。理想情况下,顶级菜单栏的可见性不会闪烁或发生任何变化,因为我没有更改那里的任何内容,而是更改子菜单项。
基本上,看看是否有一种等效的方法来执行暂停/恢复布局,但对于 MainMenu 对象。
【问题讨论】: