2008-11-16 27 views
2

我有一个所有者绘制的UserControl,我实现了双缓冲。为了获得双缓冲无频闪工作,我必须覆盖OnPaintBackground事件,如下所示:在C#/ .NET 2.0中控制双缓冲自绘用户控件的设计器外观

protected override void OnPaintBackground(PaintEventArgs e) 
{ 
    // don't even have to do anything else 
} 

这在运行时的伟大工程。问题是,当我在设计时在窗体上有一个控件的实例时,它会变成一个黑洞,显示任何窗口拖过它的路径(因为OnPaintBackground事件的重写也控制着设计时的外观)。这只是一个表面上的问题,但它在视觉上有些震撼,它总是让项目的新开发人员承担一些可怕的错误。

是否有任何方法可以在设计时重写这样的重写方法,或者是否有其他解决方案?

+0

是有一些原因,你不能使用内置的双缓冲? – 2008-11-16 02:34:38

+0

是的 - 它不起作用。如果您使用DoubleBuffered = true创建用户控件,然后对其执行一堆绘图操作,则会出现闪烁。我真的不确定那是什么财产。 – MusiGenesis 2008-11-16 02:45:14

回答

3

Steven Lowe的解决方案不幸覆盖了所有情况,特别是当用户控件进入图片时。

this.DesignMode标志非常具有欺骗性。它唯一的范围是检查直接父母是否在设计师之内。

举例来说,如果你有一个A型,和用户控件B,在设计师:

  • A.DesignMode在设计师看时为真观看一个时
  • B.DesignMode是假的,但在设计师直接看B的时候才是真实的。

的解决方案是一个特殊的标志检查(遗憾的丑陋C++代码):

if(this->DesignMode || 
    LicenseManager::UsageMode == LicenseUsageMode::Designtime) 
    return; 

此变量将始终显示适当的设计布尔值。

2
if (this.DesignMode) 
{ 
    return; //or call base.OnPaintBackground() 
} 
+0

不幸的是,你的soloution在所有情况下都不起作用,请参阅greggorob64的帖子。我第一次遇到了使用你的代码的麻烦。 -1,对不起。 – Marcel 2010-02-03 20:49:14

2

greggorob64 C#中的解决方案:

if (DesignMode || LicenseManager.UsageMode == LicenseUsageMode.Designtime) 
{ 
    return; 
}