【问题标题】:Drag & Drop StorageFolders in UWP Windows 10 Apps在 UWP Windows 10 应用程序中拖放存储文件夹
【发布时间】:2023-04-09 22:13:02
【问题描述】:

目前拖放的示例仅适用于图像等 StorageFiles。但是对于文件夹会发生什么。

我已经成功实现了文件和多个文件,但是当我尝试使用一个文件夹并读取其项目时,它返回 0 个文件,我的代码:

if (e.DataView.Contains(StandardDataFormats.StorageItems))
{
var items = await e.DataView.GetStorageItemsAsync();

bool hasfolders = false;

foreach (var item in items)
{
    if (item is StorageFile)
    {
        var newFavorite = await FavoriteFromFile(item as StorageFile, groupcategory.Key);
        if (newFavorite != null)
            newFavorites.Add(newFavorite);
    }
    else if(item is StorageFolder)
    {
        var favs = await FavoritesFromFolder(item as StorageFolder, groupcategory.Key);
        hasfolders = true;
    }
}
...

在 FromFolder 内部:

  private async Task<List<Favorite>> FavoritesFromFolder(StorageFolder folder, Category cat)
    {
        List<Favorite> ret = new List<Favorite>();

        foreach (var item in await folder.GetItemsAsync())
        {

此处返回 0 个项目,因此可能未实现或不支持。

【问题讨论】:

    标签: windows-10 uwp


    【解决方案1】:

    您好,我知道现在回答这个问题有点晚了,但现在也许对您有所帮助。 1.检查您想要的对象上的 Allow Drop 。 2.转到事件并为您的对象添加 DropOver 和 Drop 事件。 3.将此代码用于您的 DropOver:

    var d = e.GetDeferral();
            try
            {
                var items = await e.DataView.GetStorageItemsAsync();
    
                if (items != null)
                    e.AcceptedOperation = Windows.ApplicationModel.DataTransfer.DataPackageOperation.Copy;
    
            }
            catch { }
            finally
            { 
                d.Complete();
            }
    

    然后将此代码用于放置事件

    var deferral = e.GetDeferral();
    
            var filesAndFolders = await e.DataView.GetStorageItemsAsync();
            MessageDialog msg = new MessageDialog("");
    
            foreach (var item in filesAndFolders)
            {
                if (item is IStorageFile)
                    msg.Content += "\nFile:" + item.Name;
    
                if (item is IStorageFolder)
                {
                    msg.Content += "\nFolder:" + item.Name;
                    var folder = await ((StorageFolder)item).GetFilesAsync();
                    foreach (var fold in folder)
                    {
                        msg.Content += "\nFolderContent:" + fold.Name;
                    }
                }
            }
            await msg.ShowAsync();
            deferral.Complete();
    

    现在可以调试您的应用并删除多个存储文件和文件夹。您可以看到 StorageFolder Root 的内容(不是子文件夹,您必须展开此代码才能看到子文件夹)和您删除的存储文件以及存储文件夹的名称。 您可以在此处查看 Drop Storage Items 的示例:(命名文件放置) https://onedrive.live.com/?id=D1BA3C73BE854A97%21370578&cid=D1BA3C73BE854A97&group=0&parId=D1BA3C73BE854A97%21227&authkey=%21AF52vPagWyrz%2DPA&action=locate

    【讨论】:

    • 您好,是的,代码可以工作,我实际遇到的问题有点特别,因为我使用的是收藏夹文件夹,而且实现起来有点奇怪,因为它不是真正的文件夹。我收到了 Microsoft 的答复,并且对 url 和收藏夹的支持是 W10 中的新功能,并且正在实施中。试试看会发生什么
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-16
    • 1970-01-01
    • 2016-09-02
    • 1970-01-01
    • 2010-11-15
    相关资源
    最近更新 更多