0

我必须禁用OnPaintBackgroundon myTableLayoutPanel以消除首先绘制的背景引起的闪烁(因为我正在使用 paint 方法在 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

4 回答 4

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在任何需要的地方使用。

于 2013-06-19T07:50:08.713 回答
1

您可以使用 if 语句将 OnPaintBackground 方法中的代码包围起来,以检测您在设计时是否像这样:

if (System.ComponentModel.LicenseManager.UsageMode ==
System.ComponentModel.LicenseUsageMode.Designtime)
于 2013-06-19T07:35:21.853 回答
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);
    }
}
于 2015-04-07T21:55:48.720 回答
0

只是什么都不做onPaintBackground()。它可以防止 backgroundImage 被绘制并且应该修复闪烁。

protected override void OnPaintBackground(PaintEventArgs e)
{
}
于 2013-12-13T07:35:36.853 回答