我已經寫了用戶控件其行爲類似一個ContainerControl,但完全是由WindowsForms畫(我從UserControl
繼承)的BeginUpdate()EndUpdate的用戶控件
我想避免畫的控制,同時我正在填充它,所以我需要寫一些類似於BeginUpdate()
- EndUpdate()
的東西。
當控件是用戶繪製的時候,這很容易實現,但在這種情況下,我不確定如何繼續。
我已經寫了用戶控件其行爲類似一個ContainerControl,但完全是由WindowsForms畫(我從UserControl
繼承)的BeginUpdate()EndUpdate的用戶控件
我想避免畫的控制,同時我正在填充它,所以我需要寫一些類似於BeginUpdate()
- EndUpdate()
的東西。
當控件是用戶繪製的時候,這很容易實現,但在這種情況下,我不確定如何繼續。
您可以使用掛起/恢復佈局。例如
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
您可以覆蓋OnPaint方法,只通過控制回base.OnPaint ()滿足一定條件時。
private bool _doPaint = true;
protected override void OnPaint(PaintEventArgs e)
{
if(_doPaint)
base.OnPaint(e);
}
然後處理_doPaint變量設置爲與公共的方法或屬性的適當值。
您可能必須以類似的方式重寫OnPaintBackground(),具體取決於您的需要。
我選擇了這種方法。由於我的控件是用於其他開發人員使用的,我還添加了一個安全定時器,以便在代碼不能正常打開時重新啓用`_doPaint` 1500ms。 – QuickDanger 2017-09-08 20:45:57
據我所知,SuspendLayout不一定會停止繪畫的控制。它主要用於容器,比如FlowLayoutPanel,它對子級執行佈局操作。它將用於避免每次向面板添加控件時執行佈局操作,例如在循環中。我可能是錯的,但如果你有任何問題,我會喜歡一些更多的信息。 – Craigt 2011-02-14 16:04:28