2011-02-14 24 views
8

我已經寫了用戶控件其行爲類似一個ContainerControl,但完全是由WindowsForms畫(我從UserControl繼承)的BeginUpdate()EndUpdate的用戶控件

我想避免畫的控制,同時我正在填充它,所以我需要寫一些類似於BeginUpdate() - EndUpdate()的東西。

當控件是用戶繪製的時候,這很容易實現,但在這種情況下,我不確定如何繼續。

回答

11

您可以使用掛起/恢復佈局。例如

private void BeginUpdate() 
{ 
    this.SuspendLayout(); 
    // Do paint events 
    EndUpdate(); 
} 

private void EndUpdate() 
{ 
    this.ResumeLayout(); 
    // Raise an event if needed. 
} 

如果你有興趣在懸掛控制的繪畫和它的孩子們,看看這個SO問題:Suspend Control and Children Painting

+4

據我所知,SuspendLayout不一定會停止繪畫的控制。它主要用於容器,比如FlowLayoutPanel,它對子級執行佈局操作。它將用於避免每次向面板添加控件時執行佈局操作,例如在循環中。我可能是錯的,但如果你有任何問題,我會喜歡一些更多的信息。 – Craigt 2011-02-14 16:04:28

1

您可以覆蓋OnPaint方法,只通過控制回base.OnPaint ()滿足一定條件時。

private bool _doPaint = true; 
    protected override void OnPaint(PaintEventArgs e) 
    { 
     if(_doPaint) 
      base.OnPaint(e); 
    } 

然後處理_doPaint變量設置爲與公共的方法或屬性的適當值。

您可能必須以類似的方式重寫OnPaintBackground(),具體取決於您的需要。

+0

我選擇了這種方法。由於我的控件是用於其他開發人員使用的,我還添加了一個安全定時器,以便在代碼不能正常打開時重新啓用`_doPaint` 1500ms。 – QuickDanger 2017-09-08 20:45:57