C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

C# WPFで、エクスプローラへドラッグ&ドロップ

[トピック内 8 記事 (1 - 8 表示)]  << 0 >>

■86143 / inTopicNo.1)  C# WPFで、エクスプローラへドラッグ&ドロップ
  
□投稿者/ きみのぶ (27回)-(2017/12/21(Thu) 14:49:28)

分類:[.NET 全般] 

C# WPF ListViewに表示したビットマップを、エクスプローラへドラッグ&ドロップして、アイコンとして保存する事を試しています。
Googleで検索してみたのですが、Formからエクスプローラへのドラッグ&ドロップのサンプルコードしか見つかりません。
WPFを使ったサンプルコードを紹介しているサイトをご存知でしたら、ぜひご教示ください。
引用返信 編集キー/
■86147 / inTopicNo.2)  C# WPFで、エクスプローラへドラッグ&ドロップ
□投稿者/ ぶなっぷ (154回)-(2017/12/21(Thu) 15:57:07)
2017/12/21(Thu) 15:59:50 編集(投稿者)
やったことないので、たぶんで回答します。

ドラッグ&ドロップはドロップ側のアプリが認識できるデータでない限り、ドロップできないはず。

今回、ドロップ先はエクスプローラですので、エクスプローラがドロップ対象として認識できるのは、ファイルです。
なので、ListViewからドラッグを開始する際、ビットマップファイルとして開始する必要があるのではないでしょうか?

というわけで、ドラッグ&ドロップ対象のビットマップをいったんTempフォルダあたりに保存します。
その後、Tempフォルダに保存したビットマップファイルをドロップしたフォルダにMoveする方法を思いつきます。

ドラッグの開始方法は以下のような感じ。
  https://msdn.microsoft.com/ja-jp/library/hh144799(v=vs.110).aspx
ただし、ファイルのドラッグ開始は、DataObjectを
  data.SetData(DataFormats.FileDrop, <ファイルパス>);
する必要があると思います。

引用返信 編集キー/
■86148 / inTopicNo.3)  Re[2]: C# WPFで、エクスプローラへドラッグ&ドロップ
□投稿者/ ぶなっぷ (155回)-(2017/12/21(Thu) 16:05:06)
WindowsFormsの例がありました。
  http://www.atmarkit.co.jp/fdotnet/dotnettips/384expdragdrop/expdragdrop.html
WPFでも大きくは変わらないはずなので、参考になるかと思います。

引用返信 編集キー/
■86150 / inTopicNo.4)  Re[2]: C# WPFで、エクスプローラへドラッグ&ドロップ
□投稿者/ きみのぶ (29回)-(2017/12/21(Thu) 17:51:38)
No86147 (ぶなっぷ さん) に返信
> 2017/12/21(Thu) 15:59:50 編集(投稿者)
>
> やったことないので、たぶんで回答します。
>
> ドラッグ&ドロップはドロップ側のアプリが認識できるデータでない限り、ドロップできないはず。
>
> 今回、ドロップ先はエクスプローラですので、エクスプローラがドロップ対象として認識できるのは、ファイルです。
> なので、ListViewからドラッグを開始する際、ビットマップファイルとして開始する必要があるのではないでしょうか?
下記のコードで、ドラッグを開始する事は出来ました。
private void listView1_MouseMove(object sender, System.Windows.Input.MouseEventArgs e)
{
if(e.LeftButton == MouseButtonState.Pressed)
{
Icon selectedIcon = this.GetSelectedIcon();

System.Windows.DataObject dataObject = new System.Windows.DataObject();
dataObject.SetData(System.Windows.DataFormats.Bitmap, selectedIcon.ToBitmap());

DragDrop.DoDragDrop(this, dataObject, System.Windows.DragDropEffects.Copy);
}
}
但し、エクスプローラへドロップ出来ません。



>
> というわけで、ドラッグ&ドロップ対象のビットマップをいったんTempフォルダあたりに保存します。
> その後、Tempフォルダに保存したビットマップファイルをドロップしたフォルダにMoveする方法を思いつきます。
ドロップ先のフォルダは、どうやって取得すればいいのでしょうか?


>
> ドラッグの開始方法は以下のような感じ。
> https://msdn.microsoft.com/ja-jp/library/hh144799(v=vs.110).aspx
> ただし、ファイルのドラッグ開始は、DataObjectを
> data.SetData(DataFormats.FileDrop, <ファイルパス>);
> する必要があると思います。
>
引用返信 編集キー/
■86152 / inTopicNo.5)  Re[3]: C# WPFで、エクスプローラへドラッグ&ドロップ
□投稿者/ 腹減った (1回)-(2017/12/21(Thu) 18:32:02)
2017/12/21(Thu) 18:33:10 編集(投稿者)

No86150 (きみのぶ さん) に返信

> 但し、エクスプローラへドロップ出来ません。

エクスプローラはファイル名しか認識出来ないって上で書かれてますよね
つまりDataObjectは
New DataObject(DataFormats.FileDrop, String())
でなくちゃいかんつーことなんですが

> ドロップ先のフォルダは、どうやって取得すればいいのでしょうか?

だからドロップ先の処理はドロップ先がやるのだからこちら側で知る必要は無いと言ってるでしょう?
せいぜいファイルの後始末がめんどうならDragDropEffectsをMoveにするくらい

引用返信 編集キー/
■86153 / inTopicNo.6)  Re[2]: C# WPFで、エクスプローラへドラッグ&ドロップ
□投稿者/ きみのぶ (30回)-(2017/12/21(Thu) 19:46:15)
No86147 (ぶなっぷ さん) に返信
ぶなっぷ 様
アドバイスありがとうございます。

> 2017/12/21(Thu) 15:59:50 編集(投稿者)
> 
> やったことないので、たぶんで回答します。
> 
> ドラッグ&ドロップはドロップ側のアプリが認識できるデータでない限り、ドロップできないはず。
> 
> 今回、ドロップ先はエクスプローラですので、エクスプローラがドロップ対象として認識できるのは、ファイルです。
> なので、ListViewからドラッグを開始する際、ビットマップファイルとして開始する必要があるのではないでしょうか?
> 
> というわけで、ドラッグ&ドロップ対象のビットマップをいったんTempフォルダあたりに保存します。
> その後、Tempフォルダに保存したビットマップファイルをドロップしたフォルダにMoveする方法を思いつきます。

以下のコードを試してみました。

                Icon icon = this.GetSelectedIcon();

                //  Tempフォルダへアイコンを一時保存
                String iconPath = System.IO.Path.GetTempPath() + "新しいアイコン.ico";
                using (FileStream fileStream = new FileStream(iconPath, FileMode.Create, FileAccess.Write))
                {
                    try
                    {
                        icon.Save(fileStream);
                        fileStream.Close();
                    }
                    catch(Exception exception)
                    {
                        System.Windows.MessageBox.Show(exception.Message, "アイコンの一時保存失敗");
                        return;
                    }
                }

                //  保存したアイコンを移動
                System.Windows.DataObject dataObject = new System.Windows.DataObject();
                dataObject.SetData(System.Windows.DataFormats.FileDrop, iconPath);

                DragDrop.DoDragDrop(this, dataObject, System.Windows.DragDropEffects.Move);

すると、Tempフォルダには"新しいアイコン.ico"が保存されるのですが、エクスプローラのドラッグ先には移動出来ません。
DragDropEffects.Copyも試してみましたが、コピーされません。
何がいけないのでしょうか?
出来ましたら、アドバイスをお願い致します。





> 
> ドラッグの開始方法は以下のような感じ。
>   https://msdn.microsoft.com/ja-jp/library/hh144799(v=vs.110).aspx
> ただし、ファイルのドラッグ開始は、DataObjectを
>   data.SetData(DataFormats.FileDrop, <ファイルパス>);
> する必要があると思います。
> 

引用返信 編集キー/
■86154 / inTopicNo.7)  Re[3]: C# WPFで、エクスプローラへドラッグ&ドロップ
□投稿者/ Hongliang (588回)-(2017/12/21(Thu) 20:13:10)
前のスレッドでも書きましたが、FileDropで使用するデータ型は string[] です。
引用返信 編集キー/
■86155 / inTopicNo.8)  Re[4]: C# WPFで、エクスプローラへドラッグ&ドロップ
□投稿者/ きみのぶ (31回)-(2017/12/21(Thu) 20:27:06)
No86154 (Hongliang さん) に返信
> 前のスレッドでも書きましたが、FileDropで使用するデータ型は string[] です。

Hongliang 様
出来ました。
何度も何度ものアドバイス、本当にありがとうございました。
解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ