zoukankan      html  css  js  c++  java
  • 重新想象 Windows 8 Store Apps (35)

    [源码下载]


    重新想象 Windows 8 Store Apps (35) - 通知: Toast 详解



    作者:webabcd


    介绍
    重新想象 Windows 8 Store Apps 之 通知

    • Toast - 基本应用参见 http://www.cnblogs.com/webabcd/archive/2013/06/17/3139740.html
    • Toast - 纯文本 toast
    • Toast - 图文 toast
    • Toast - toast 的提示音
    • Toast - 按计划弹出 toast



    示例
    1、演示纯文本 toast 的 4 个模板
    Notification/Toast/ToastWithText.xaml

    <Page
        x:Class="XamlDemo.Notification.Toast.ToastWithText"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="using:XamlDemo.Notification.Toast"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d">
    
        <Grid Background="Transparent">
            <StackPanel Margin="120 0 0 0">
    
                <TextBox Name="lblMsg" Height="100" TextWrapping="Wrap" AcceptsReturn="True" FontSize="14.667" Margin="0 0 10 0" />
    
                <Button Name="btnTextBodyWrap" Content="TextBodyWrap" Click="btnTextBodyWrap_Click_1" Margin="0 10 0 0" />
    
                <Button Name="bntTextHeadingTextBodyWrap" Content="TextHeading TextBodyWrap" Click="bntTextHeadingTextBodyWrap_Click_1" Margin="0 10 0 0" />
    
                <Button Name="bntTextHeadingWrapTextBody" Content="TextHeadingWrap TextBody" Click="bntTextHeadingWrapTextBody_Click_1" Margin="0 10 0 0" />
    
                <Button Name="bntTextHeadingTextBody" Content="TextHeading TextBody1 TextBody2" Click="bntTextHeadingTextBody_Click_1" Margin="0 10 0 0" />
                
            </StackPanel>
        </Grid>
    </Page>
        

    Notification/Toast/ToastWithText.xaml.cs

    /*
     * 演示纯文本 toast 的 4 个模板
     * 本示例的 Toast 的 XmlDocument 内容构造器采用一个开源项目,具体代码见:NotificationsExtensions/ToastContent.cs
     * 
     * XmlDocument GetTemplateContent(ToastTemplateType type) - 获取系统支持的 Toast 模板
     *     ToastTemplateType.ToastText01, ToastTemplateType.ToastText02, ToastTemplateType.ToastText03, ToastTemplateType.ToastText04
     */
    
    using NotificationsExtensions.ToastContent;
    using Windows.UI.Notifications;
    using Windows.UI.Xaml;
    using Windows.UI.Xaml.Controls;
    
    namespace XamlDemo.Notification.Toast
    {
        public sealed partial class ToastWithText : Page
        {
            public ToastWithText()
            {
                this.InitializeComponent();
            }
    
            private void btnTextBodyWrap_Click_1(object sender, RoutedEventArgs e)
            {
                IToastText01 templateContent = ToastContentFactory.CreateToastText01();
                templateContent.TextBodyWrap.Text = "我是通知正文,可换行,最多三行。我是通知正文,可换行,最多三行。我是通知正文,可换行,最多三行。";
                IToastNotificationContent toastContent = templateContent;
    
                ToastNotification toast = toastContent.CreateNotification();
                ToastNotificationManager.CreateToastNotifier().Show(toast);
    
                lblMsg.Text = toastContent.GetContent();
            }
    
            private void bntTextHeadingTextBodyWrap_Click_1(object sender, RoutedEventArgs e)
            {
                IToastText02 templateContent = ToastContentFactory.CreateToastText02();
                templateContent.TextHeading.Text = "我是通知标题,不可以换行。我是通知标题,不可以换行。";
                templateContent.TextBodyWrap.Text = "我是通知正文,可换行,最多两行。我是通知正文,可换行,最多两行。";
                IToastNotificationContent toastContent = templateContent;
    
                ToastNotification toast = toastContent.CreateNotification();
                ToastNotificationManager.CreateToastNotifier().Show(toast);
    
                lblMsg.Text = toastContent.GetContent();
            }
    
            private void bntTextHeadingWrapTextBody_Click_1(object sender, RoutedEventArgs e)
            {
                IToastText03 templateContent = ToastContentFactory.CreateToastText03();
                templateContent.TextHeadingWrap.Text = "我是通知标题,可换行,最多两行。我是通知标题,可换行,最多两行。";
                templateContent.TextBody.Text = "我是通知正文,不可以换行。我是通知正文,不可以换行。";
                IToastNotificationContent toastContent = templateContent;
    
                ToastNotification toast = toastContent.CreateNotification();
                ToastNotificationManager.CreateToastNotifier().Show(toast);
    
                lblMsg.Text = toastContent.GetContent();
            }
    
            private void bntTextHeadingTextBody_Click_1(object sender, RoutedEventArgs e)
            {
                IToastText04 templateContent = ToastContentFactory.CreateToastText04();
                templateContent.TextHeading.Text = "我是通知标题,不可以换行。我是通知标题,不可以换行。";
                templateContent.TextBody1.Text = "我是通知正文1,不可以换行。我是通知正文1,不可以换行。";
                templateContent.TextBody2.Text = "我是通知正文2,不可以换行。我是通知正文2,不可以换行。";
                IToastNotificationContent toastContent = templateContent;
    
                ToastNotification toast = toastContent.CreateNotification();
                ToastNotificationManager.CreateToastNotifier().Show(toast);
    
                lblMsg.Text = toastContent.GetContent();
            }
        }
    }


    2、演示图文 toast 的 4 个模板
    Notification/Toast/ToastWithImageText.xaml

    <Page
        x:Class="XamlDemo.Notification.Toast.ToastWithImageText"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="using:XamlDemo.Notification.Toast"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d">
    
        <Grid Background="Transparent">
            <StackPanel Margin="120 0 0 0">
    
                <TextBox Name="lblMsg" Height="100" TextWrapping="Wrap" AcceptsReturn="True" FontSize="14.667" Margin="0 0 10 0" />
    
                <Button Name="btnTextBodyWrap" Content="TextBodyWrap" Click="btnTextBodyWrap_Click_1" Margin="0 10 0 0" />
    
                <Button Name="bntTextHeadingTextBodyWrap" Content="TextHeading TextBodyWrap" Click="bntTextHeadingTextBodyWrap_Click_1" Margin="0 10 0 0" />
    
                <Button Name="bntTextHeadingWrapTextBody" Content="TextHeadingWrap TextBody" Click="bntTextHeadingWrapTextBody_Click_1" Margin="0 10 0 0" />
    
                <Button Name="bntTextHeadingTextBody" Content="TextHeading TextBody1 TextBody2" Click="bntTextHeadingTextBody_Click_1" Margin="0 10 0 0" />
                
            </StackPanel>
        </Grid>
    </Page>

    Notification/Toast/ToastWithImageText.xaml.cs

    /*
     * 演示图文 toast 的 4 个模板(注:图片不能大于 1024*1024 像素,不能大于 200KB)
     * 本示例的 Toast 的 XmlDocument 内容构造器采用一个开源项目,具体代码见:NotificationsExtensions/ToastContent.cs
     * 
     * XmlDocument GetTemplateContent(ToastTemplateType type) - 获取系统支持的 Toast 模板
     *     ToastTemplateType.ToastImageAndText01, ToastTemplateType.ToastImageAndText02, ToastTemplateType.ToastImageAndText03, ToastTemplateType.ToastImageAndText04
     *     
     * 注:图片可以来自程序包内,可以来自 Application Data(仅支持对 local 中图片文件的引用),可以来自一个 http 的远程地址
     */
    
    using NotificationsExtensions.ToastContent;
    using System;
    using Windows.UI.Notifications;
    using Windows.UI.Xaml;
    using Windows.UI.Xaml.Controls;
    
    namespace XamlDemo.Notification.Toast
    {
        public sealed partial class ToastWithImageText : Page
        {
            public ToastWithImageText()
            {
                this.InitializeComponent();
            }
    
            private void btnTextBodyWrap_Click_1(object sender, RoutedEventArgs e)
            {
                IToastImageAndText01 templateContent = ToastContentFactory.CreateToastImageAndText01();
                templateContent.TextBodyWrap.Text = "我是通知正文,可换行,最多三行。我是通知正文,可换行,最多三行。我是通知正文,可换行,最多三行。";
                templateContent.Image.Src = "Assets/Logo.png"; // 用程序包内文件作通知图片
                templateContent.Image.Alt = "altText";
                IToastNotificationContent toastContent = templateContent;
    
                ToastNotification toast = toastContent.CreateNotification();
                ToastNotificationManager.CreateToastNotifier().Show(toast);
    
                lblMsg.Text = toastContent.GetContent();
            }
    
            private void bntTextHeadingTextBodyWrap_Click_1(object sender, RoutedEventArgs e)
            {
                IToastImageAndText02 templateContent = ToastContentFactory.CreateToastImageAndText02();
                templateContent.TextHeading.Text = "我是通知标题,不可以换行。我是通知标题,不可以换行。";
                templateContent.TextBodyWrap.Text = "我是通知正文,可换行,最多两行。我是通知正文,可换行,最多两行。";
                templateContent.Image.Src = "ms-appx:///Assets/Logo.png"; // 用程序包内文件作通知图片
                templateContent.Image.Alt = "altText";
                IToastNotificationContent toastContent = templateContent;
    
                ToastNotification toast = toastContent.CreateNotification();
                ToastNotificationManager.CreateToastNotifier().Show(toast);
    
                lblMsg.Text = toastContent.GetContent();
            }
    
            private void bntTextHeadingWrapTextBody_Click_1(object sender, RoutedEventArgs e)
            {
                IToastImageAndText03 templateContent = ToastContentFactory.CreateToastImageAndText03();
                templateContent.TextHeadingWrap.Text = "我是通知标题,可换行,最多两行。我是通知标题,可换行,最多两行。";
                templateContent.TextBody.Text = "我是通知正文,不可以换行。我是通知正文,不可以换行。";
                templateContent.Image.Src = "ms-appdata:///local/Logo.png"; // 用 Application Data 内文件作通知图片(注:仅支持 local 中的图片)
                templateContent.Image.Alt = "altText";
                IToastNotificationContent toastContent = templateContent;
    
                ToastNotification toast = toastContent.CreateNotification();
                ToastNotificationManager.CreateToastNotifier().Show(toast);
    
                lblMsg.Text = toastContent.GetContent();
            }
    
            private void bntTextHeadingTextBody_Click_1(object sender, RoutedEventArgs e)
            {
                IToastImageAndText04 templateContent = ToastContentFactory.CreateToastImageAndText04();
                templateContent.TextHeading.Text = "我是通知标题,不可以换行。我是通知标题,不可以换行。";
                templateContent.TextBody1.Text = "我是通知正文1,不可以换行。我是通知正文1,不可以换行。";
                templateContent.TextBody2.Text = "我是通知正文2,不可以换行。我是通知正文2,不可以换行。";
                templateContent.Image.Src = "http://pic.cnblogs.com/avatar/a14540.jpg?id=24173245"; // 用远程文件作通知图片
                templateContent.Image.Alt = "altText";
                IToastNotificationContent toastContent = templateContent;
    
                ToastNotification toast = toastContent.CreateNotification();
                ToastNotificationManager.CreateToastNotifier().Show(toast);
    
                lblMsg.Text = toastContent.GetContent();
            }
        }
    }


    3、演示 Toast 的提示音
    Notification/Toast/ToastWithSound.xaml

    <Page
        x:Class="XamlDemo.Notification.Toast.ToastWithSound"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="using:XamlDemo.Notification.Toast"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d">
    
        <Grid Background="Transparent">
            <StackPanel Margin="120 0 0 0">
    
                <TextBox Name="lblMsg" Height="100" TextWrapping="Wrap" AcceptsReturn="True" FontSize="14.667" Margin="0 0 10 0" />
    
                <TextBlock Text="通知提示音列表" Margin="0 10 0 0" />
                <ListBox Name="listBox" SelectionChanged="listBox_SelectionChanged_1" Margin="0 10 10 0">
                    <ListBoxItem Content="Default" />
                    <ListBoxItem Content="Mail" />
                    <ListBoxItem Content="SMS" />
                    <ListBoxItem Content="IM" />
                    <ListBoxItem Content="Reminder" />
                    <ListBoxItem Content="LoopingCall" />
                    <ListBoxItem Content="LoopingCall2" />
                    <ListBoxItem Content="LoopingAlarm" />
                    <ListBoxItem Content="LoopingAlarm2" />
                    <ListBoxItem Content="Silent" />
                </ListBox>
            </StackPanel>
        </Grid>
    </Page>

    Notification/Toast/ToastWithSound.xaml.cs

    /*
     * 演示 Toast 的提示音
     * 
     * 目前支持的 Toast 提示音共有以下几种:
     * Default, Mail, SMS, IM, Reminder, LoopingCall, LoopingCall2, LoopingAlarm, LoopingAlarm2, Silent
     */
    
    using NotificationsExtensions.ToastContent;
    using System;
    using Windows.UI.Notifications;
    using Windows.UI.Xaml.Controls;
    
    namespace XamlDemo.Notification.Toast
    {
        public sealed partial class ToastWithSound : Page
        {
            public ToastWithSound()
            {
                this.InitializeComponent();
            }
    
            private void listBox_SelectionChanged_1(object sender, SelectionChangedEventArgs e)
            {
                string audioType = (listBox.SelectedItem as ListBoxItem).Content.ToString();
    
                IToastText02 toastContent = ToastContentFactory.CreateToastText02();
                toastContent.TextHeading.Text = "Sound:";
                toastContent.TextBodyWrap.Text = audioType;
                toastContent.Audio.Content = (ToastAudioContent)Enum.Parse(typeof(ToastAudioContent), audioType);
    
                /*
                 * LoopingCall, LoopingCall2, LoopingAlarm, LoopingAlarm2 这 4 种提示音仅针对长时通知,且需指定为循环提示音
                 */
                if (audioType == "LoopingCall" || audioType == "LoopingCall2" || audioType == "LoopingAlarm" || audioType == "LoopingAlarm2")
                {
                    toastContent.Duration = ToastDuration.Long;
                    toastContent.Audio.Loop = true;
                }
                
                ToastNotification toast = toastContent.CreateNotification();
                ToastNotificationManager.CreateToastNotifier().Show(toast);
    
                lblMsg.Text = toastContent.GetContent();
            }
        }
    }


    4、演示如何按计划显示 Toast 通知
    Notification/Toast/ScheduledToast.xaml

    <Page
        x:Class="XamlDemo.Notification.Toast.ScheduledToast"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="using:XamlDemo.Notification.Toast"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d">
    
        <Grid Background="Transparent">
            <StackPanel Margin="120 0 0 0">
    
                <!--显示当前 app 的全部 ScheduledToastNotification 对象列表-->
                <ListBox Name="listBox" Width="800" Height="300" HorizontalAlignment="Left">
                    <ListBox.ItemTemplate>
                        <DataTemplate>
                            <StackPanel Orientation="Horizontal">
                                <TextBlock Text="{Binding ToastId}" VerticalAlignment="Center" />
                                <TextBlock Text="{Binding Text}" Margin="15 0 0 0" VerticalAlignment="Center" />
                                <HyperlinkButton Name="btnRemove" Content="删除此 ScheduledToastNotification" Tag="{Binding ToastId}" Margin="15 0 0 0" Click="btnRemove_Click_1" />
                            </StackPanel>
                        </DataTemplate>
                    </ListBox.ItemTemplate>
                </ListBox>
    
                <Button Name="btnScheduledToast" Content="ScheduledToastNotification 的 Demo(3 秒后弹出 Toast 通知,然后每隔 60 秒再弹出一次,共重复 5 次)" Click="btnScheduledToast_Click_1" Margin="0 10 0 0" />
    
            </StackPanel>
        </Grid>
    </Page>

    Notification/Toast/ScheduledToast.xaml.cs

    /*
     * 演示如何按计划显示 Toast 通知
     * 
     * ScheduledToastNotification - 按计划显示 Toast 通知
     *     Content - Toast 的内容,XmlDocument 类型的数据,只读,其需要在构造函数中指定
     *     DeliveryTime - 显示 Toast 通知的时间,只读,其需要在构造函数中指定
     *     SnoozeInterval - 循环显示 Toast 通知的间隔时长(60 秒 - 60 分之间),只读,其需要在构造函数中指定
     *     MaximumSnoozeCount - 循环的最大次数(1 - 5 次)
     *     Id - ScheduledToastNotification 的标识
     *     
     * ToastNotifier - Toast 通知器
     *     AddToSchedule() - 将指定的 ScheduledToastNotification 添加到计划列表
     *     RemoveFromSchedule() - 从计划列表中移除指定的 ScheduledToastNotification
     *     GetScheduledToastNotifications() - 获取当前 app 的全部 ScheduledToastNotification 集合
     */
    
    using NotificationsExtensions.ToastContent;
    using System;
    using System.Collections.Generic;
    using Windows.UI.Notifications;
    using Windows.UI.Xaml;
    using Windows.UI.Xaml.Controls;
    using Windows.UI.Xaml.Navigation;
    
    namespace XamlDemo.Notification.Toast
    {
        public sealed partial class ScheduledToast : Page
        {
            public ScheduledToast()
            {
                this.InitializeComponent();
            }
    
            protected override void OnNavigatedTo(NavigationEventArgs e)
            {
                ShowScheduledToasts();
            }
    
            // 添加指定的 ScheduledToastNotification 到计划列表中
            private void btnScheduledToast_Click_1(object sender, RoutedEventArgs e)
            {
                IToastText02 toastContent = ToastContentFactory.CreateToastText02();
                toastContent.TextHeading.Text = "ScheduledToastNotification Demo";
                toastContent.TextBodyWrap.Text = "received: " + DateTime.Now.ToString("hh:mm:ss");
    
                // 3 秒后显示 Toast,然后每隔 60 秒再显示一次 Toast(循环显示 5 次)
                ScheduledToastNotification toast = new ScheduledToastNotification(toastContent.GetXml(), DateTime.Now.AddSeconds(3), TimeSpan.FromSeconds(60), 5);
    
                string toastId = new Random().Next(1000, 10000).ToString();
                toast.Id = toastId;
    
                // 将指定的 ScheduledToastNotification 添加进计划列表
                ToastNotifier toastNotifier = ToastNotificationManager.CreateToastNotifier();
                toastNotifier.AddToSchedule(toast);
    
                ShowScheduledToasts();
            }
    
            // 显示当前 app 的全部 ScheduledToastNotification 列表
            private void ShowScheduledToasts()
            {
                List<MyScheduledToast> dataSource = new List<MyScheduledToast>();
    
                // 获取当前 app 计划列表中的全部 ScheduledToastNotification 对象列表
                ToastNotifier toastNotifier = ToastNotificationManager.CreateToastNotifier();
                IReadOnlyList<ScheduledToastNotification> scheduledToasts = toastNotifier.GetScheduledToastNotifications();
    
                int toastCount = scheduledToasts.Count;
                for (int i = 0; i < toastCount; i++)
                {
                    ScheduledToastNotification toast = scheduledToasts[i];
    
                    dataSource.Add(new MyScheduledToast()
                    {
                        ToastId = toast.Id,
                        Text = toast.Content.GetElementsByTagName("text")[0].InnerText
                    });
                }
    
                listBox.ItemsSource = dataSource;
            }
    
            // 根据 ToastId 删除指定的 ScheduledToastNotification
            private void btnRemove_Click_1(object sender, RoutedEventArgs e)
            {
                string toastId = (string)(sender as FrameworkElement).Tag;
    
                // 获取当前 app 计划列表中的全部 ScheduledToastNotification 对象列表
                ToastNotifier toastNotifier = ToastNotificationManager.CreateToastNotifier();
                IReadOnlyList<ScheduledToastNotification> scheduledToasts = toastNotifier.GetScheduledToastNotifications();
    
                int toastLength = scheduledToasts.Count;
                for (int i = 0; i < toastLength; i++)
                {
                    if (scheduledToasts[i].Id == toastId)
                    {
                        // 从计划列表中移除指定的 ScheduledToastNotification 对象
                        toastNotifier.RemoveFromSchedule(scheduledToasts[i]);
    
                        ShowScheduledToasts();
    
                        break;
                    }
                }
            }
    
            class MyScheduledToast
            {
                public string ToastId { get; set; }
                public string Text { get; set; }
            }
        }
    }



    OK
    [源码下载]

  • 相关阅读:
    程序猿也爱学英语(上),有图有真相
    时间&物质&效率
    20130722
    Java数组操作工具
    小学课文《挑山工》
    字符编解码的故事(ASCII,ANSI,Unicode,Utf-8区别)
    String[]转化暴露“思维误区”
    2017.9.17 小测试小整理
    Noip2016 提高组 Day1
    luogu P2585 [ZJOI2006]三色二叉树
  • 原文地址:https://www.cnblogs.com/webabcd/p/3145356.html
Copyright © 2011-2022 走看看