2009-12-11 9 views
21

ドラッグは「ソース」から「ターゲット」まで発生します。 DragDropEffects.CopyとしてallowEffectsでDoDragDrop()を呼び出すと、ターゲット(DragOverイベント)にEffects = DragDropEffects.Noneを設定してドロップをキャンセルできます。Effects = DragDropEffects.Noneが設定されていてもドロップが許可されるのはなぜですか?

ただし、allowedEffectsをDragDropEffects.Moveとして設定すると、同じ状況が失敗します。 ..

void Window1_DragOver(object sender, DragEventArgs args) 
{ 
    args.Effects = DragDropEffects.None; 

を行を追加してもコメントアウトし、状況を再現(DragDropEffects.Moveへ)http://jaimersamples.members.winisp.net/samples/dragdrop/drag.zip

変更ライン..

DragDrop.DoDragDrop(this.DragSource, data, DragDropEffects.Copy); 

からサンプルをダウンロードするに

全体、DragSource_GiveFeedback ..

void DragSource_GiveFeedback(object sender, GiveFeedbackEventArgs e) 
{ 
    //System.Diagnostics.Debug.WriteLine("DragSource_GiveFeedback " + e.Effects.ToString()); 

フレームワークに何らかのバグがありますか、それとも明らかに何かを見ることができませんか?

+1

サンプルの問題を再現する際に問題が発生しています。未修正のサンプルでは、​​赤いボックスをコピー先のキャンバスにドロップできません。また、DragDropEffects。*のすべてのインスタンスは既に.Moveに設定されているため、変更する必要があるコード行が不明です。その価値については、それらをすべてDragDropEffects.Copyに変更しましたが、アイテムを宛先キャンバスにドロップできませんでした。 –

+0

私は意図した効果を表示するためにスクリーンショットを撮ることができません。マウスカーソルはスクリーンショットには含まれていませんが、私は質問を言い換えるつもりです。 サンプルは赤いボックスのドロップを実装していません。単にドラッグを開始します。私が望むのは、マウスカーソルは、ドロップが許可されているかどうかを常に示しているということです。 DragDropEffects.CopyでDoDragDrop()を呼び出し、Window1_DragOverでargs.Effects = DragDropEffects.Noneを設定すると動作します。しかし、私はDragDropEffects.MoveでDoDragDrop()を呼び出すと動作しません。 – Trainee4Life

+0

フィードバック中にエフェクトを設定する必要はありませんか? – leppie

答えて

53

あなたのコメントとコードをもう一度読み進めて、何らかの努力をして、あなたが話している問題を理解し、再現することができました。あなたのWindow1_DragOverイベントで

e.Handled = true; 

:あなたが不足しているもの

はラインです。これを追加すると、DragDropEffects.MoveDragDropEffects.Copyの両方で同じように動作します。

なぜDragDropEffects.Copyに設定されていないのですか?e.Handledは、最初は誰でも推測できます。文書化されていない条件は、文書化されていない動作につながります。

次に、の可能なコードを含むコードサンプルを次に送信して、問題を再現することを強く推奨します。私は最初の混乱をお詫びしますが、それにもかかわらず、この中で何が起こっていたのか把握することは非常に困難でした。

+0

1.ドラッグの範囲をウィンドウ全体に表示すると、マウスがドラッグしてドラッグした場合にドラッグをキャンセルするだけのチェックです。 2.私の質問は、GiveFeedback全体をコメントアウトする必要があると具体的に言います。 3.私はデータを受け入れるかどうかを指定するのがドロップターゲットであることを理解しています。ドロップターゲットは、DragOverイベントを使用して、args.Effects = DragDropEffects.Noneを設定してドロップを受け入れるかどうかを指定します。この場合、コピーまたは移動エフェクトも設定できます。 4. DragSourceでは、DragDrop.DoDragDrop()呼び出しで許可されたエフェクトを指定できます。 – Trainee4Life

+0

5.コードは本番環境で使用されていません。これは、アプリケーションでドラッグドロップフレームワークを作成したときに調べたサンプルの1つでした。 – Trainee4Life

+0

私が言うことを再現することができれば、あなたはより良い立場になるでしょう。 – Trainee4Life

1

DoDragDrop関数メソッドに渡された初期DragDropEffectが考慮されるべきである私は、質問がよく、上記答えたと思いますが、私はちょうどこれはドラッグ&ドロップを行うとき、私は学んだ貴重な教訓だと思った...

どのような操作が行われるべきかの示唆(または欲求)として。正しく覚えていれば、そのメソッドは、ドラッグアンドドロップが実際に成功した(キャンセルされなかった)場合、ターゲットが実行した実際の効果を返します。

これにより、送信元と送信先の間に簡単な通信プロトコルが作成され、主にドラッグ対象のターゲットが複数ある場合に役立ちます。実際に何が起こったかを区別することができます。これは、あなたが知らないコンポーネントや期待していないコンポーネントと対話している可能性があるため、考えるのが特に便利です。これを考慮すると、突然他のコンポーネントが他の明示的なコーディングなしで相互運用できるため、当初計画されていたドラッグアンドドロップがより便利になるという驚くべき利点が得られることがあります。

これが言われて、私はそれが理にかなっていると思います。1つの操作が建設的で、もう1つが破壊的であるため、コピーと移動操作を異なる方法で処理するためのネットフレームワークです。私は、彼らが望ましくない破壊的な操作から明示的に処理されることなく発生するのを防ぐことを試みていると思います。これはわかりませんが、ちょっと考えました:)

関連する問題