首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从Toast Notification打开文件

从Toast Notification打开文件
EN

Stack Overflow用户
提问于 2017-07-15 22:49:51
回答 1查看 975关注 0票数 1

在我的UWP应用程序中,我下载了一个文件,并使用FolderPicker将其存储在用户选择的位置。下载完成后,我会显示一个ToastNotification。我使用这两个名称空间,如文档中所示。

代码语言:javascript
复制
using Microsoft.QueryStringDotNET; // for receciving arguments
using Microsoft.Toolkit.Uwp.Notifications;

我发送的toast有两个按钮,1)打开文件2)解除。当用户点击第一个按钮时,我想打开下载的文件。

但据我所知,toast只能向应用程序发送字符串参数(如果错误,请纠正我)。为了打开一个文件,需要StorageFile对象( StorageFile的路径是不行的)。

那么,有没有办法从toast中实际打开下载的文件(使用前台或后台激活)?

下载文件的代码:

代码语言:javascript
复制
private async void DownloadButton_Click(object sender, RoutedEventArgs e)
{   
    StorageFolder selectedFolder;   
    try
    {
        selectedFolder = await ChooseFolderAsync();
    }
    catch
    {
        Toast.ShowToast("Something went wrong", ToastRow);
        return;
    }

    Uri downloadLink = new Uri("ValidUri");    

    StorageFile destinationFile = await selectedFolder.CreateFileAsync(selectedAsset.name, CreationCollisionOption.GenerateUniqueName);

    BackgroundDownloader downloader = new BackgroundDownloader();
    downloader.SuccessToastNotification = handler.MakeToastWithButtons("Downloaded", selectedAsset.name, "Open", "Dismiss");
   // downloader.SuccessToastNotification = handler.MakeToast("Downloaded", nameOfFile, string.Empty, 2);
    DownloadOperation download = downloader.CreateDownload(downloadLink, destinationFile);
    download.Priority = BackgroundTransferPriority.High;
    download.CostPolicy = BackgroundTransferCostPolicy.Always;    

    var toast = handler.MakeToast("Downloading...", selectedAsset.name, selectedAsset.contentSize, 12);
    toast.Group = "downloadStartedTag";
    ToastNotificationManager.CreateToastNotifier().Show(toast);

    Progress<DownloadOperation> progressCallback = new Progress<DownloadOperation>(handler.DownloadProgress);

    try
    {
        await download.StartAsync().AsTask(cts.Token, progressCallback);       
    }
    catch (Exception ex)
    {
        var errorCode = BackgroundTransferError.GetStatus(ex.HResult);
        toast = handler.MakeToast("Download failed", selectedAsset.name, TextFormatter.CamelToHumanCase(errorCode.ToString()), 12);
        toast.Group = "downloadFailedTag";
        ToastNotificationManager.CreateToastNotifier().Show(toast);

        return;
    }
    finally
    {
        ToastNotificationManager.History.Remove("downloadStartedTag");
    }   
}

创建toast的方法:

代码语言:javascript
复制
public ToastNotification MakeToastWithButtons(string heading, string line1, string button1, string button2)
{
    ToastVisual visual = new ToastVisual()
    {
        BindingGeneric = new ToastBindingGeneric()
        {
            Children =
            {
                new AdaptiveText() {Text = heading},
                new AdaptiveText() {Text = line1},
            }
        }
    };

    ToastActionsCustom actions = new ToastActionsCustom()
    {
        Buttons =
        {
            new ToastButton("Open", new QueryString()
            {
                { "action", "open" }
                //maybe file path can be given here in some argument

            }.ToString())
            {
                ActivationType = ToastActivationType.Foreground
            },

            new ToastButton("Dismiss", new QueryString()
            {
                { "action", "dismiss" }
                //more details about the file can be given here

            }.ToString())
            {
                ActivationType = ToastActivationType.Background
            }                        
        }

    };

    ToastContent toastContent = new ToastContent()
    {
        Visual = visual,
        Actions = actions,

        // Arguments when the user taps body of toast
        Launch = new QueryString()
        {
            { "action", "nothing" }
        }.ToString()
    };

    // And create the toast notification
    var toast = new ToastNotification(toastContent.GetXml());
    toast.ExpirationTime = DateTime.Now.AddDays(2);
    toast.Group = "DownloadCompleteGroup";

    return toast;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-18 22:03:01

一种方法是将后台下载创建的destinationFile存储在FutureAccessList中,这将为您提供一个token,您可以将其添加到toast的有效负载数据:

代码语言:javascript
复制
// using Windows.Storage.AccessCache;
string token = StorageApplicationPermissions.FutureAccessList.Add(destinationFile);
// add the token to your toast payload

然后,当用户单击toast时,您可以兑换token以取回文件:

代码语言:javascript
复制
var file = await StorageApplicationPermissions.FutureAccessList.GetFileAsync(token);

现在你可以对这个文件做一些事情了。请注意,令牌是“永远”有效的--只要文件存在于磁盘上,令牌就会在应用程序重启甚至重启后工作。

处理完文件后(包括下载失败或用户取消等情况)您应该从FutureAccessList中删除该标记,以便列表不会被填满:

代码语言:javascript
复制
StorageApplicationPermissions.FutureAccessList.Remove(token);

这意味着您可能希望将令牌保存在应用程序的设置中,以防用户忽略toast。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45119468

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档