拖放图片C#UWP

时间:2017-05-18 12:56:08

标签: c# bitmap drag-and-drop stream uwp

我的应用程序可以拍摄图像的某些部分并将其拖放到同一个应用程序的另一个实例上。

问题在于,当我开始拖动图像时,我总是将图像作为完整图像。我已经设法改变了这个

private void DragOver(object sender, DragEventArgs e)
{
    e.AcceptedOperation = DataPackageOperation.Copy;
    if (currentlyDraggedElement != null)
        e.DragUIOverride.SetContentFromBitmapImage(currentlyDraggedElement);
}

但是当这个拖动退出应用程序的第一个实例时,它仍会返回到原始图像,而不仅仅是被拖动的部分。 (在另一个应用程序丢弃时,我只得到那一部分,但拖动似乎我拖动整个图片)

为什么会发生这种情况,我该如何解决?

尝试1:

通过将img.Source设置为创建表单流的位图来更改DragStarting中的原始图像,而不设置内容我仍然看到完整图像

尝试2:

args.Data.Properties.Thumbnail= RandomAccessStreamReference.CreateFromStream(iRandomAccessStream);

尝试3: 在DragStarting里面我有我想要的图像流,从那个IRandomAccessStream我可以创建softwareBitmap

var deferral = args.GetDeferral();
args.DragUI.SetContentFromSoftwareBitmap(softwareBitmap);
deferral.Complete();

尝试4: 从当前流

创建BitmapImage
args.DragUI.SetContentFromBitmapImage(bitmapImage);

不工作

1 个答案:

答案 0 :(得分:0)

  

问题在于,当我开始拖动图像时,我总是将图像作为图标

如果要在拖动时更改显示的图像,则需要更新DragUI,因此第一种和第二种方式不起作用。第三种方式应该运作良好。

对于SetContentFromSoftwareBitmap,以下是已完成的测试代码,可以参考:

var deferral = args.GetDeferral();
StorageFile dragshow = await StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appdata:///local/caffecut.png"));
SoftwareBitmap softwareBitmap;
using (IRandomAccessStream currentstream = await dragshow.OpenAsync(FileAccessMode.ReadWrite))
{
    BitmapDecoder decoder = await BitmapDecoder.CreateAsync(currentstream);
    softwareBitmap = await decoder.GetSoftwareBitmapAsync();
}
args.DragUI.SetContentFromSoftwareBitmap(softwareBitmap);
deferral.Complete();

您还可以测试official sample的方案2。因此,请检查您的softwareBitmap是否正确。

对于SetContentFromBitmapImage,如果您从uri创建BitmapImage,则可以直接使用以下代码:

currentlyDraggedElement = new BitmapImage(new Uri("ms-appdata:///local/caffecut.png"));
args.DragUI.SetContentFromBitmapImage(currentlyDraggedElement);

但是,如果您将IRandomAccessStream设置为BitmapImage,则需要添加deferral,因为SetSource方法是异步的。否则它可能会保留原始图像。代码如下:

var deferral = args.GetDeferral();
StorageFile dragshow = await StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appdata:///local/caffecut.png"));
using (IRandomAccessStream currentstream = await dragshow.OpenAsync(FileAccessMode.ReadWrite))
{
    await currentlyDraggedElement.SetSourceAsync(currentstream);
}
args.DragUI.SetContentFromBitmapImage(currentlyDraggedElement);
deferral.Complete();

以上所有样本都在DragStarting事件内。由于我不确定如何获得IRandomAccessStream,如果您仍然遇到问题,可以尝试将零件图像保存到本地文件夹并再次尝试上述代码。

结果:

enter image description here