Search code examples
c#wpf

How can I integrate toast notifications in WPF app?


I wanted to add toast notifications to my wpf app.

I've followed the Send a local toast notification from desktop C# apps from Microsoft, but I'm stuck on the step 5.

I'm not sure how to make this code working:

// 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);

Also, I've added <TargetPlatformVersion>10.0</TargetPlatformVersion> to the .csproj, references to Windows.Data, Windows.UI.

At this point, I was getting 2 errors:

The type 'XmlDocument' is defined in an assembly that is not referenced. You must add a reference to assembly 'Windows.Foundation.UniversalApiContract, Version=7.0.0.0, Culture=neutral, PublicKeyToken=null, ContentType=WindowsRuntime'

The type 'ToastNotifier' is defined in an assembly that is not referenced. You must add a reference to assembly 'Windows.Foundation.UniversalApiContract, Version=7.0.0.0, Culture=neutral, PublicKeyToken=null, ContentType=WindowsRuntime'

When I add Windows.Foundation.UniversalApiContract as a reference from C:\Program Files (x86)\Windows Kits\10\References\10.0.18362.0\Windows.Foundation.UniversalApiContract\8.0.0.0\Windows.Foundation.UniversalApiContract.winmd I get the following error:

The type 'ToastNotification' exists in both 'Windows.Foundation.UniversalApiContract, Version=8.0.0.0, Culture=neutral, PublicKeyToken=null, ContentType=WindowsRuntime' and 'Windows.UI, Version=255.255.255.255, Culture=neutral, PublicKeyToken=null, ContentType=WindowsRuntime'

How can I fix it?

Please note that I've also tried to use the 'ready example', but with the same results.


Solution

  • NEW:

    There is a way of using UWP Toast Notifications in WPF app.

    1. Add <TargetPlatformVersion>10.0</TargetPlatformVersion> to .csproj
    2. If you have any package installed, click on packages.config file and select Migrate packages.config to PackageReference... (Important step - this was the thing that I was missing)
    3. Now in Package Manager Console install UWP.Notifications package e.g.: Install-Package Microsoft.Toolkit.Uwp.Notifications -Version 7.0.2 Check version

    Now, you should be able to use all uwp notification functions.

    OLD:

    As @Andy suggested in the comments there is ready NuGet package implementation: github.com/Federerer/Notifications.Wpf

    If you just want a simple notification without onClick events etc. you can use this solution:

    1. Add <TargetPlatformVersion>10.0</TargetPlatformVersion> to .csproj
    2. Add references to Windows.UI and Windows.Data
    3. Add following usings: using Windows.Data.Xml.Dom; using Windows.UI.Notifications;
    4. Use this code to show notification:
    var message = "Sample message";
    var xml = $"<?xml version=\"1.0\"?><toast><visual><binding template=\"ToastText01\"><text id=\"1\">{message}</text></binding></visual></toast>";
    var toastXml = new XmlDocument();
    toastXml.LoadXml(xml);
    var toast = new ToastNotification(toastXml);
    ToastNotificationManager.CreateToastNotifier("Sample toast").Show(toast);
    

    More info