2

ダブルバッファリングを実装した所有者描画の UserControl があります。ダブルバッファリングをフリッカーなしで機能させるには、次のように OnPaintBackground イベントをオーバーライドする必要があります。

protected override void OnPaintBackground(PaintEventArgs e)
{
    // don't even have to do anything else
}

これは実行時にうまく機能します。問題は、デザイン時にコントロールのインスタンスをフォーム上に置くと、その上にドラッグされたウィンドウの軌跡を示すブラック ホールになることです (OnPaintBackground イベントのオーバーライドがデザイン時の外観も制御するため)。これは表面的な問題にすぎませんが、視覚的に不快であり、プロジェクトの新しい開発者は常に、何かがひどく間違っていると思い込んでしまいます。

このようなオーバーライドされたメソッドを設計時にオーバーライドしないようにする方法はありますか、それとも別の解決策がありますか?

4

3 に答える 3

3

残念ながら、Steven Lowe のソリューションはすべてのシナリオをカバーしており、特にユーザー コントロールが関係している場合はそうです。

this.DesignMode フラグは非常に欺瞞的です。その唯一のスコープは、直接の親がデザイナー内にあるかどうかを確認することです。

たとえば、デザイナーに Form A と UserControl B がある場合:

  • A.DesignMode は、デザイナーで表示すると true
  • B.DesignMode は、A を表示する場合は false ですが、デザイナーで B を直接見る場合は true です。

これに対する解決策は、チェックする特別なフラグです (見苦しい C++ コードで申し訳ありません)。

 if(this->DesignMode || 
    LicenseManager::UsageMode == LicenseUsageMode::Designtime) 
    return;

この変数は常に適切なデザインのブール値を示します。

于 2009-09-02T17:26:33.557 に答える
2

greggorob64C# での解決策:

if (DesignMode || LicenseManager.UsageMode == LicenseUsageMode.Designtime) 
{
    return;
}
于 2010-02-03T20:47:59.240 に答える
2
if (this.DesignMode)
{
    return;    //or call base.OnPaintBackground()
}
于 2008-11-16T02:25:01.713 に答える