2009-07-22 19 views
7

DragEnterおよびDragLeaveイベント中に、ドラッグターゲットコントロールをトリガして(無効またはリフレッシュを介して)自分自身を再描画したいと思います。それは実際にこれらのイベント内)のOnPaintメソッドは、最新の情報に更新(によって呼び出されていない、コントロールを再描画しませんドラッグアンドドロップ中の再描画

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???  
} 

:コードは次のようになります。これを行う方法はありますか?私はここで何かを理解してはいけません。

更新: jasonhが提供する回答は実際には機能しません。 Invalidate()またはInvalidate(rect)を使用すると、コントロールは実際には更新されません。これは、の間に、ドラッグ&ドロップアクションであると呼ばれています。他のアイデア?ドラッグアンドドロップ中にコントロールの再描画をトリガーできますか?ありがとう!

更新日2:サンプルプロジェクトを作成しましたが、ではなく、になりました。一言...私は最終的に問題を引き起こしていたOnPaintのいくつかのコードを追跡しました。だから、これはデバッガがどのように働いたかを理解していない私より多くのものでした(OnPaintのブレークポイントを打つことは決してありませんでした。 Invalidate()、Refresh()は両方とも動作します。 JasonHは最終的に正しいと答えただけでなく、コントロールの一部を無効にする方法を示した...私はそれについて知らなかった。

ありがとうございました!

+0

あなたはAllowDropをtrueに設定していないと思います。 – jasonh

+0

はい、AllowDropがtrueに設定されています。ドラッグ&ドロップが起こっています。コントロールの再描画だけではありません(OnPaintはInvalidate()またはRefresh()の後に呼び出されません)。 –

答えて

4

this.Invalidate()を呼び出して、フォーム/コントロールを再描画するようにします。特定の領域がわかっている場合は、オーバーロードされたメソッドの1つを呼び出して無効にするものを指定します。例:

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

これは、ドラッグ対象の周囲の50ピクセルの領域を無効にします。

+2

これは機能しませんでした。問題は、特にドラッグアンドドロップイベント中にこれを行うことに関するものでした。それはあなたのために働く場合、私は間違っている何かがある必要があります... ... –

+1

私はdownvotedされている理由はわかりません、なぜならInvalidateは、 – jasonh

+0

UserControlにAllowDropプロパティがtrueに設定されていることを確認します。私は単純なプロジェクトでこれをテストしました。文字列はコントロールに描画され、ユーザーがコントロールにドラッグしているかどうかに基づいて色が変更されます。あなたがそれを修正するのを助けることができるように、私は働かないプロジェクトの例を投稿できますか? – jasonh

2

3つの一見適用可能な方法がここにあります

Control.Invalidate() - 再塗装を必要としているように、制御(地域、または長方形)をマークしたが、再描画 強制するものではありません、他のすべては を持っていたときに再描画がトリガされます世話をされ、アプリはアイドルになります。

Control.Update() - の部分が無効になっている場合、コントロールは直ちに再描画します。

Control.Refresh() - コントロールを無効にしてから更新します(直ちに を再描画します)。

したがって、Refresh()は正しいアプローチです。私は、リフレッシュメソッド呼び出しにブレークポイントを設定し、ヒットしたかどうかを確認します。

+0

ヒットしています。実行されますが、実際にOnPaintが呼び出されることはありません。 –

関連する問題