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

2017-11-15 18:54:07来源:CSDN作者:catshitone人点击

分享

老规矩,先看效果

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

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

整体效果
这里写图片描述

前提条件

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

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

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

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

实现

1.添加快捷方式

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);        }

2.注册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文件。
3.设置通知的内容样式
通知的样式有很多种,图片、文字、按钮、输入框可以组合使用。详情见最下面的参考链接。
这里我贴出下我例子里的布局设置。

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秒后自动消失。

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

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

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

5.如果在使用过程中,出现了缺失dll的问题,请添加以下引用

这里写图片描述

前两个引用在:C:/Program Files (x86)/Reference Assemblies/Microsoft/Framework.NETFramework/v4.5/Facades/文件夹中,如果你的.net 4.5.2的framework请改为v4.5.2。

后三个引用在:C:/Windows/System32/WinMetadata/文件夹中,后缀是winmd。


附件:Demo。 如果失效,请留言或来信索取[email protected]


如果你想更灵活的控制弹出的通知,可以参考我这篇博客:【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

最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台