Toast 通知未显示在 IDE 调试器之外

Toast Notifications are not displaying outside IDE debugger

我已经构建了一个应该在 Windows 10 上显示 Toast 通知的应用程序,每次 FileSystemWatcher 检测到更改时。 我正在使用 Microsoft.Toolkit.Uwp.NotificationsWindows.UI.Notifications 命名空间。当运行 VS2019 中启用调试器的代码时,它可以完美运行,但是在使用自写的 WiX 安装程序安装应用程序后,我收到一条错误消息,然后应用程序关闭。

错误消息非常笼统,我不知道去哪里找:

Failed to show Notification for [FileSystemWatcher Name].
Element Not Found. (Exception from HRESULT: 0x80070490)
at Windows.UI.Notifications.ToastNotificationManager.CreateToastNotifier()
at ...
at .. rest of callstack is from the app, pointing towards the method with CreateToast

负责创建和显示 toasts 的class

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 应用程序打包项目 中,如 here 所述。 (虽然我还没有将 WPF 项目从 Framework 移植到 Core。)

SO 上的旧帖子建议在创建通知程序时使用应用程序 ID 作为参数。使用静态 GUID 执行此操作时,它会停止发送通知,同时命中所有断点。除了调试之外,程序不再崩溃,但也不会发送通知。

任何关于这里可能有什么问题的指示都会有很大的帮助。

如果您不打包您的应用程序,则必须按照 docs 中所述在“开始”中的应用程序快捷方式上声明您的应用程序用户模型 ID (AUMID) 和 toast 激活器 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}"/>