我有一个所有者描述的 UserControl,我在其中实现了双缓冲。为了使双缓冲工作而不会闪烁,我必须像这样重写 OnPaintBackground 事件:
protected override void OnPaintBackground(PaintEventArgs e)
{
// don't even have to do anything else
}
这在运行时效果很好。问题是,当我在设计时在窗体上有一个控件实例时,它变成了一个黑洞,显示拖过它的任何窗口的轨迹(因为 OnPaintBackground 事件的覆盖也控制设计时外观)。这只是一个表面上的问题,但它在视觉上很刺耳,而且它总是导致项目的新开发人员假设出现了严重的错误。
有没有办法让这样的重写方法在设计时不被重写,或者有其他解决方案吗?
最佳答案
不幸的是,Steven Lowe 的解决方案涵盖了所有场景,尤其是当用户控件出现时。
this.DesignMode 标志非常具有欺骗性。它的唯一范围是检查直接父级是否在设计器中。
例如,如果您在设计器中有一个表单 A 和一个用户控件 B:
- A.DesignMode 在设计器中查看时为真
- B.DesignMode 在设计器中查看 A 时为 false,但在直接查看 B 时为 true。
解决这个问题的方法是检查一个特殊的标志(抱歉丑陋的 C++ 代码):
if(this->DesignMode ||
LicenseManager::UsageMode == LicenseUsageMode::Designtime)
return;
此变量将始终显示正确的设计 bool 值。
关于c# - 在 C#/.NET 2.0 中控制双缓冲所有者绘制的 UserControl 的设计器外观,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/293351/