2013-12-13 83 views
0

我有一個UserControl。我可以移動一個酒吧。當移動時發生持續事件時移動條凍結

每當酒吧被移動時,一個事件正在發射。當我沒有訂閱任何事件一切都很好。當我移動酒吧時,酒吧被畫在正確的位置。

但是,當我訂閱的東西,控制的塗料方法似乎太慢。我的酒吧不動,但我的事件正在發射。當你停止移動欄杆時,它會再次被繪製在正確的位置。

我該如何解決這個凍結問題?只有在平局之後纔開火?我試圖在OnPaint方法結束時調用事件,但這並沒有解決問題。

protected override void OnPaint(PaintEventArgs e) 
{ 
    Bitmap btm = new Bitmap(_drawRectangle.Width, _drawRectangle.Height); 
    using (Graphics gfx = Graphics.FromImage(btm)) 
    { 
    ... //draw bar, etc. 
    } 
    this.drawbox.Image = btm; 

    base.OnPaint(e); 

    //if (PositionChanged != null) PositionChanged(...); 
} 

當事件不是一舉一動時,這不是問題。它也可以是酒吧的每一個新的繪製。

+0

您應該調查事件處理程序中的哪個操作導致放緩。那裏有什麼?如果您每x毫秒執行一次該操作,而不是每次移動事件被觸發時,都可以嗎? – Marton

回答

3

塗料是低優先級的操作,它只會在沒有其他需要完成的情況下發生。所以問題不在於你的OnPaint()方法很慢,而是你編寫的「訂閱某事」代碼。如果速度夠慢,那麼可能會有另一個MouseMove通知等待「完成」代碼完成時處理。這導致它再次運行。因此,不再出現任何繪畫,並且用戶界面看起來「凍結」,直到您停止移動鼠標。

您可以通過在任何事件中調用this.Update()來解決問題。這迫使OnPaint()運行。這種權衡可能會引人注意,「酒吧」會更加生澀。您必須編寫更高效的代碼才能使其再次平滑。

值得注意的是,您的位圖繪製代碼看起來相當糟糕,指派一個PictureBox的Image屬性導致另一個 paint事件觸發。通過直接繪製e.Graphics來取得成功,因此完全不需要這個圖片框。在構造函數中設置this.DoubleBuffered = true以抑制閃爍。

+0

不使用第二個圖形,它沒有任何問題。謝謝。 – fedab

相關問題