我必须禁用OnPaintBackground
上的TableLayoutPanel
以消除因首先绘制背景而导致的闪烁(因为我使用绘制方法绘制TLP,是的,我需要TLP,因为它包含许多用于控制目的的控件。所以我的代码如下:
public static bool FlickerPanel = false;
public class FlickerTableLayoutPanel : TableLayoutPanel
{
protected override void OnPaintBackground(PaintEventArgs e)
{
if (FlickerPanel)
base.OnPaintBackground(e);
}
}
然后在我的绘画方法中我得到了它自己的背景。所以在运行时它很好。
编辑:我发现了问题的根源。通过重写OnPaintBackground,它会禁用设计器绘制背景的任何代码。如果我一起删除覆盖它没有图形故障。
protected override void OnPaintBackground(PaintEventArgs e)
{
base.OnPaintBackground(e);
}
即使上面的代码也禁用了设计视图渲染并导致图形故障。任何帮助非常感谢!
答案 0 :(得分:4)
我在检测表单是否处于设计模式时也遇到了问题。我解决了它如下:
首先,我必须编写一个IsDesignMode()
方法:
public static bool IsDesignMode(Control control)
{
if (LicenseManager.UsageMode == LicenseUsageMode.Designtime) // Initial quick check.
{
return true;
}
while (control != null)
{
System.ComponentModel.ISite site = control.Site;
if ((site != null) && (site.DesignMode))
return true;
control = control.Parent;
}
return false;
}
我将该方法放在共享库程序集中(以下示例中的命名空间“Windows.Forms.Utilities”),因为我在很多项目中使用它。
然后,对于我需要知道它是否处于设计模式的每个用户或自定义控件,我必须添加private bool _isDesignMode
字段并覆盖OnHandleCreated()
,如下所示:
protected override void OnHandleCreated(EventArgs e)
{
base.OnHandleCreated(e);
_isDesignMode = Windows.Forms.Utilities.IsDesignMode(this);
}
然后我可以在任何需要的地方使用_isDesignMode
。
答案 1 :(得分:1)
你可以用On语句包围OnPaintBackground方法中的代码,以检测你的设计时间是否如下:
if (System.ComponentModel.LicenseManager.UsageMode ==
System.ComponentModel.LicenseUsageMode.Designtime)
答案 2 :(得分:1)
我只想对@ matthew-watson提供的解决方案进行轻微升级。作为一种扩展方法,语法变得更加令人愉悦。
public static partial class ExtensionMethods
{
public static bool IsInDesignMode(this Control source)
{
var result = LicenseManager.UsageMode == LicenseUsageMode.Designtime;
while (result == false && source != null)
{
result = source.Site != null && source.Site.DesignMode;
source = source.Parent;
}
return result;
}
}
并像这样使用
protected override void OnPaintBackground(PaintEventArgs pevent)
{
if (this.IsInDesignMode())
{
base.OnPaintBackground(pevent);
}
}
答案 3 :(得分:0)
不做任何事情onPaintBackground()
功能。它可以防止绘制backgroundImage并修复闪烁。
protected override void OnPaintBackground(PaintEventArgs e)
{
}