在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);
注意,这里你定义的声音,在“通知和操作”里用户是可以自己改的。