Архив рубрики: Software

WPF: Вызвать системное Toast-уведомление с помощью WinRT

С вызовом Toast-уведомлений пришлось поискать примеры.

Вот один из них. Здесь, чтобы всё заработало, приходится добавлять в Решение (Solution) ещё один проект — Windows Application Packaging Project.

  1. Начнём с дизайна:
    MainWindow.xaml
    <Window x:Class="WpfCallingWin10Api.Framework.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
            xmlns:local="clr-namespace:WpfCallingWin10Api.Framework"
            mc:Ignorable="d"
            Title="MainWindow" Height="450" Width="800" FontSize="30">
        <Grid>
            <Button Content="Show Toast"
                    Padding="10"
                    HorizontalAlignment="Center"
                    VerticalAlignment="Center"
                    Click="ButtonShowToast_Click"/>
        </Grid>
    </Window>
    
  2. Код кнопки здесь такой:
    MainWindow.xaml.cs
    using System;
    using System.Windows;
    using Windows.Data.Xml.Dom;
    using Windows.UI.Notifications;
    
    namespace WpfCallingWin10Api.Framework
    {
        public partial class MainWindow : Window
        {
            public MainWindow()
            {
                InitializeComponent();
            }
    
            private void ButtonShowToast_Click(object sender, RoutedEventArgs e)
            {
                string title = "The current time is";
                string timeString = $"{DateTime.Now:HH:mm:ss}";
                string thomasImage = "https://www.thomasclaudiushuber.com/thomas.jpg";
    
                string toastXmlString =
                $@"<toast><visual>
                        <binding template='ToastGeneric'>
                        <text>{title}</text>
                        <text>{timeString}</text>
                        <image src='{thomasImage}'/>
                        </binding>
                    </visual></toast>";
    
                var xmlDoc = new XmlDocument();
                xmlDoc.LoadXml(toastXmlString);
    
                var toastNotification = new ToastNotification(xmlDoc);
    
                var toastNotifier = ToastNotificationManager.CreateToastNotifier();
                toastNotifier.Show(toastNotification);
            }
        }
    }

    В этом случае при запуске вылетает исключение:

    Exception thrown: ‘System.Runtime.InteropServices.COMException’ in WinRT.Runtime.dll
    An unhandled exception of type ‘System.Runtime.InteropServices.COMException’ occurred in WinRT.Runtime.dll
    Element not found. (0x80070490)

     

    В идеале, для UWP-приложения назначается идентификатор, но у нас WPF-приложение и тут этого нет. Поэтому нам необходимо создать идентификатор вручную. Переходим к следующему пункту.

     

  3. Запакуем наше приложение в MSIX:
    SolutionAddNew Project…Windows Application Packaging Project
    Progect name: WpfCallingWin10Api.Framework.App
    Loacation: C:\Users\Denis\source\repos\WpfCallingWin10Api.Framework
  4. Добавим ссылку на проект:
    WpfCallingWin10Api.Framework.AppDependenciesAdd Project Reference…WpfCallingWin10Api.Framework

    После того, как указали проект, нужно для него выбрать минимальную версию платформы:
    Target version: Windows 10, version 1903 (10.0; Build 18362)
    Minimum version: Windows 10, version 1903 (10.0; Build 18362)

     

    Если теперь его запустить, то при нажатии на кнопку, получим ошибку:

    Exception thrown: ‘System.Exception’ in WpfCallingWin10Api.Framework.exe
    An unhandled exception of type ‘System.Exception’ occurred in WpfCallingWin10Api.Framework.exe
    Element not found. (Exception from HRESULT: 0x80070490)

     

  5. Установим текущий проект как стартовый:
    SolutionPropertiesCommon PropertiesStartup ProjectSingle startup projectWpfCallingWin10Api.Framework.App

После нажатия на кнопку в правом нижнем углу появится Toast-уведомление:
Скриншот Toast-уведомления