在UWP的App中,弹出消息通知的方法和WinRT一致,注意是App内的消息通知(toast notification)而不是从服务器端推送的通知。主要有几个步骤:
1. 创建XML定义
// 1. create element ToastTemplateType toastTemplate = ToastTemplateType.ToastImageAndText01; XmlDocument toastXml = ToastNotificationManager.GetTemplateContent(toastTemplate);
这里面的消息模板有好几种:
// // Summary: // 指定要在消息通知中使用的模版。 [ContractVersion(typeof(UniversalApiContract), 65536)] public enum ToastTemplateType { // // Summary: // 在三行文本中被包装的大型图像和单个字符串。 ToastImageAndText01 = 0, // // Summary: // 大图像、加粗文本的一个字符串在第一行、常规文本的一个字符串包装在第二、三行中。 ToastImageAndText02 = 1, // // Summary: // 大图像、加粗文本的一个字符串被包装在开头两行中、常规文本的一个字符串包装在第三行中。 ToastImageAndText03 = 2, // // Summary: // 大图像、加粗文本的一个字符串在第一行、常规文本的一个字符串在第二行中、常规文本的一个字符串在第三行中。 ToastImageAndText04 = 3, // // Summary: // 包装在三行文本中的单个字符串。 ToastText01 = 4, // // Summary: // 第一行中加粗文本的一个字符串、覆盖第二行和第三行的常规文本的一个字符串。 ToastText02 = 5, // // Summary: // 覆盖第一行和第二行的加粗文本的一个字符串。第三行中常规文本的一个字符串。 ToastText03 = 6, // // Summary: // 第一行中加粗文本的一个字符串、第二行中常规文本的一个字符串、第三行中常规文本的一个字符串。 ToastText04 = 7 }
我一般选第一种就够了。
2. 设置消息文本
// 2. provide text XmlNodeList toastTextElements = toastXml.GetElementsByTagName("text"); toastTextElements[0].AppendChild(toastXml.CreateTextNode("消息内容"));
3. 设置消息框内的图标
// 3. provide image XmlNodeList toastImageAttributes = toastXml.GetElementsByTagName("image"); ((XmlElement)toastImageAttributes[0]).SetAttribute("src", $"ms-appx:///assets/图片文件名"); ((XmlElement)toastImageAttributes[0]).SetAttribute("alt", "logo");
图片我选了Assets目录下的图片,也就通常是应用的图标,当然你可以根据自己需要去改。
4. 消息停留时间
// 4. duration IXmlNode toastNode = toastXml.SelectSingleNode("/toast"); ((XmlElement)toastNode).SetAttribute("duration", "short");
short是短时间就消失,long是停留很长时间
5. 设置声音
// 5. audio XmlElement audio = toastXml.CreateElement("audio"); audio.SetAttribute("src", $"ms-winsoundevent:Notification.系统提示音名称"); toastNode.AppendChild(audio);
提示音有这几种:
Default, IM, Mail, Reminder, SMS, Looping.Alarm, Looping.Alarm2, Looping.Alarm3, Looping.Alarm4, Looping.Alarm5, Looping.Alarm6, Looping.Alarm7, Looping.Alarm8, Looping.Alarm9, Looping.Alarm10, Looping.Call, Looping.Call2, Looping.Call3, Looping.Call4, Looping.Call5, Looping.Call6, Looping.Call7, Looping.Call8, Looping.Call9, Looping.Call10,
6. 用户点击消息时导航到App的启动参数
如果你只是简单的弹出消息,不需要用户点击消息时根据内容执行特定操作的话,这步可以省略
6. app launch parameter ((XmlElement)toastNode).SetAttribute("launch", "{\"type\":\"toast\",\"param1\":\"12345\",\"param2\":\"67890\"}");
7. 弹出消息
// 7. send toast ToastNotification toast = new ToastNotification(toastXml); ToastNotificationManager.CreateToastNotifier().Show(toast);
效果是:
电脑:
手机:
为了使用方便,我封装成了一个方法:
public static void ShowToastNotification(string assetsImageFileName, string text, NotificationAudioNames audioName) { // 1. create element ToastTemplateType toastTemplate = ToastTemplateType.ToastImageAndText01; XmlDocument toastXml = ToastNotificationManager.GetTemplateContent(toastTemplate); // 2. provide text XmlNodeList toastTextElements = toastXml.GetElementsByTagName("text"); toastTextElements[0].AppendChild(toastXml.CreateTextNode(text)); // 3. provide image XmlNodeList toastImageAttributes = toastXml.GetElementsByTagName("image"); ((XmlElement)toastImageAttributes[0]).SetAttribute("src", $"ms-appx:///assets/{assetsImageFileName}"); ((XmlElement)toastImageAttributes[0]).SetAttribute("alt", "logo"); // 4. duration IXmlNode toastNode = toastXml.SelectSingleNode("/toast"); ((XmlElement)toastNode).SetAttribute("duration", "short"); // 5. audio XmlElement audio = toastXml.CreateElement("audio"); audio.SetAttribute("src", $"ms-winsoundevent:Notification.{audioName.ToString().Replace("_", ".")}"); toastNode.AppendChild(audio); // 6. app launch parameter //((XmlElement)toastNode).SetAttribute("launch", "{\"type\":\"toast\",\"param1\":\"12345\",\"param2\":\"67890\"}"); // 7. send toast ToastNotification toast = new ToastNotification(toastXml); ToastNotificationManager.CreateToastNotifier().Show(toast); }
public enum NotificationAudioNames { Default, IM, Mail, Reminder, SMS, Looping_Alarm, Looping_Alarm2, Looping_Alarm3, Looping_Alarm4, Looping_Alarm5, Looping_Alarm6, Looping_Alarm7, Looping_Alarm8, Looping_Alarm9, Looping_Alarm10, Looping_Call, Looping_Call2, Looping_Call3, Looping_Call4, Looping_Call5, Looping_Call6, Looping_Call7, Looping_Call8, Looping_Call9, Looping_Call10, }
使用的时候一句话就OK了:
ShowToastNotification("Square150x150Logo.scale-200.png", $"已复制 {val}", NotificationAudioNames.Default);
注意,这里你定义的声音,在“通知和操作”里用户是可以自己改的。