关闭

【wpf】在win10系统上弹出toast和notification

标签: windowswpftoastnotificati
2853人阅读 评论(2) 收藏 举报
分类:

老规矩,先看效果

右下角的notification
这里写图片描述

操作中心的notification
这里写图片描述

整体效果
这里写图片描述

前提条件

1.需要在开始菜单里添加快捷方式。

2.在注册表里注册你实现了INotificationActivationCallBack接口的com组件。

3.一个APP_ID,添加到快捷方式里,ActionCenter会以此来区分不同应用的消息。

缺一不可,不然弹出的notification没法交互。

实现

1.添加相关引用
编辑你项目的csproj文件,添加如下节点

<TargetPlatformVersion>10.0.10240.0</TargetPlatformVersion>

然后看起来就是这个样子:
这里写图片描述

接下来打开引用管理器你会发现左边多了一个Windows选项卡,然后添加图示的三个引用:
这里写图片描述

然后再添加System.Runtime和System.Runtime.InteropServices.WindowsRuntime引用。
这里写图片描述
这两个引用在:C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework.NETFramework\v4.5\Facades\文件夹中,如果你的.net 4.5.2的framework请改为v4.5.2。

2.添加快捷方式

private void InstallShortcut(String shortcutPath, String exePath)
        {
            IShellLinkW newShortcut = (IShellLinkW)new CShellLink();
            newShortcut.SetPath(exePath);
            IPropertyStore newShortcutProperties = (IPropertyStore)newShortcut;
            PropVariantHelper varAppId = new PropVariantHelper();
            varAppId.SetValue(APP_ID);
            newShortcutProperties.SetValue(PROPERTYKEY.AppUserModel_ID, varAppId.Propvariant);
            PropVariantHelper varToastId = new PropVariantHelper();
            varToastId.VarType = VarEnum.VT_CLSID;
            varToastId.SetValue(typeof(NotificationActivator).GUID);
            newShortcutProperties.SetValue(PROPERTYKEY.AppUserModel_ToastActivatorCLSID, varToastId.Propvariant);
            ShellHelpers.IPersistFile newShortcutSave = (ShellHelpers.IPersistFile)newShortcut;
            newShortcutSave.Save(shortcutPath, true);
        }

3.注册com组件

private void RegisterComServer(String exePath)
        {
            string regString = String.Format("SOFTWARE\\Classes\\CLSID\\{{{0}}}\\LocalServer32", typeof(NotificationActivator).GUID);
            var key = Microsoft.Win32.Registry.CurrentUser.CreateSubKey(regString);
            key.SetValue(null, exePath);
        }

这样ActionCenter就可以通过GUID找到你的exe文件。
4.设置通知的内容样式
通知的样式有很多种,图片、文字、按钮、输入框可以组合使用。详情见最下面的参考链接。
这里我贴出下我例子里的布局设置。

private void btncl(object sender, RoutedEventArgs e)
        {
            ToastContent content = new ToastContent()
            {
                Visual = new ToastVisual()
                {
                    BindingGeneric = new ToastBindingGeneric()
                    {
                        Children =
                        {
                            new AdaptiveText()
                            {
                               Text="New Mirrored Folders Created"//标题
                            },
                           new AdaptiveText()
                           {
                               Text="Drag some files to either Mirror folder to sync\nClick to show the Mirror folder on my..."//内容
                           }
                        },
                        AppLogoOverride = new ToastGenericAppLogo()
                        {
                            Source = new System.Uri(System.IO.Path.GetFullPath("123.png")).AbsoluteUri//通知的图标
                        }

                    }
                },
                Scenario = ToastScenario.Alarm,//设置通知的声音

                //三个button
                Actions = new ToastActionsCustom()
                {
                    Buttons =
                    {
                        new ToastButton("PC",new QueryString(){
                            {"action","fileExplorer" },
                            {"path","c:\\" }
                        }.ToString())
                        {
                            ActivationType=ToastActivationType.Background
                        },
                        new ToastButton("Drive",new QueryString(){
                            {"action","fileExplorer" },
                            {"path","d:\\" }
                        }.ToString())
                        {
                            ActivationType=ToastActivationType.Background
                        },
                        new ToastButtonDismiss("Close")
                    }
                }
            };
            XmlDocument xml = new XmlDocument();
            xml.LoadXml(content.GetContent());
            ToastNotification toast = new ToastNotification(xml);
            toast.Group = "gg";
            //toast.ExpirationTime = DateTime.Now.AddSeconds(20);
            //toast.SuppressPopup = true;
            ToastNotificationManager.CreateToastNotifier(APP_ID).Show(toast);
        }

这里用到了两个库,分别是:
这里写图片描述
安装完成后,添加引用即可。
1. 里面的QueryString.NET库,是将key-value形式的集合,序列化成一个字符串,因为Notification里的button只接受一个为string类型的arguments。用户点击某个button时,会回调你com组件的Activie方法,在这个方法里拿到arguments,然后进行下一步操作。
2. 如果你不想让右下角弹出通知,只想让通知出现在“操作中心”(通知栏)里,可以设置toast.SuppressPopup=true来进行屏蔽。不过此时是没法播放声音的。
3. 关于如何让通知常驻在”操作中心“这个问题,我发现是不可能的,微软说了”当用户与通知进行交互的时候会自动把这条通知从 操作中心移除“,所以那个toast.ExpirationTime基本没啥作用。(详见下面参考链接)。如果设置了Scenario = ToastScenario.Alarm(Reminder/IncomingCall);用户不点击的话,会一直出现在那里,否则7-8秒后自动消失。

5.程序退出时,清除通知
在退出时调用:

ToastNotificationManager.History.RemoveGroup(....);
//或者
ToastNotificationManager.History.Remove(....)

即可。这样可以删除同属于一个Group的通知,或者删除某个tag=”xxx”的通知,或者整个app_id下的通知。

6.如何做到多个win系统的兼容?
一般你的程序是同时支持win7,win8,win10等的,而win7是无法弹出这种样式的通知的,所以这些引用不能直接添加到主程序里,不然运行时就会报错。
正确的做法就是:将ToastNotification单独做成一个dll,在程序中加入系统版本检测的方法,如果是win10系统,再通过反射的方式,将dll加载到主程序集,然后再弹出通知。


附件:Demo。 如果失效,请留言或来信索取376720513@qq.com


如果你想更灵活的控制弹出的通知,可以参考我这篇博客:【WPF】右下角弹出自定义通知样式(Notification)——简单教程

《参考链接》

1.Quickstart: Handling toast activations from Win32 apps in Windows 10
2.github/desktop-toasts
3.Adaptive and interactive toast notifications
4.Send a local toast notification

3
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

Android Notification 手机系统横幅弹出提示框调用

类似于仿微信信息提示提出框。 在项目当中集成了推送功能,当手机接收到消息后只是在手机通知栏有提示信息。所以需要展示像微信信息弹出框一样的效果,开始自己还以为微信信息弹出框是自定义Dialog之类的自定...
  • qq_27945669
  • qq_27945669
  • 2017-03-09 16:24
  • 2118

解决Android关闭通知消息权限无法弹出Toast的问题

最近在做项目时,遇到一个问题,有部手机就是Toast弹不出来。仔细想想可能权限的问题。后面网上搜索给出如下答案: 跟踪Toast的源代码,make方法省略,做了一些初始化的工作,show方法 ...
  • a3676212
  • a3676212
  • 2016-07-05 12:51
  • 8585

dialog上弹出toast

dialog上弹出toast
  • qwildwolf
  • qwildwolf
  • 2016-08-19 16:11
  • 294

Android学习笔记二十之Toast吐司、Notification通知、PopupWindow弹出窗

Android学习笔记二十之Toast吐司、Notification通知、PopupWindow弹出窗
  • solo_talk
  • solo_talk
  • 2016-07-05 14:36
  • 4710

win10系统 CAJ文件打不开 老弹出 File doesn't existed or can't be visited normally! 文件不存在或不能正常访问

本人试过了 网上给的各种办法 有修改中英文的方法,有重新装个cajveiwer7.1版本的,还有要删除注册表中的TTKN文件和TTOD文件的 全都没有用,都绝望了准备重新装系统了,但是。。。。。现...
  • Alexqingjunce
  • Alexqingjunce
  • 2017-01-04 22:06
  • 6468

鼠标移到菜单上弹出二级菜单特效

  • 2016-04-12 18:27
  • 41KB
  • 下载

由下向上彈出dialog

  • 2016-05-10 10:39
  • 2.66MB
  • 下载

手把手教会popupWindow从下往上弹出效果的实现

原文  http://blog.csdn.net/harryweasley/article/details/41283129 效果如图所示,点击开始按钮,popWindow从下往上出来,再点击p...
  • xuan521521
  • xuan521521
  • 2016-04-12 11:48
  • 384

jQuery实现鼠标移上弹出提示框,移出消失

里有一行数据 “那片笑声让我想起......”  假设超出规定长度将用......代替, 而现在要通过鼠标移动到......上 显示全部内容,移出则消失。如下图: ..... //data是提示框要...
  • itmyhome
  • itmyhome
  • 2014-01-07 17:59
  • 7399

韩国向上弹出flash菜单

  • 2014-05-07 11:30
  • 24KB
  • 下载
    个人资料
    • 访问:190823次
    • 积分:2646
    • 等级:
    • 排名:第15932名
    • 原创:90篇
    • 转载:18篇
    • 译文:1篇
    • 评论:33条
    文章分类
    最新评论