在C#/。NET 2.0中控制双缓冲所有者绘制的UserControl的设计器外观

时间:2008-11-16 02:03:23

标签: c# .net user-controls .net-2.0

我有一个自己绘制的UserControl,我实现了双缓冲。为了在没有闪烁的情况下使双缓冲工作,我必须像这样重写OnPaintBackground事件:

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

这在运行时非常有用。问题是,当我在设计时在窗体上有一个控件实例时,它会变成一个黑洞,显示拖动它的任何窗口的轨迹(因为OnPaintBackground事件的覆盖也控制了设计时外观)。这只是一个整容问题,但它在视觉上很刺耳,它总是引导项目的新开发人员承担一些可怕的错误。

有没有办法让这样的重写方法在设计时不被覆盖,还是有其他解决方案?

3 个答案:

答案 0 :(得分:3)

不幸的是,Steven Lowe的解决方案涵盖了所有场景,特别是当用户控件进入画面时。

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

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

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

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

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

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

答案 1 :(得分:2)

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

答案 2 :(得分:2)

C#中的greggorob64解决方案:

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