Уведомления Toast не отображаются вне отладчика IDE - PullRequest
1 голос
/ 22 января 2020

Я создал приложение, которое должно отображать уведомления о тостах на Windows 10, каждый раз, когда FileSystemWatcher обнаруживает изменение. Я использую пространства имен Microsoft.Toolkit.Uwp.Notifications и Windows.UI.Notifications. При запуске кода в VS2019 с включенным отладчиком он работает без нареканий, но после установки приложения с помощью самописного установщика WiX я получаю сообщение об ошибке, после которого приложение закрывается.

Сообщение об ошибке довольно generi c, и я не знаю, где искать:

Не удалось отобразить уведомление для [FileSystemWatcher Name].
Элемент не найден. (Исключение из HRESULT: 0x80070490)
в Windows .UI.Notifications.ToastNotificationManager.CreateToastNotifier ()
в ...
в ... остальная часть callstack из приложения, указывающая на метод с CreateToast

Класс, отвечающий за создание и отображение тостов

using System;
using Windows.Data.Xml.Dom;
using Microsoft.Toolkit.Uwp.Notifications;
using Windows.UI.Notifications;

namespace MyApp.Notifs
{
    public class NotificationToaster
    {

        private string appID;

        //appID is read from the Properties
        public NotificationToaster(string appID)
        {
            this.appID = appID;
        }

        public void ShowToast(string title, string content)
        {

            string toastXmlString =
            $@"<toast>
                    <visual>
                        <binding template=""ToastGeneric"">
                            <text hint-maxLines=""1""> {title} </text>
                            <text> {content} </text>
                            <group>
                                <subgroup>
                                    <text> {DateTime.Now} </text>
                                </subgroup>
                            </group>
                        </binding>
                    </visual>
                    <audio src=""ms-winsoundevent:Notification.Default""/>
                </toast>";

            CreateToast(toastXmlString);

        }

        private void CreateToast(string toast)
        {
            //Load Toast data from string to XML
            XmlDocument xmlDoc = new XmlDocument();
            xmlDoc.LoadXml(toast);

            // Create the toast notification
            ToastNotification toastNotif = new ToastNotification(xmlDoc);

            //Attach Manager to raise notifications
            var toastNotifier = ToastNotificationManager.CreateToastNotifier(appID);

            // And send the notification
            toastNotifier.Show(toastNotif);
        }

    }
}

После небольшого поиска я попробовал несколько решений.

Первым делом я попытался упаковать приложение в Windows Проект упаковки приложений , как описано здесь . (Я еще не перенес проект WPF из Framework в Core.)

В более старых публикациях здесь, в SO, предлагается использовать идентификатор приложения в качестве параметра при создании уведомителя. Делая это с stati c GUID, он прекращает отправку уведомлений, пока удаляются все точки останова. Вне отладки программа больше не обрабатывает sh, но уведомления также не отправляются.

Любой указатель на то, что здесь может быть не так, очень помог бы.

1 Ответ

1 голос
/ 24 января 2020

Если вы не упаковываете свое приложение, вы должны объявить свой идентификатор модели пользователя приложения (AUMID) и CLSID активатора тоста на ярлыке вашего приложения в меню «Пуск», как описано в документах :

<Shortcut Id="ApplicationStartMenuShortcut" Name="Wix Sample" Description="Wix Sample" Target="[INSTALLFOLDER]WixSample.exe" WorkingDirectory="INSTALLFOLDER">

<!--AUMID-->
<ShortcutProperty Key="System.AppUserModel.ID" Value="YourCompany.YourApp"/>

<!--COM CLSID-->
<ShortcutProperty Key="System.AppUserModel.ToastActivatorCLSID" Value="{replaced-with-your-guid-C173E6ADF0C3}"/>

...