2009-07-22 51 views
7

我想在DragEnter和DragLeave事件中觸發拖動目標控件重繪自己(通過無效或刷新)。代碼看起來是這樣的:在拖放過程中重繪

protected override void OnDragEnter (DragEventArgs drgargs) 
{ 
    //-- Set a property that affects drawing of control, then redraw 
    this.MyProperty = true; 
    this.Refresh(); //-- Does nothing???  
} 

protected override void OnDragLeave (EventArgs e) 
{ 
    //-- Set a property that affects drawing of control, then redraw 
    this.MyProperty = false; 
    this.Refresh(); //-- Does nothing???  
} 

實際上它並不重繪控制,OnPaint方法不被刷新()這些事件中調用。有沒有辦法做到這一點?我不能在這裏理解一些東西。

更新:傑森提供的答案實際上並不工作。當使用Invalidate()或Invalidate(rect)時,控件不會實際更新。這是期間拖放操作。任何其他想法?你可以觸發一個控制重繪期間拖放?謝謝!

更新2:我創建了一個示例項目,無法得到這個工作。唉......我終於把它追蹤到了導致問題的OnPaint中的一些代碼。所以,結果更多的是我不瞭解調試器的工作方式(它從來沒有在OnPaint中達到斷點...仍然不知道爲什麼)。 Invalidate(),Refresh()都可以工作。 JasonH得到了答案,因爲它最終是正確的,並且還顯示瞭如何使控制的一部分失效......我不知道這一點。

感謝您的幫助!

+0

我的猜測是你沒有設置AllowDrop爲true。 – jasonh 2009-07-23 20:39:35

+0

是的,AllowDrop設置爲true。拖放正在發生。只是重繪控件不是(OnPaint不會在Invalidate()或Refresh())之後調用。 – 2009-07-24 16:22:53

回答

4

致電this.Invalidate()讓窗體/控件重繪自己。如果您知道特定的區域,則調用其中一個重載方法來指定要失效的內容。例如:

Rectangle toInvalidate = new Rectangle(drgargs.X - 50, drgargs.Y - 50, 50, 50); 
this.Invalidate(toInvalidate); 

這將使拖動目標區域周圍的50個像素區域失效。

+2

這沒有奏效。這個問題特別是在拖放事件期間做這件事。如果它對你有用,肯定會有一些我做錯的... ... – 2009-07-23 01:50:30

2

這裏有三個看似適用的方法:

Control.Invalidate() - 標誌着控制(區,或矩形)爲需要重新繪製,但 不強制重新粉刷,當一切有 重繪被觸發被照顧和應用程序變得閒置。

Control.Update() - 導致控件立即重新繪製,如果任何部分已被 無效。

Control.Refresh() - 導致控件失效,然後更新(立即重新繪製 )。

因此,刷新()是正確的方法。我會做的是在刷新方法調用上設置一個斷點,並查看它是否被打中。