从 UWP 应用异步拖放(和拖放)

     2023-02-19     48

关键词:

【中文标题】从 UWP 应用异步拖放(和拖放)【英文标题】:Asynchronous drag (and drop) from UWP app 【发布时间】:2019-06-24 18:05:24 【问题描述】:

我正在尝试在我的 UWP 应用中实现拖放机制,以便可以轻松地将我的应用中的项目复制到其他应用中。

问题是,在拖动操作开始的那一刻,我并不总是拥有应该复制的数据。相反,我等待异步操作完成,然后才更新延迟的数据。

这就是我一直在使用的代码,基本上:

private void myGrid_DragStarting(UIElement sender, DragStartingEventArgs args)

    var deferral = args.GetDeferral();
    args.Data.RequestedOperation = DataPackageOperation.Copy;

    someAsyncFunction(async (data) => // this callback might take a few seconds to be invoked
    
            // 
            // ... some code which also invokes another function with "await"
            //

            args.Data.SetStorageItems(new[]  data );
            deferral.Complete();
    );

因此,当用户开始将项目从我的应用拖到另一个应用时,它会有一个 ????在鼠标光标旁边签名。此外,比这更糟糕的是,如果用户在我获得延迟拖动的数据之前释放鼠标按钮(同时拖动它),那么什么都不会发生(好像操作静默失败)。

我已经考虑过在我自己的应用程序上向用户提供一些指示,即数据何时准备就绪,以便他们可以释放鼠标按钮。但是有没有更好的方法来防止这两个问题中的任何一个?

【问题讨论】:

【参考方案1】:

对于您的场景,我假设您有两个 Grid 来实现整个“拖放”操作过程。一个网格是源控制,另一个是目标。

你说'如果用户在我获得延迟拖动的数据之前释放鼠标按钮(同时拖动它),那么什么都不会发生(就像操作静默失败一样)。'

要处理这种情况,您可以注册 DropCompleted 事件并告诉用户“DropResult”。

我做了一个简单的代码示例,让你了解整个过程。

<Grid>
    <Grid CanDrag="True" Width="100" Height="100" Background="AliceBlue" DragStarting="Grid_DragStarting" DropCompleted="Grid_DropCompleted">

    </Grid>
    <Grid AllowDrop="True" Width="200" Height="200" Background="LightBlue" VerticalAlignment="Bottom" Drop="Grid_Drop" DragEnter="Grid_DragEnter" DragOver="Grid_DragOver" DragLeave="Grid_DragLeave">

    </Grid>
</Grid>
public sealed partial class MainPage : Page

    public MainPage()
    
        this.InitializeComponent();
    

    private async void Grid_DragStarting(UIElement sender, DragStartingEventArgs args)
    
        Debug.WriteLine("DragStarting");
        var deferral = args.GetDeferral();
        args.Data.RequestedOperation = DataPackageOperation.Copy;

        await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, async () =>
         
             await Task.Delay(10000);
             StorageFile file = await StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appx:///Assets/StoreLogo.png"));
             args.Data.SetStorageItems(new[]  file );
             deferral.Complete();
         );

    

    private void Grid_DragLeave(object sender, DragEventArgs e)
    
        Debug.WriteLine("DragLeave");
    

    private void Grid_DragEnter(object sender, DragEventArgs e)
    
        Debug.WriteLine("DragEnter");
    

    private void Grid_DragOver(object sender, DragEventArgs e)
    
        Debug.WriteLine("DragOver");
        if (!e.DataView.Contains(StandardDataFormats.StorageItems))
        
            e.DragUIOverride.Caption = "There're no StorageItems!";
            e.AcceptedOperation = DataPackageOperation.None;
        
        else
        
            e.AcceptedOperation = DataPackageOperation.Copy;
        
    

    private async void Grid_Drop(object sender, DragEventArgs e)
    
        Debug.WriteLine("Drop");
        if (e.DataView.Contains(StandardDataFormats.StorageItems))
        
            var items = await e.DataView.GetStorageItemsAsync();
            if (items.Count > 0)
            
                var storageFile = items[0] as StorageFile;
                Debug.WriteLine(storageFile.DisplayName);
            
        
    

    private void Grid_DropCompleted(UIElement sender, DropCompletedEventArgs args)
    
        Debug.WriteLine("DropCompleted");
        Debug.WriteLine(args.DropResult);
    

【讨论】:

非常感谢您的详细回答,但我正在寻找的不是在我自己的应用程序中的两个网格之间拖放,而是从我的应用程序到任何其他可以接受二进制的应用程序数据作为拖入(例如,甚至是 Windows 自己的文件资源管理器)

JavaScript 模块模式和拖放 API

】JavaScript模块模式和拖放API【英文标题】:JavaScriptModulepatternandDragandDropAPI【发布时间】:2016-06-1317:51:24【问题描述】:我在js中有一个示例模块,该模块用于管理拖放文件上传。该代码似乎适用于“dragenter”事件函数,但是当... 查看详情

角表排序和拖放表行冲突

】角表排序和拖放表行冲突【英文标题】:Angulartable-sortanddraganddroptablerowconflict【发布时间】:2016-09-2213:34:12【问题描述】:我在我的项目中使用angulartable-sort和angulardrag-drop。当我拖动一行并尝试将其放到另一行时,表格排序会... 查看详情

Flutter 上的弧形菜单,如 Pinterest(长按和拖放)

】Flutter上的弧形菜单,如Pinterest(长按和拖放)【英文标题】:ArcmenulikePinterest(longpressanddrag&drop)onflutter【发布时间】:2021-06-3003:38:05【问题描述】:我想实现像Pinterest这样的ArcMenu。在iOS上:https://iosexample.com/a-beautiful-and-minim... 查看详情

使 angularjs bootstrap 手风琴和拖放播放得很好

】使angularjsbootstrap手风琴和拖放播放得很好【英文标题】:Makingangularjsbootstrapaccordionanddraganddropplaynicely【发布时间】:2015-05-2011:29:08【问题描述】:我正在使用引导手风琴和角度拖放codef0rmerdraganddrop单独来说,它们工作得很好,... 查看详情

vue2图片选择组件,支持多选和拖放(代码片段)

https://github.com/bigggge/vu...vue-image-uploaderVue2图片选择上传组件,支持多选和拖放DEMOProps参数类型说明默认值maxSizeNumber单张图片最大大小3072placeholderString占位文字点击上传图片onChangeFunction文件更改回调(参数:files)ExampleHTML:<divclass="he 查看详情

vue2图片选择组件,支持多选和拖放(代码片段)

...bigggge/vu...vue-image-uploaderVue2图片选择上传组件,支持多选和拖放DEMOProps参数类型说明默认值maxSizeNumber单张图片最大大小3072placeholderString占位文字点击上传图片onChangeFunction文件更改回调(参数:files)ExampleHTML:<divclass="hello"><image-i... 查看详情

拖放异步数据获取

...:2017-12-2301:02:40【问题描述】:我正在尝试在共享图像的应用程序中实现拖放。我所有的图像都是高性能缩略图(即小尺寸),所以我不能将它们用作我的UIDragItem,至少不能用作最终图像。我正在寻找一种为我的原始图像提供UR... 查看详情

vitualbox安装增强功能实现无缝模式和拖放功能(踩坑点记录汇总)(代码片段)

VitualBox也算比较好用的,就是安装窗口过小,首先可以尝试在设置中更改,找到显示Displays,根据显示器修改分辨路Resolution,如果字体太小可以缩放Scale选择200%,注意不要打开FractionalScaling虽然有比例125%选... 查看详情

vitualbox安装增强功能实现无缝模式和拖放功能(踩坑点记录汇总)(代码片段)

VitualBox也算比较好用的,就是安装窗口过小,首先可以尝试在设置中更改,找到显示Displays,根据显示器修改分辨路Resolution,如果字体太小可以缩放Scale选择200%,注意不要打开FractionalScaling虽然有比例125%选... 查看详情

vitualbox安装增强功能实现无缝模式和拖放功能(踩坑点记录汇总)(代码片段)

VitualBox也算比较好用的,就是安装窗口过小,首先可以尝试在设置中更改,找到显示Displays,根据显示器修改分辨路Resolution,如果字体太小可以缩放Scale选择200%,注意不要打开FractionalScaling虽然有比例125%选... 查看详情

UWP - 有没有办法在退出 ListView 时更改鼠标光标而不在拖放期间触发事件?

】UWP-有没有办法在退出ListView时更改鼠标光标而不在拖放期间触发事件?【英文标题】:UWP-IsthereanywaytochangethemousecursorwhenexitingListViewwithouttheeventbeingtriggeredduringdraganddrop?【发布时间】:2020-03-2819:35:25【问题描述】:我有一个可拖... 查看详情

HTML拖放声音

】HTML拖放声音【英文标题】:HTMLdragndropsound【发布时间】:2014-01-1122:06:19【问题描述】:我目前正在尝试用不同的大陆做html拖放表。该人将有能力将正确的大陆拖到它应该在的div中。我已经完成了所有的div标签和拖放功能,但... 查看详情

Delphi 中的跨应用程序拖放

】Delphi中的跨应用程序拖放【英文标题】:Cross-applicationdrag-and-dropinDelphi【发布时间】:2010-09-2215:43:49【问题描述】:我想为WindowsXP创建一个Delphi应用程序,它允许从Windows资源管理器(桌面或文件夹窗口)或其他支持此操作的应... 查看详情

HTML5 拖放 getData() 仅适用于 Chrome 中的拖放事件?

】HTML5拖放getData()仅适用于Chrome中的拖放事件?【英文标题】:HTML5DragandDropgetData()onlyworksondropeventinChrome?【发布时间】:2012-03-2100:54:21【问题描述】:我目前正在使用HTML5拖放API开发一个项目,以提供附加功能,包括将项目拖入... 查看详情

HTML5 拖放 getData() 仅适用于 Chrome 中的拖放事件?

】HTML5拖放getData()仅适用于Chrome中的拖放事件?【英文标题】:HTML5DragandDropgetData()onlyworksondropeventinChrome?【发布时间】:2012-03-2100:54:21【问题描述】:我目前正在使用HTML5拖放API开发一个项目,以提供附加功能,包括将项目拖入... 查看详情

Python GTK 拖放 - 获取 URL

...时间】:2010-11-1605:35:09【问题描述】:我正在创建一个小应用程序必须能够接收URL。如果应用程序窗口打开,我应该能够从浏览器中拖放一个链接并将其拖放到应用程序中-应用程序会将URL保存到数据库中。我正在Python/GTk中创建... 查看详情

如何在java中从目录中拖放文件

...拖放,以及如何从计算机文件系统中拖动文件并放入我的应用程序中。我尝试为拖动开始时编写transferhandler类 查看详情

从 Chrome 下载栏中拖放文件上传

...2013-10-3119:53:21【问题描述】:我已经成功地使用HTML5为Web应用程序实现拖放文件上传。我监听drop事件,然后从event.dataTransfer属性中获取文件数据。出于所有意图和目的,它的工作方式与dropzone.js完全相同:http://www.drop 查看详情