2

我有一个所有者绘制的 UserControl,我在其中实现了双缓冲。为了让双缓冲在没有闪烁的情况下工作,我必须像这样覆盖 OnPaintBackground 事件:

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

这在运行时效果很好。问题是,当我在设计时在窗体上有一个控件实例时,它会变成一个黑洞,显示拖过它的任何窗口的轨迹(因为 OnPaintBackground 事件的覆盖也控制设计时外观)。这只是一个表面上的问题,但它在视觉上很刺耳,它总是让项目的新开发人员认为某些事情出了严重的错误。

有没有办法让这样的被覆盖方法在设计时不被覆盖,或者有另一种解决方案吗?

4

3 回答 3

3

不幸的是,Steven Lowe 的解决方案涵盖了所有场景,尤其是当用户控件出现时。

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

例如,如果您在设计器中有一个 Form A 和一个 UserControl B:

  • A.DesignMode 在设计器中查看时为真
  • B.DesignMode 在查看 A 时为 false,但在设计器中直接查看 B 时为 true。

对此的解决方案是检查一个特殊的标志(对于丑陋的 C++ 代码感到抱歉):

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

此变量将始终显示正确的设计布尔值。

于 2009-09-02T17:26:33.557 回答
2
if (this.DesignMode)
{
    return;    //or call base.OnPaintBackground()
}
于 2008-11-16T02:25:01.713 回答
2

greggorob64C#中的解决方案:

if (DesignMode || LicenseManager.UsageMode == LicenseUsageMode.Designtime) 
{
    return;
}
于 2010-02-03T20:47:59.240 回答