Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C#/.NET 2.0中控制双缓冲所有者绘制的UserControl的设计器外观_C#_.net_User Controls_.net 2.0 - Fatal编程技术网

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

在C#/.NET 2.0中控制双缓冲所有者绘制的UserControl的设计器外观,c#,.net,user-controls,.net-2.0,C#,.net,User Controls,.net 2.0,我有一个所有者绘制的UserControl,在这里我实现了双缓冲。为了使双缓冲在不闪烁的情况下工作,我必须重写OnPaintBackground事件,如下所示: protected override void OnPaintBackground(PaintEventArgs e) { // don't even have to do anything else } 这在运行时非常有效。问题是,当我在设计时在窗体上有一个控件实例时,它会变成一个黑洞,显示在其上拖动的任何窗口的轨迹(因为O

我有一个所有者绘制的UserControl,在这里我实现了双缓冲。为了使双缓冲在不闪烁的情况下工作,我必须重写OnPaintBackground事件,如下所示:

protected override void OnPaintBackground(PaintEventArgs e)
{
    // don't even have to do anything else
}
这在运行时非常有效。问题是,当我在设计时在窗体上有一个控件实例时,它会变成一个黑洞,显示在其上拖动的任何窗口的轨迹(因为OnPaintBackground事件的重写也会控制设计时的外观)。这只是一个表面上的问题,但它在视觉上是不和谐的,它总是导致项目中的新开发人员认为某些东西出了可怕的错误


有没有办法让这样一个被重写的方法在设计时不被重写,或者有其他解决方案呢?

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

if (this.DesignMode)
{
    return;    //or call base.OnPaintBackground()
}
this.DesignMode标志非常具有欺骗性。它唯一的作用是检查直接父对象是否在设计器中

例如,如果在设计器中有表单a和用户控件B:

  • A.DesignMode在designer中查看时为true
  • B.DesignMode在查看A时为false,但在设计器中直接查看B时为true
< P>这个解决方案是一个特殊的标志来检查(对不起丑陋的C++代码):


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

C#中的
greggorob64
解决方案:


有什么原因不能使用内置的双缓冲吗?是的,它不工作。如果创建DoubleBuffered=true的用户控件,然后对其执行一系列绘图操作,则会出现闪烁。我真的不确定这个属性到底有什么作用。不幸的是,你的解决方案是正确的。我首先尝试了Steven Lowe的解决方案,遇到了您描述的问题+1给你。我他妈的怎么把代码放在评论里!我发现了一种更强大的检测设计时检测的方法。我将以下属性添加到我设计的几乎每个表单\用户控件中,甚至可以在构造函数\析构函数中正常工作,这是设计器真正的问题区域属性bool IsDesignMode{bool get(){return(this->DesignMode==true | | | LicenseManager::UsageMode==LicenseSusageMode::Designtime | | AppDomain::CurrentDomain->FriendlyName->Equals(L“DefaultDomain”);}不幸的是,您的解决方案并非在所有情况下都有效,参见greggorob64的帖子。我第一次使用你的代码遇到麻烦-1、对不起。
 if(this->DesignMode || 
    LicenseManager::UsageMode == LicenseUsageMode::Designtime) 
    return;
if (DesignMode || LicenseManager.UsageMode == LicenseUsageMode.Designtime) 
{
    return;
}