Ömer Özer
Ömer Özer

Reputation: 21

Windows action center toast activation

I'm currently working on a winforms app which after certain action sends a notification to user, when activated(clicked) it opens a link. So I can send the notification, I can open the link with toast.Activated but when banner disappear and gets in to the action center when I click on the notification it doesn't activate. So, I have searched a lot but couldn't find a way to activate the notification on action center.

Here is the code I'm currently using to send notification.

    {
        public void Toasty()
        {
            // Get a toast XML template
            Windows.Data.Xml.Dom.XmlDocument toastXml = ToastNotificationManager.GetTemplateContent(ToastTemplateType.ToastText04);

            // Fill in the text elements
            Windows.Data.Xml.Dom.XmlNodeList stringElements = toastXml.GetElementsByTagName("text");

            stringElements[0].AppendChild(toastXml.CreateTextNode("Header"));
            stringElements[1].AppendChild(toastXml.CreateTextNode("Message"));
            stringElements[2].AppendChild(toastXml.CreateTextNode("From"));

            ToastNotification toast = new ToastNotification(toastXml);

            toast.Activated += toast_Activated;
            //toast.SuppressPopup = true;
            ToastNotificationManager.CreateToastNotifier("App").Show(toast);

        }
        async void toast_Activated(ToastNotification sender, object args)
        {
            await Launcher.LaunchUriAsync(new Uri("http://www.google.com"));
        }
    }

Upvotes: 2

Views: 1931

Answers (1)

HMZ
HMZ

Reputation: 3127

You don't need raw xml for this, get this nuget package : Microsoft.Toolkit.Uwp.Notifications, then use the ToastContentBuilder to build a toast notification, it's easier and cleaner:

// Construct the visuals of the toast (using Notifications library)
ToastContent toastContent = new ToastContentBuilder()
    .AddToastActivationInfo("action=viewConversation&conversationId=5", ToastActivationType.Foreground)
    .AddText("Hello world!")
    .GetToastContent();

// And create the toast notification
var toast = new ToastNotification(toastContent.GetXml());

// And then show it
DesktopNotificationManagerCompat.CreateToastNotifier().Show(toast);

Now for the activation part:

//Another way of creating a notification
public void CreateAndShowPrompt(string message)
{
    ToastContent toastContent = new ToastContent()
    {
        Launch = "bodyTapped",

        Visual = new ToastVisual()
        {
            BindingGeneric = new ToastBindingGeneric()
            {
                Children =
                {
                    new AdaptiveText()
                    {
                        Text = message
                    },

                }
            }
        },
        Actions = new ToastActionsCustom()
        {
            Buttons = { new ToastButton("Yes", "Yes"), new ToastButton("No", "No") }
        },
        Header = new ToastHeader("header", "App", "header")
    };

    var doc = new XmlDocument();
    doc.LoadXml(toastContent.GetContent());

    var promptNotification = new ToastNotification(doc);
    promptNotification.Activated += PromptNotificationOnActivated;

    DesktopNotificationManagerCompat.CreateToastNotifier().Show(promptNotification);
}

Event handler :

private void PromptNotificationOnActivated(ToastNotification sender, object args)
{
    ToastActivatedEventArgs strArgs = args as ToastActivatedEventArgs;

    switch (strArgs.Arguments)
    {
        case "Yes":
           //stuff
            break;
        case "No":
          //stuff
            break;
        case "bodyTapped":
           //stuff
            break;
    }

}

This works in all cases, even when the toast is pushed back to the action center.

You can see it in action in an app that i made: NetStalker

Upvotes: 2

Related Questions