IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    Windows 10 UWP开发:如何弹出消息通知

    汪宇杰发表于 2015-11-08 04:17:38
    love 0

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

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



沪ICP备19023445号-2号
友情链接