winforms Win Forms .NET 4.5中的吐司通知

fquxozlt  于 2022-11-17  发布在  .NET
关注(0)|答案(3)|浏览(222)

我已经搜索了许多不同的职位做创建吐司通知从一个赢的形式,但当这些通过我得到一个错误时,生成toast通知。
System.Exception:未找到元素。(HRESULT异常:0x80070490)。
我已经编辑了csproj文件并添加了以下内容:

<PropertyGroup>
       <TargetPlatformVersion>10.0.10586</TargetPlatformVersion>
  </PropertyGroup>

并根据Windows.UI.Notifications is missing中的建议,添加了Windows.DataWindows.UI的参考,以及System.Runtime.dll的参考

using Windows.Data.Xml.Dom;
using Windows.UI.Notifications;
using System.Windows.Forms;
using System;

namespace ToastNotify
{
    class Notify
    {
        public void GenerateToast(string header, string content)
        {
            ToastTemplateType toastTemplate = ToastTemplateType.ToastImageAndText02;

            XmlDocument toastXml = ToastNotificationManager.GetTemplateContent(toastTemplate);

            XmlNodeList toastTextElements = toastXml.GetElementsByTagName("text");
            toastTextElements[0].AppendChild(toastXml.CreateTextNode(header));
            toastTextElements[1].AppendChild(toastXml.CreateTextNode(content));

            XmlNodeList toastImageElements = toastXml.GetElementsByTagName("image");
            ((XmlElement)toastImageElements[0]).SetAttribute("src", "..\\..\\Resources\\icon.ico");

            IXmlNode toastNode = toastXml.SelectSingleNode("/toast");
            ((XmlElement)toastNode).SetAttribute("duration", "long");

            ToastNotification toast = new ToastNotification(toastXml);

            try
            {
                ToastNotificationManager.CreateToastNotifier().Show(toast);
            }
            catch (Exception ex)
            {

                MessageBox.Show(ex.ToString());

            }
        }
    }
}

我哪里做错了有什么建议吗?

xbp102n0

xbp102n01#

您应该为CreateToastNotifier明确提供applicationId
就像这样:

private const String APP_ID = "Microsoft.Samples.DesktopToastsSample";
...
ToastNotificationManager.CreateToastNotifier(APP_ID).Show(toast);

但我有一个坏消息。从Windows 10开始1709 WinForms应用程序就是不显示吐司通知。在此之前Show(toast)是工作的,但现在它既不会抛出异常,也不会显示任何toast通知。
我还在想办法。
正如Prateek Shrivastava所指出的,存在(新的)限制。
查看此处https://learn.microsoft.com/en-us/uwp/api/windows.ui.notifications.toastnotificationmanager.createtoastnotifier

更新日期:

以下是使用APP_ID创建设置的分步指南,以便通知可以在 * 所有 * Windows 10版本上工作:Send a local toast notification from desktop C# apps

更新日期:

它在Windows 10 1903中再次工作,无需安装。

6xfqseft

6xfqseft2#

如果要显示图标,请使用This并确保设置的是Image(Icon)完整路径,否则只需传递null。

public static void GenerateToast(string appid, string imageFullPath, string h1, string h2, string p1)
{

    var template = ToastNotificationManager.GetTemplateContent(ToastTemplateType.ToastImageAndText04);

    var textNodes = template.GetElementsByTagName("text");

    textNodes[0].AppendChild(template.CreateTextNode(h1));
    textNodes[1].AppendChild(template.CreateTextNode(h2));
    textNodes[2].AppendChild(template.CreateTextNode(p1));

    if (File.Exists(imageFullPath))
    {
        XmlNodeList toastImageElements = template.GetElementsByTagName("image");
        ((XmlElement)toastImageElements[0]).SetAttribute("src", imageFullPath);
    }
    IXmlNode toastNode = template.SelectSingleNode("/toast");
    ((XmlElement)toastNode).SetAttribute("duration", "long");

    var notifier = ToastNotificationManager.CreateToastNotifier(appid);
    var notification = new ToastNotification(template);

    notifier.Show(notification);
}
pb3skfrl

pb3skfrl3#

我需要在这里补充一下,因为我正在开发一个WinForms应用(.Net Framework 4.7*),它无法在GitHub构建工人上构建,因为在某个时候,吐司通知的支持被黑客入侵,并引用了一些奇怪的WinMetadata\Windows.*.winmd文件。
任何发现这个StackOverflow问题的人都有祸了。
您可能将.Net Framework 4.x作为目标,因为您正在Windows 7上使用Win Forms应用程序. .Net Framework 4.8 is supported,而Windows 7没有您可能正在寻找的类ToastNotifications。因此出现了问题。
我认为唯一的解决方案是in the updated answer that's most upvoted,它只是针对更现代的UWP框架,只会在Windows 10和更高版本上工作。但你仍然试图从一个框架发送吐司通知,而这个框架的设计并不支持它。在你的代码中的某个地方,你可能正在检查你运行的平台是否是Windows 10或更高版本。甚至没有一个编译器语句,直接使用C#或VB .NET。.Net Framework的设计初衷并不是这样的--它的目的是与平台无关的。
我唯一的建议是;为Windows 10+设置一个新的构建目标,并按照advice from Stephen设置您的项目。这应该是使WinForms实现整洁的Windows 10技巧的最简单的方法。

相关问题