トップ回答者
ドラッグ&ドロップについて教えてください。

質問
-
いつもお世話になります。
VisualC#2010、WindowsXPでの動作について質問があります。ドラッグ&ドロップについて教えてください。
DoDragDropは、MouseDownに割り当てる必要があるのでしょうか?
(1)
private void rect_MouseDown(object sender, MouseButtonEventArgs e){
DataObject data = new DataObject();
data.SetData(DataFormats.FileDrop, new string[] {fileName});
DragDrop.DoDragDrop(image, data, DragDropEffects.All);
}
を
private void rect_MouseUp(object sender, MouseButtonEventArgs e){
DataObject data = new DataObject();
data.SetData(DataFormats.FileDrop, new string[] {fileName});
DragDrop.DoDragDrop(image, data, DragDropEffects.All);
}
とすると、ドラッグ&ドロップできなくなります。この理由を知りたいです。
(2)
ドロップ先が特定の領域(ゴミ箱/アイコン/ウィンドウ/デスクトップなど)のときには、ドラッグ&ドロップをキャンセルしたいのですが、それはどのように実装するものでしょうか?
回答
-
で、離す(MouseUp)で動作しない理由は、いまいちよくわかりません。
マウスボタンが離されている状態だとドラッグ&ドロップが終了したとみなされるからです。
Windows Forms で実験する限り、マウスカーソルを少しでも動かしたとたんにドロップされたというイベントが発生していました。
ゆえに、「仕様です」としか言えません。MouseCaptureについてはまだぜんぜん理解できていないのです。
どんなときに使い、どのように条件を設定すると動作するのかわからずにいます。いまのところ、つねにfalseだし、同様のものを自分でboolで設定するか、あるいは設定しなくても、かまわないという程度のものという理解しかないです。
もし、MouseCaptureがどのように動くかご存じでしたら、まずはコードで教えていただけるとうれしいです。
よろしくお願いします。私から WPF に対応したコードを提供することは、私自身 WPF の経験がないのでできませんのでご了承ください。
ただ、以下のスレッドでも同じことを問われているようですし、MouseCapture の質問はそのスレッドにまとめてはいかがでしょうか。
http://social.msdn.microsoft.com/Forums/ja-JP/csharpgeneralja/thread/8a6924ac-52cb-46c4-80df-628a352ada09/#d5ad352c-f609-42e4-a6c7-60c665d3fb68
質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。- 回答としてマーク 山本春海 2010年12月1日 7:43
すべての返信
-
Azuleanさん、コメントありがとうございます。
ドラッグ&ドロップは、ボタンを押し下げてオブジェクトを選択し、リリース先でボタンを離す操作です。
その点については理解できていると思います。
で、離す(MouseUp)で動作しない理由は、いまいちよくわかりません。
MouseCaptureについてはまだぜんぜん理解できていないのです。
どんなときに使い、どのように条件を設定すると動作するのかわからずにいます。いまのところ、つねにfalseだし、同様のものを自分でboolで設定するか、あるいは設定しなくても、かまわないという程度のものという理解しかないです。
もし、MouseCaptureがどのように動くかご存じでしたら、まずはコードで教えていただけるとうれしいです。
よろしくお願いします。 -
で、離す(MouseUp)で動作しない理由は、いまいちよくわかりません。
マウスボタンが離されている状態だとドラッグ&ドロップが終了したとみなされるからです。
Windows Forms で実験する限り、マウスカーソルを少しでも動かしたとたんにドロップされたというイベントが発生していました。
ゆえに、「仕様です」としか言えません。MouseCaptureについてはまだぜんぜん理解できていないのです。
どんなときに使い、どのように条件を設定すると動作するのかわからずにいます。いまのところ、つねにfalseだし、同様のものを自分でboolで設定するか、あるいは設定しなくても、かまわないという程度のものという理解しかないです。
もし、MouseCaptureがどのように動くかご存じでしたら、まずはコードで教えていただけるとうれしいです。
よろしくお願いします。私から WPF に対応したコードを提供することは、私自身 WPF の経験がないのでできませんのでご了承ください。
ただ、以下のスレッドでも同じことを問われているようですし、MouseCapture の質問はそのスレッドにまとめてはいかがでしょうか。
http://social.msdn.microsoft.com/Forums/ja-JP/csharpgeneralja/thread/8a6924ac-52cb-46c4-80df-628a352ada09/#d5ad352c-f609-42e4-a6c7-60c665d3fb68
質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。- 回答としてマーク 山本春海 2010年12月1日 7:43
-
(2)
ドロップ先が特定の領域(ゴミ箱/アイコン/ウィンドウ/デスクトップなど)のときには、ドラッグ&ドロップをキャンセルしたいのですが、それはどのように実装するものでしょうか?OLE D&D 関連のインターフェースを駆使すればできたかもしれませんが、詳しく覚えていません。
正直、この方針で検討することはおすすめしません。
OLE D&D のインターフェースについて理解すること、COM の知識が必要であることから、手間がかかりすぎると考えます。逆に自分の作ったフォーム、ウィンドウ、コントロールにしか認めたくないのであれば、DoDragDrop で渡す際に工夫すれば、ほかのアプリからは「認識できないデータ」として処理され、ドラッグ&ドロップのカーソルが禁止マークになるとは思いますが。
たとえば、DataObject.SetData の第 1 引数を独自の文字列にすると、ほかの未対応アプリでは禁止マークになるでしょう。
質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。