如何处理来自 UWP 中单击 toast 按钮的后台激活事件

How to handle the background activation event coming from a toast button click in UWP

我正在尝试让一个时间触发的后台任务显示带有按钮的吐司。 "Are you ready to do xyx?" [是] [否]。单击“是”将转至网页。否将在下一个时间段之前关闭吐司。

在 Windows 10 个通用应用程序中,我看到了一些示例,其中从带有按钮的通用应用程序启动 toast,并且按钮在后台任务中处理。

我见过在从没有按钮的后台任务启动 toast 时显示消息的 toast。

我需要知道的是,如果从后台任务启动带有按钮的 Toast,您将如何处理按钮。

这可能吗?如果有怎么办?

下面是在后台任务中显示toast的代码:

namespace BGtask
{
    public sealed class BGTimerTask : IBackgroundTask
    {
        public void Run(IBackgroundTaskInstance taskInstance)
        {
            var deferral = taskInstance.GetDeferral();

            try
            {
                SendToast();
            }
            finally
            {
                // And finally release the deferral since we're done
                deferral.Complete();
            }
        }

        private void SendToast()
        {
            ToastContent content = new ToastContent()
            {
                Visual = new ToastVisual()
                {
                    TitleText = new ToastText()
                    {
                        Text = "XYZ"
                    },

                    BodyTextLine1 = new ToastText()
                    {
                        Text = "Are you ready to do xyz?"
                    }
                },

                Actions = new ToastActionsCustom()
                {
                    Inputs =
                    {
                        new ToastSelectionBox("selection")
                        {
                            Items =
                            {
                                new ToastSelectionBoxItem("1", "Yes"),
                                new ToastSelectionBoxItem("2", "Not Now"),
                                new ToastSelectionBoxItem("3", "Don't Show Again")
                            },
                            DefaultSelectionBoxItemId = "1"
                        }
                    },
                    Buttons =
                    {

                        new ToastButton("OK", new QueryString()
                        {
                            { "action", "ok" },

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


                    } 
                }
            };

            ToastNotificationManager.CreateToastNotifier().Show(new ToastNotification(content.GetXml()));

        }
    }
}

我知道了,你已经设置好了ToastActivationType.Background。这是正确的设置。您将需要在从同一应用程序注册的另一个后台任务中处理该按钮:

public sealed class NotificationActionBackgroundTask : IBackgroundTask
{
    public void Run(IBackgroundTaskInstance taskInstance)
    {
        var details = taskInstance.TriggerDetails as ToastNotificationActionTriggerDetail;

        if (details != null)
        {
            string arguments = details.Argument; // button argument
            var userInput = details.UserInput;
            var selection = userInput["selection"] // dropdown value

            // process button
        }
    }
}

您需要使用 ToastNotificationActionTrigger:

注册此任务
BackgroundAccessStatus status = await BackgroundExecutionManager.RequestAccessAsync();

BackgroundTaskBuilder builder = new BackgroundTaskBuilder()
{
    Name = "MyToastTask",
    TaskEntryPoint = "BgTask.NotificationActionBackgroundTask"
};

builder.SetTrigger(new ToastNotificationActionTrigger());

BackgroundTaskRegistration registration = builder.Register();

当然,不要忘记在应用程序清单中声明任务(您需要检查系统事件)并从您的应用程序中引用包含该任务的库。

更多详情请阅读this tutorial使用 Windows 10 自适应模板 处理来自 toast 通知的后台激活您应该特别感兴趣。