c# - 如何停止包含多个控件的面​​板的闪烁

标签 c# .net user-controls panel flicker

我对闪烁和 UI 更新的一般流程有一些疑问 当涉及多个对象时。

背景: 我们在 Progress ABL 应用程序中使用 C# 程序集来驱动 UI。 此外,我们还使用 Infragistics 控件,因为它们可以轻松设置样式。 我们有一种自制的MDI。 (选项卡)面板包含多个用户控件,其中 用作“表格”。 (注意:无法使用真实表单,因为非顶层表单在正确处理鼠标点击时存在问题) 这些选项卡由 Infragistics UltraDockManager 实现。

在这样的用户控件“表单”上放置了一个 Progress .Net 控件,它嵌入了真正的 Progress Frames。 因此我们可以重新使用现有的 Progress Forms 而不是从头开始在 .NET 中重建它们。 更糟糕的是,我们在(选项卡)面板上使用平铺背景图像。

现在我们遇到的问题是面板的内容(源自 Infragistics.Win.Misc.UltraPanel) 正在剧烈闪烁。 (尤其是在调整主应用程序大小时) 一些控件(尤其是 Progress 控件)被删除并重绘。

我可以通过使用 WS_CLIPCHILDREN 和 WS_EX_COMPOSITED 来消除闪烁 (如 Hans Passant 在 How to fix the flickering in User controls 中提到的)在面板和用户控件中。 但是应用程序明显比以前慢了,所以我不得不再次删除代码。

我尝试设置面板和 UserControl 的样式,但完全没有效果。

this.SetStyle(ControlStyles.AllPaintingInWmPaint |
              ControlStyles.UserPaint |
              ControlStyles.OptimizedDoubleBuffer |
              ControlStyles.ResizeRedraw, true);

试图忽略面板中的 WM_ERASEBKGND 和 UserControl 似乎也没有效果。

protected override void WndProc(ref Message m)
{
    if (m.Msg != WM_ERASEBKGND)
    {
        base.WndProc(ref m);
    }
}

处理所有这些对象的重绘以减少闪烁的正确方法是什么?

我考虑过使用 SendMessage 和 WM_SETREDRAW。但我不确定放在哪里 在这种情况下,它是否真的有帮助。

当调整应用程序大小时,每个 UserControl 似乎都被重新绘制,无论其可见性如何。 (可以滚动到 View 的一半) 为什么没有进行某种剪裁?面板应该知道有些区域不需要刷新还是我弄错了?

如果有任何建议,我将不胜感激。

最佳答案

我们终于设法摆脱了闪烁。 有两个因素导致了这个问题:

  1. 颜色的使用:透明
  2. 使用面板的自动滚动功能

我们删除了透明颜色并在调整大小时禁用了 AutoScroll。

关于c# - 如何停止包含多个控件的面​​板的闪烁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16789112/

相关文章:

c# - 在本地 Debug模式下启动我的 Azure 项目时,我得到 "Object reference not set to instance of an object"

c# - mvc : Model. IsValid 在我使用 Request.Form 时不起作用

c# - 启动画面后主窗口出现在其他窗口后面

javascript - 同一页面上的更多 ascx 实例

asp.net - 面板和用户控件与动态加载用户控件

javascript - 在代码隐藏执行期间显示加载动画(div 元素)(c# 和 asp 网络)

c# - 全局异常捕获仅在调试 WinForms 应用程序时有效

.net - MySQL .NET 连接器 - 获取该列所属的表?

c# - 这种密码生成方案可能会受到哪些类型的攻击?

c# - 在 UserControl 库中使用全局 ResourceDictionary