私は Excel-DNA XLL を構築しています。フォームの 1 つは、ユーザーが ListView から Excel ワークシート (または他の Microsoft Office ドキュメント) に画像をドラッグ アンド ドロップできるようにします。これは簡単に思えましたが、私の最初の解決策では透明性が失われました。
string name = myListView.FocusedItem.ImageKey;
var image = myListView.LargeImageList.Images[name];
myListView.DoDragDrop(image, DragDropEffects.All);
画像を PNG 形式で MemoryStream に保存し、Clipboard.SetData() を使用して、コピーと貼り付けを機能させることができました。これをさらに一歩進めて、画像を DoDragDrop メソッドに貼り付けました。これは機能します。
string name = myListView.FocusedItem.ImageKey;
var image = myListView.LargeImageList.Images[name];
using (var stream = new MemoryStream())
{
image.Save(stream, ImageFormat.Png);
Clipboard.SetData("PNG", stream);
myListView.DoDragDrop(Clipboard.GetDataObject(), DragDropEffects.All);
}
クリップボードの内容を変更したくないのですが、それを避けようとすると、データのドロップが拒否されます。
string name = myListView.FocusedItem.ImageKey;
var image = myListView.LargeImageList.Images[name];
using (var stream = new MemoryStream())
{
image.Save(stream, ImageFormat.Png);
IDataObject data = new DataObject("PNG", stream);
myListView.DoDragDrop(data, DragDropEffects.All);
}
これはメモリ ストリームと関係があり、おそらくコピー アンド ペーストによってストリーム全体が強制的に読み取られると確信しています。本当にわかりませんが、どちらにしても、クリップボードを使用するための回避策が見つからないようです。