重写OnPaintBackground会使Designer视图出现异常

时间:2013-06-19 07:31:24

标签: c# winforms

我必须禁用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);
        }

即使上面的代码也禁用了设计视图渲染并导致图形故障。任何帮助非常感谢!

4 个答案:

答案 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)
{
}