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

注意,这里你定义的声音,在“通知和操作”里用户是可以自己改的。