我的应用程序具有以下 UI 配置:

主要形式是一个 MDI 容器。它的子表单附加到 TabStrip

每个用户都有他的一组子表单。根据事件用户,仅显示该用户的子窗体以及选项卡。

这是通过浏览主表单的 MdiChildren 并根据事件用户将其 Visible 属性设置为 false/true 来实现的。

        foreach (Form item in MdiChildren)
        {
            if (((OfficeFormEx)item).UserID == (int)e.NewTab.Tag)
            {
                item.Visible = true;
            }
            else
            {
                item.Visible = false;
            }
        }

这有两个不良影响。一是每个子窗体都被连续重绘,这既丑陋又缓慢。另一个是由于某种原因,表单从最大化变为正常,有效地将它们与主表单分离。

有没有办法只显示一个子窗体,例如用户之前正在查看的子窗体,而让其他窗体留在后台?最大化/正常的事情没什么大不了的,因为我可以手动再次最大化它们。

最佳答案

如果没有代码片段,您的问题就不是很清楚。然而,您正在与 Windows MDI 实现作斗争。它不支持的一件事是隐藏子窗口,它最多只能最小化。 Windows 窗体通过销毁 Window 句柄来实现 Visible 属性,当 Visible 属性再次设置为 True 时重新创建它。窗口的新实例不会最大化。

它也不支持在当前窗口最大化时将焦点切换到子窗口。 WF 对此的解决方法是强制事件子窗口返回正常状态。

MDI 模型根本不适合在最大化状态下显示子窗口。要获得选项卡式界面,请使用 TabControl 并在其选项卡页上显示 UserControl。

关于c# - 当可见性改变时,mdi 子窗体绘制缓慢,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2943476/

10-10 14:44