【发布时间】:2013-06-19 07:31:23
【问题描述】:
我必须在我的TableLayoutPanel 上禁用OnPaintBackground 以消除首先绘制的背景引起的闪烁(因为我正在使用paint 方法在TLP 上绘图,是的,我需要一个TLP,因为它包含许多控件出于某种目的)。所以我的代码如下:
public static bool FlickerPanel = false;
public class FlickerTableLayoutPanel : TableLayoutPanel
{
protected override void OnPaintBackground(PaintEventArgs e)
{
if (FlickerPanel)
base.OnPaintBackground(e);
}
}
然后在我的绘画方法中,我让它绘制它自己的背景。所以在运行时它很好。
编辑:我发现了问题的根源。通过覆盖 OnPaintBackground,它会禁用任何让设计者绘制背景的代码。如果我将覆盖全部删除,则不会出现图形故障。
protected override void OnPaintBackground(PaintEventArgs e)
{
base.OnPaintBackground(e);
}
即使上面的代码也禁用了设计视图渲染并导致图形故障。非常感谢任何帮助!
【问题讨论】:
-
您不能只跳过 OnPaintBackground,这就是 TLP 自己绘制的地方。在基本调用之后将所需的 e.Graphics 方法调用添加到该方法。如果这仍然太明显,那么添加一个构造函数并将 DoubleBuffered 属性设置为 true。
-
经过一番研究,我认为 Hans Passant 建议的 DoubleBuffered 属性可以解决问题。
-
@HansPassant 太棒了! DoubleBuffered 属性确实有效。所以我输入了
public TLP(){ base.DoubleBuffered = true; },它成功了!这与覆盖默认构造函数是一样的吗?我应该在原始默认构造函数中添加什么内容吗?