0

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

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

OnPaintBackground メソッドのコードを if ステートメントで囲み、次のように設計時に検出することができます。

if (System.ComponentModel.LicenseManager.UsageMode ==
System.ComponentModel.LicenseUsageMode.Designtime)
于 2013-06-19T07:35:21.853 に答える
0

何もonPaintBackground()機能しません。backgroundImage が描画されるのを防ぎ、ちらつきを修正する必要があります。

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