• 背水一战 Windows 10 (103) 通知(Toast): 基础, 按计划显示 toast 通知
  • [源码下载]


    背水一战 Windows 10 (103) - 通知(Toast): 基础, 按计划显示 toast 通知



    作者:webabcd


    介绍
    背水一战 Windows 10 之 通知(Toast)

    • 基础
    • 按计划显示 toast 通知



    示例
    1、本例用于演示当通过 toast 激活 app 时(前台方式激活),如何获取相关信息
    Notification/Toast/Demo.xaml

    <Page
        x:Class="Windows10.Notification.Toast.Demo"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="using:Windows10.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="Blue">
    
            <TextBlock Name="lblMsg" VerticalAlignment="Center" HorizontalAlignment="Center" />
    
        </Grid>
    </Page>

    Notification/Toast/Demo.xaml.cs

    /*
     * 本例用于演示当通过 toast 激活 app 时(前台方式激活),如何获取相关信息
     * 
     * 
     * 在 App.xaml.cs 中 override void OnActivated(IActivatedEventArgs args),以获取相关的 toast 信息
     * 
     * ToastNotificationActivatedEventArgs - 通过 toast 激活应用程序时(前台方式激活)的事件参数
     *     Argument - 由 toast 传递过来的参数
     *     UserInput - 由 toast 传递过来的输入框数据
     *     Kind - 此 app 被激活的类型(ActivationKind 枚举)
     *         比如,如果是通过“打开文件”激活的话,则此值为 File
     *     PreviousExecutionState - 此 app 被激活前的状态(ApplicationExecutionState 枚举)
     *         比如,如果此 app 被激活前就是运行状态的或,则此值为 Running
     *     SplashScreen - 获取此 app 的 SplashScreen 对象
     *     User - 获取激活了此 app 的 User 对象
     */
    
    using System;
    using Windows.ApplicationModel.Activation;
    using Windows.UI.Xaml.Controls;
    using Windows.UI.Xaml.Navigation;
    
    namespace Windows10.Notification.Toast
    {
        public sealed partial class Demo : Page
        {
            private ToastNotificationActivatedEventArgs _toastArgs;
    
            public Demo()
            {
                this.InitializeComponent();
            }
    
            protected override void OnNavigatedTo(NavigationEventArgs e)
            {
                // 获取 ToastNotificationActivatedEventArgs 对象(从 App.xaml.cs 传来的)
                _toastArgs = e.Parameter as ToastNotificationActivatedEventArgs;
    
                if (_toastArgs != null)
                {
                    // 获取 toast 的参数
                    lblMsg.Text = "argument: " + _toastArgs.Argument;
                    lblMsg.Text += Environment.NewLine;
    
                    // 获取 toast 的 输入框数据
                    // UserInput 是一个 ValueSet 类型的数据,其继承自 IEnumerable 接口,可以 foreach(不能 for)
                    foreach (string key in _toastArgs.UserInput.Keys)
                    {
                        lblMsg.Text += $"key:{key}, value:{_toastArgs.UserInput[key]}";
                        lblMsg.Text += Environment.NewLine;
                    }
                }
            }
        }
    }


    2、本例用于演示 toast 的基础
    Notification/Toast/Basic.xaml

    <Page
        x:Class="Windows10.Notification.Toast.Basic"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="using:Windows10.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="10 0 10 10">
    
                <Button Name="buttonShowToast1" Content="显示 toast" Click="buttonShowToast1_Click" Margin="5" />
    
                <Button Name="buttonShowToast2" Content="显示 toast(设置 toast 的过期时间)" Click="buttonShowToast2_Click" Margin="5" />
    
                <Button Name="buttonShowToast3" Content="显示 toast(无 toast 通知 UI,仅放置于操作中心)" Click="buttonShowToast3_Click" Margin="5" />
    
            </StackPanel>
        </Grid>
    </Page>

    Notification/Toast/Basic.xaml.cs

    /*
     * 本例用于演示 toast 的基础
     * 单击 toast 激活 app 后(前台方式激活),如何获取相关信息请参见 Demo.xaml.cs 中的代码
     * 
     * 
     * ToastNotification - toast 通知
     *     Content - 一个 Windows.Data.Xml.Dom.XmlDocument 类型的对象(在构造函数中需要传递此对象),用于描述 toast 的 xml
     *     SuppressPopup - 默认值为 false
     *         false - 弹出 toast 通知,并放置于操作中心
     *         true - 不弹出 toast 通知,仅放置于操作中心
     *     ExpirationTime - 过期时间,超过这个时间就会从操作中心中移除
     *     ToastNotificationPriority - 优先级(Default 或 High)
     *     Group, Tag - 用于标识 toast 对象(前 16 个字符相同则认为相同)
     *         同 group 且同 tag 则视为同一 toast,即新 toast 会更新旧 toast
     *         系统会将所用未指定 group 的 toast 视为同 group
     *         系统会将所用未指定 tag 的 toast 视为不同 tag
     *     Activated - 通过 toast 激活 app 时触发的事件
     *     Dismissed - 弹出的 toast 通知 UI 消失时触发的事件
     *     Failed - 弹出 toast 通知时失败
     *     
     * ToastNotificationManager - toast 通知管理器
     *     CreateToastNotifier() - 创建 ToastNotifier 对象
     *     History - 获取 ToastNotificationHistory 对象
     *     
     * ToastNotifier - toast 通知器
     *     Show(ToastNotification notification) - 弹出指定的 toast 通知
     *     Hide(ToastNotification notification) - 移除指定的 toast 通知
     *     Setting - 获取系统的通知设置
     *         Enabled - 通知可被显示
     *         DisabledForApplication - 用户禁用了此应用程序的通知
     *         DisabledForUser - 用户禁用了此计算机此账户的所有通知
     *         DisabledByGroupPolicy - 管理员通过组策略禁止了此计算机上的所有通知
     *         DisabledByManifest - 应用程序未在 Package.appxmanifest 中设置“应用图标”(其实你要是不设置的话编译都不会通过)
     *         
     * ToastNotificationHistory - 本 app 的 toast 通知历史
     *     Clear() - 全部清除(从操作中心中移除)
     *     RemoveGroup() - 清除指定 group 的通知(从操作中心中移除)
     *     Remove() - 清除指定 tag 的通知或清除指定 tag 和 group 的通知(从操作中心中移除)
     *     GetHistory() - 获取历史数据,一个 ToastNotification 类型对象的集合(已被从操作中心中移除的是拿不到的)
     *     
     *     
     *     
     * 注:本例是通过 xml 来构造 toast 的,另外也可以通过 NuGet 的 Microsoft.Toolkit.Uwp.Notifications 来构造 toast(其用 c# 对 xml 做了封装)
     */
    
    using System;
    using System.Diagnostics;
    using Windows.Data.Xml.Dom;
    using Windows.UI.Notifications;
    using Windows.UI.Xaml;
    using Windows.UI.Xaml.Controls;
    
    namespace Windows10.Notification.Toast
    {
        public sealed partial class Basic : Page
        {
            public Basic()
            {
                this.InitializeComponent();
            }
    
            // 弹出 toast 通知
            private void buttonShowToast1_Click(object sender, RoutedEventArgs e)
            {
                // 清除本 app 的之前的全部 toast 通知
                // ToastNotificationManager.History.Clear();
    
                // 用于描述 toast 通知的 xml 字符串
                string toastXml = $@"
                    <toast activationType='foreground' launch='Notification-Toast-Basic-Arguments 1'>
                        <visual>
                            <binding template='ToastGeneric'>
                                <text>toast - title</text>
                                <text>toast - content 1 {DateTime.Now.ToString("mm:ss")}</text>
                            </binding>
                        </visual>
                    </toast>";
    
                // 将 xml 字符串转换为 Windows.Data.Xml.Dom.XmlDocument 对象
                XmlDocument toastDoc = new XmlDocument();
                toastDoc.LoadXml(toastXml);
    
                // 实例化 ToastNotification 对象
                ToastNotification toast = new ToastNotification(toastDoc);
                // 系统会将所用未指定 group 的 toast 视为同 group
                // 同 group 且同 tag 则视为同一 toast,即新 toast 会更新旧 toast
                toast.Tag = "1";
    
                toast.Activated += Toast_Activated;
                toast.Dismissed += Toast_Dismissed;
                toast.Failed += Toast_Failed;
    
                // 弹出 toast 通知
                ToastNotifier toastNotifier = ToastNotificationManager.CreateToastNotifier();
                toastNotifier.Show(toast);
            }
    
            // 弹出 toast 通知(设置 toast 的过期时间)
            private void buttonShowToast2_Click(object sender, RoutedEventArgs e)
            {
                // 清除本 app 的之前的全部 toast 通知
                // ToastNotificationManager.History.Clear();
    
                string toastXml = $@"
                    <toast activationType='foreground' launch='Notification-Toast-Basic-Arguments 2'>
                        <visual>
                            <binding template='ToastGeneric'>
                                <text>toast - title</text>
                                <text>toast - content 2 {DateTime.Now.ToString("mm:ss")}</text>
                            </binding>
                        </visual>
                    </toast>";
    
                XmlDocument toastDoc = new XmlDocument();
                toastDoc.LoadXml(toastXml);
    
                ToastNotification toast = new ToastNotification(toastDoc);
                DateTimeOffset expirationTime = DateTimeOffset.UtcNow.AddSeconds(30);
                toast.ExpirationTime = expirationTime; // 30 秒后 toast 通知将从操作中心中移除
    
                // 系统会将所用未指定 group 的 toast 视为同 group
                // 系统会将所用未指定 tag 的 toast 视为不同 tag(此时虽然获取 tag 时其为空字符串,但是系统会认为其是一个随机值)
                // 每次弹出此 toast 时都会被认为是一个全新的 toast
                // toast.Tag = "2";
    
                toast.Activated += Toast_Activated;
                toast.Dismissed += Toast_Dismissed;
                toast.Failed += Toast_Failed;
    
                ToastNotifier toastNotifier = ToastNotificationManager.CreateToastNotifier();
                toastNotifier.Show(toast);
            }
    
            // 弹出 toast 通知(无 toast 通知 UI,仅放置于操作中心)
            private void buttonShowToast3_Click(object sender, RoutedEventArgs e)
            {
                // 清除本 app 的之前的全部 toast 通知
                // ToastNotificationManager.History.Clear();
    
                string toastXml = $@"
                    <toast activationType='foreground' launch='Notification-Toast-Basic-Arguments 3'>
                        <visual>
                            <binding template='ToastGeneric'>
                                <text>toast - title</text>
                                <text>toast - content 3 {DateTime.Now.ToString("mm:ss")}</text>
                            </binding>
                        </visual>
                    </toast>";
    
                XmlDocument toastDoc = new XmlDocument();
                toastDoc.LoadXml(toastXml);
    
                ToastNotification toast = new ToastNotification(toastDoc);
                toast.SuppressPopup = true; // 不会弹出 toast 通知 UI,但是会放置于操作中心
                toast.Tag = "3";
    
                toast.Activated += Toast_Activated;
                toast.Dismissed += Toast_Dismissed;
                toast.Failed += Toast_Failed;
    
                ToastNotifier toastNotifier = ToastNotificationManager.CreateToastNotifier();
                toastNotifier.Show(toast);
            }
    
    
            private void Toast_Activated(ToastNotification sender, object args)
            {
                Debug.WriteLine(sender.Tag + " Toast_Activated");
            }
    
            private void Toast_Dismissed(ToastNotification sender, ToastDismissedEventArgs args)
            {
                Debug.WriteLine(sender.Tag + " Toast_Dismissed");
            }
    
            private void Toast_Failed(ToastNotification sender, ToastFailedEventArgs args)
            {
                Debug.WriteLine(sender.Tag + " Toast_Failed");
            }
        }
    }


    3、演示如何按计划显示 toast 通知(在指定的时间显示指定的 toast 通知)
    Notification/Toast/Schedule.xaml

    <Page
        x:Class="Windows10.Notification.Toast.Schedule"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="using:Windows10.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="10 0 10 10">
    
                <!--显示当前 app 的全部 ScheduledToastNotification 对象列表-->
                <ListBox Name="listBox" Width="800" Height="400" Margin="5" HorizontalAlignment="Left">
                    <ListBox.ItemTemplate>
                        <DataTemplate>
                            <StackPanel Orientation="Horizontal">
                                <TextBlock Text="{Binding Id}" VerticalAlignment="Center" />
                                <TextBlock Text="{Binding Tag}" Margin="15 0 0 0" VerticalAlignment="Center" />
                                <HyperlinkButton Name="btnRemoveScheduledToast" Content="删除此 ScheduledToastNotification" Tag="{Binding Id}" Margin="15 0 0 0" Click="btnRemoveScheduledToast_Click" />
                            </StackPanel>
                        </DataTemplate>
                    </ListBox.ItemTemplate>
                </ListBox>
    
                <Button Name="btnAddScheduledToast" Content="添加指定的 ScheduledToastNotification 到计划列表中" Click="btnAddScheduledToast_Click" Margin="5" />
    
            </StackPanel>
        </Grid>
    </Page>

    Notification/Toast/Schedule.xaml.cs

    /*
     * 演示如何按计划显示 toast 通知(在指定的时间显示指定的 toast 通知)
     * 
     * ScheduledToastNotification - 按计划显示 Toast 通知
     *     Content - Toast 的内容,XmlDocument 类型的数据,只读,其需要在构造函数中指定
     *     DeliveryTime - 显示 Toast 通知的时间,只读,其需要在构造函数中指定
     *     SnoozeInterval - 循环显示 Toast 通知的间隔时长(60 秒 - 60 分之间),只读,其需要在构造函数中指定(经测试,此逻辑无效)
     *     MaximumSnoozeCount - 循环的最大次数(1 - 5 次),只读,其需要在构造函数中指定(经测试,此逻辑无效)
     *     Id - ScheduledToastNotification 的标识
     *     Group, Tag - 用于标识 toast 对象(前 16 个字符相同则认为相同)
     *         同 group 且同 tag 则视为同一 toast,即新 toast 会更新旧 toast
     *         系统会将所用未指定 group 的 toast 视为同 group
     *         系统会将所用未指定 tag 的 toast 视为不同 tag
     *     SuppressPopup - 默认值为 false
     *         false - 弹出 toast 通知,并放置于操作中心
     *         true - 不弹出 toast 通知,仅放置于操作中心
     *     
     * ToastNotifier - toast 通知器
     *     AddToSchedule() - 将指定的 ScheduledToastNotification 对象添加到计划列表
     *     RemoveFromSchedule() - 从计划列表中移除指定的 ScheduledToastNotification 对象
     *     GetScheduledToastNotifications() - 获取当前 app 的全部 ScheduledToastNotification 对象列表
     */
    
    using System;
    using System.Collections.Generic;
    using Windows.Data.Xml.Dom;
    using Windows.UI.Notifications;
    using Windows.UI.Xaml;
    using Windows.UI.Xaml.Controls;
    using Windows.UI.Xaml.Navigation;
    
    namespace Windows10.Notification.Toast
    {
        public sealed partial class Schedule : Page
        {
            public Schedule()
            {
                this.InitializeComponent();
            }
    
            protected override void OnNavigatedTo(NavigationEventArgs e)
            {
                ShowScheduledToasts();
            }
    
            // 添加指定的 ScheduledToastNotification 到计划列表中
            private void btnAddScheduledToast_Click(object sender, RoutedEventArgs e)
            {
                string toastXml = $@"
                    <toast activationType='foreground' launch='Notification-Toast-Schedule-Arguments'>
                        <visual>
                            <binding template='ToastGeneric'>
                                <text>toast - title</text>
                                <text>toast - content {DateTime.Now.ToString("mm:ss")}</text>
                            </binding>
                        </visual>
                    </toast>";
    
                // 将 xml 字符串转换为 Windows.Data.Xml.Dom.XmlDocument 对象
                XmlDocument toastDoc = new XmlDocument();
                toastDoc.LoadXml(toastXml);
    
                // 实例化 ScheduledToastNotification 对象(15 秒后显示此 Toast 通知,然后每隔 60 秒再显示一次 Toast,循环显示 5 次)
                // 但是经测试,只会显示一次,无法循环显示,不知道为什么
                // ScheduledToastNotification toastNotification = new ScheduledToastNotification(toastDoc, DateTime.Now.AddSeconds(15), TimeSpan.FromSeconds(60), 5);
    
                // 实例化 ScheduledToastNotification 对象(15 秒后显示此 Toast 通知)
                ScheduledToastNotification toastNotification = new ScheduledToastNotification(toastDoc, DateTime.Now.AddSeconds(15));
    
                toastNotification.Id = new Random().Next(100000, 1000000).ToString();
                toastNotification.Tag = toastDoc.GetElementsByTagName("text")[1].InnerText;
    
                // 将指定的 ScheduledToastNotification 添加进计划列表
                ToastNotifier toastNotifier = ToastNotificationManager.CreateToastNotifier();
                toastNotifier.AddToSchedule(toastNotification);
    
                ShowScheduledToasts();
            }
            
            // 删除指定的 ScheduledToastNotification 对象
            private void btnRemoveScheduledToast_Click(object sender, RoutedEventArgs e)
            {
                string notificationId = (string)(sender as FrameworkElement).Tag;
    
                // 获取当前 app 的全部 ScheduledToastNotification 对象列表
                ToastNotifier toastNotifier = ToastNotificationManager.CreateToastNotifier();
                IReadOnlyList<ScheduledToastNotification> notifications = toastNotifier.GetScheduledToastNotifications();
    
                int notificationCount = notifications.Count;
                for (int i = 0; i < notificationCount; i++)
                {
                    if (notifications[i].Id == notificationId)
                    {
                        // 从计划列表中移除指定的 ScheduledToastNotification 对象
                        toastNotifier.RemoveFromSchedule(notifications[i]);
                        break;
                    }
                }
    
                ShowScheduledToasts();
            }
    
            // 显示当前 app 的全部 ScheduledToastNotification 列表
            private void ShowScheduledToasts()
            {
                // 获取当前 app 的全部 ScheduledToastNotification 对象列表
                ToastNotifier toastNotifier = ToastNotificationManager.CreateToastNotifier();
                IReadOnlyList<ScheduledToastNotification> notifications = toastNotifier.GetScheduledToastNotifications();
    
                listBox.ItemsSource = notifications;
            }
        }
    }



    OK
    [源码下载]

  • 相关阅读:
    周末没事干就看CSS JS Python ThinkPHP的书,照着例子运行就行,可以增强信心(还有QML,虚拟机运行Web。Windows核心编程,照着例子运行。没事看看socket和rest的例子和文档,还有POCO和BOOST)
    mybatis+postgresql10插入返回主键ID
    Windows 10 MBR转GPT分区
    Windows 10彻底关闭自动更新
    vi显示行号
    背水一战 Windows 10 (122) 其它: 通过 Windows.System.Profile 命名空间下的类获取信息, 查找指定类或接口的所在程序集的所有子类和子接口
    背水一战 Windows 10 (121) 后台任务: 推送通知
    背水一战 Windows 10 (120) 后台任务: 后台上传任务
    背水一战 Windows 10 (119) 后台任务: 后台下载任务(任务分组,组完成后触发后台任务)
    背水一战 Windows 10 (118) 后台任务: 后台下载任务(任务分组,并行或串行执行,组完成后通知
  • 【推广】 阿里云小站-上云优惠聚集地(新老客户同享)更有每天限时秒杀!
    【推广】 云服务器低至0.95折 1核2G ECS云服务器8.1元/月
    【推广】 阿里云老用户升级四重礼遇享6.5折限时折扣!
  • 原文地址:https://www.cnblogs.com/webabcd/p/9202117.html
走看看 - 开发者的网上家园