none
ドラッグ&ドロップについて教えてください。 RRS feed

  • 質問

  • いつもお世話になります。
    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)
    ドロップ先が特定の領域(ゴミ箱/アイコン/ウィンドウ/デスクトップなど)のときには、ドラッグ&ドロップをキャンセルしたいのですが、それはどのように実装するものでしょうか?

    2010年11月14日 15:18

回答

  • で、離す(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
    2010年11月15日 13:44
    モデレータ

すべての返信

  • ひょっとして、(2)は、Azuleanさんのおっしゃる、MouseCaptureをセットすることで可能になるのでしょうか?
    で、そうだとすれば、MouseCaptureをセットする方法を教えてください。
    2010年11月14日 15:21
  • ドラッグ&ドロップの操作を考えてみるとおわかりになるかもしれませんが、基本的にマウスのボタンを押し下げた状態で相手先に持って行き、ボタンを離す操作となります。
    従って、MouseUp では動作しない可能性が高いです。

    なお、Mouse Capture も原則として、ボタンが押されているときにする仕組みだと考えています。


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    2010年11月14日 21:13
    モデレータ
  • Azuleanさん、コメントありがとうございます。
    ドラッグ&ドロップは、ボタンを押し下げてオブジェクトを選択し、リリース先でボタンを離す操作です。
    その点については理解できていると思います。
    で、離す(MouseUp)で動作しない理由は、いまいちよくわかりません。
    MouseCaptureについてはまだぜんぜん理解できていないのです。
    どんなときに使い、どのように条件を設定すると動作するのかわからずにいます。いまのところ、つねにfalseだし、同様のものを自分でboolで設定するか、あるいは設定しなくても、かまわないという程度のものという理解しかないです。
    もし、MouseCaptureがどのように動くかご存じでしたら、まずはコードで教えていただけるとうれしいです。
    よろしくお願いします。
    2010年11月15日 3:47
  • で、離す(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
    2010年11月15日 13:44
    モデレータ
  • (2)
    ドロップ先が特定の領域(ゴミ箱/アイコン/ウィンドウ/デスクトップなど)のときには、ドラッグ&ドロップをキャンセルしたいのですが、それはどのように実装するものでしょうか?

    OLE D&D 関連のインターフェースを駆使すればできたかもしれませんが、詳しく覚えていません。
    正直、この方針で検討することはおすすめしません。
    OLE D&D のインターフェースについて理解すること、COM の知識が必要であることから、手間がかかりすぎると考えます。

    逆に自分の作ったフォーム、ウィンドウ、コントロールにしか認めたくないのであれば、DoDragDrop で渡す際に工夫すれば、ほかのアプリからは「認識できないデータ」として処理され、ドラッグ&ドロップのカーソルが禁止マークになるとは思いますが。
    たとえば、DataObject.SetData の第 1 引数を独自の文字列にすると、ほかの未対応アプリでは禁止マークになるでしょう。


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    2010年11月16日 14:04
    モデレータ