DevExpress Winforms使用技巧教程:如何在WinForms Apps中显示Toast Notifications(二)
下载DevExpress v19.2完整版 DevExpress v19.2汉化资源获取
DevExpress Winforms Controls 内置140多个UI控件和库,完美构建流畅、美观且易于使用的应用程序。使用WinForms PictureEdit控件,可以在表单上显示图像。为控件实现DirectX渲染支持,可以轻松处理大的高DPI图像。想要体验?点击下载>>
Activator和COM服务器
Windows在其“操作中心”中保留toast notifications。
通常,操作中心在用户关闭此屏幕后清除所有toasts(如果用户打开、关闭并在此打开操作中心,则该操作将为空),但是某些toasts可以保留在操作中心中,直到用户手动将其关闭为止。即使用户注销并返回Windows之后,此类toasts仍保留在操作中心中。此外,单击toasts会启动其父应用程序,要显示此类通知,请创建一个自定义Activator—DevExpress.XtraBars.ToastNotifications.ToastNotificationActivator类的后代。
[Guid("39697E4E-3543-4414-A694-90097B433DC6"), ComVisible(true)] public class ToastNotificationActivatorCustom : ToastNotificationActivator { public override void OnActivate(string arguments, Dictionary<string, string> data){ //specify what happens when a user interacts with a toast } }
您将需要注册此自定义Activator,在设计时设置组件的ApplicationActivator属性,或在代码中调用RegisterApplicationActivator方法。
toastNotificationsManager1.RegisterApplicationActivator( typeof(ToastNotificationActivatorCustom));
您还需要注册一个COM服务器。 为此,请调用DevExpress.Data.ShellHelper.RegisterComServer方法。 请注意,如果使用ShellHelper类创建应用程序快捷方式,则需要使用带有activatorType参数的TryCreateShortcut方法重载。 否则,如果您使用应用安装程序添加应用程序快捷方式,则安装程序还必须添加HKEY_CURRENT_USER \ SOFTWARE \ Classes \ CLSID \ {-your-GUID-here-} \ LocalServer32注册表项,并以路径将应用程序可执行文件添加为 值。
if (!ShellHelper.IsApplicationShortcutExist("My Toast Application") { ShellHelper.TryCreateShortcut( Process.GetCurrentProcess().MainModule.FileName, toastNotificationsManager1.ApplicationId, "My Toast Application", @"D:\Work\Images\_Icons\ico\chain-icon.ico", typeof(ToastNotificationActivatorCustom)); ShellHelper.RegisterComServer( Process.GetCurrentProcess().MainModule.FileName, typeof(ToastNotificationActivatorCustom)); }
GUIDs
使用toasts时,您需要几个唯一的ID。
- 针对组件的ApplicationID属性
- 针对每个通知的ID属性
- 针对标记Activator类的Guid属性
您可以混搭键盘来生成唯一的ID,但是更有效的方法是使用联机GUID生成器或Visual Studio中包含的生成器("Tools | Create GUID")。
传递重要通知
即使您正确设置了所有内容,通知也可能不会传递给用户。 交付会受到以下因素的影响:
- 较旧的OS版本
- 操作中心设置中禁用了通知
- 内部错误等
在这种情况下,您可以处理ToastNotificationsManager.Failed事件,以通过其他方法(例如标准消息框)将关键消息传递给用户。
using DevExpress.XtraBars.ToastNotifications; using DevExpress.XtraEditors; void manager_Failed(object sender, ToastNotificationFailedEventArgs e) { if ((string)e.NotificationID == "toast_connection_lost_id_das0ud0q94") { IToastNotificationProperties undeliveredToast = toastNotificationsManager1.GetNotificationByID(e.NotificationID); XtraMessageBox.Show(undeliveredToast.Body, undeliveredToast.Header); } }
DevExpress v19.2线上公开课即将开课,前10名免费参与哦~
DevExpress技术交流群:540330292 欢迎一起进群讨论
扫描关注DevExpress中文网微信公众号,及时获取最新动态及最新资讯