2008-11-16 24 views
2

我有一個所有者繪製的UserControl,我實現了雙緩衝。爲了獲得雙緩衝無頻閃工作,我必須覆蓋OnPaintBackground事件,如下所示:在C#/ .NET 2.0中控制雙緩衝自繪用戶控件的設計器外觀

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

這在運行時的偉大工程。問題是,當我在設計時在窗體上有一個控件的實例時,它會變成一個黑洞,顯示任何窗口拖過它的路徑(因爲OnPaintBackground事件的重寫也控制着設計時的外觀)。這只是一個表面上的問題,但它在視覺上有些震撼,它總是讓項目的新開發人員承擔一些可怕的錯誤。

是否有任何方法可以在設計時重寫這樣的重寫方法,或者是否有其他解決方案?

+0

是有一些原因,你不能使用內置的雙緩衝? – 2008-11-16 02:34:38

+0

是的 - 它不起作用。如果您使用DoubleBuffered = true創建用戶控件,然後對其執行一堆繪圖操作,則會出現閃爍。我真的不確定那是什麼財產。 – MusiGenesis 2008-11-16 02:45:14

回答

3

Steven Lowe的解決方案不幸覆蓋了所有情況,特別是當用戶控件進入圖片時。

this.DesignMode標誌非常具有欺騙性。它唯一的範圍是檢查直接父母是否在設計師之內。

舉例來說,如果你有一個A型,和用戶控件B,在設計師:

  • A.DesignMode在設計師看時爲真觀看一個時
  • B.DesignMode是假的,但在設計師直接看B的時候纔是真實的。

的解決方案是一個特殊的標誌檢查(遺憾的醜陋C++代碼):

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

此變量將始終顯示適當的設計布爾值。

2
if (this.DesignMode) 
{ 
    return; //or call base.OnPaintBackground() 
} 
+0

不幸的是,你的soloution在所有情況下都不起作用,請參閱greggorob64的帖子。我第一次遇到了使用你的代碼的麻煩。 -1,對不起。 – Marcel 2010-02-03 20:49:14

2

greggorob64 C#中的解決方案:

if (DesignMode || LicenseManager.UsageMode == LicenseUsageMode.Designtime) 
{ 
    return; 
}