代码改变世界
[登录 · 注册]
  • 背水一战 Windows 10 (108) 通知(Tile): application tile 基础, secondary tile 基础
  • [源码下载]


    背水一战 Windows 10 (108) - 通知(Tile): application tile 基础, secondary tile 基础



    作者:webabcd


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

    • application tile 基础
    • secondary tile 基础



    示例
    1、本例用于演示 application tile 的基础
    Notification/Tile/ApplicationTileBasic.xaml

    <Page
        x:Class="Windows10.Notification.Tile.ApplicationTileBasic"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="using:Windows10.Notification.Tile"
        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">
    
                <TextBlock Name="lblMsg" Margin="5" />
    
                <Button Name="btnUpdateTile" Content="更新 application tile 的数据" Click="btnUpdateTile_Click" Margin="5" />
    
                <Button Name="btnClearTile" Content="清除 application tile 的数据" Click="btnClearTile_Click" Margin="5" />
    
            </StackPanel>
        </Grid>
    </Page>

    Notification/Tile/ApplicationTileBasic.xaml.cs

    /*
     * 本例用于演示 application tile 的基础
     * 
     * 
     * TileNotification - Tile 通知
     *     Content - Tile 的内容,XmlDocument 类型的数据,只读,其需要在构造函数中指定
     *     ExpirationTime - Tile 通知的过期时间,超过这个时间就会清除这个 Tile
     *     
     * TileUpdateManager - Tile 更新管理器
     *     CreateTileUpdaterForApplication() - 创建一个 application tile 更新器
     *     
     * TileUpdater - 磁贴的 Tile 更新器
     *     Update(TileNotification notification) - 将指定的 TileNotification 对象更新到 application tile
     *     Clear() - 清除 application tile 的数据
     *     EnableNotificationQueue(bool enable) - 是否启用 tile 的队列功能(即 tile 循环显示),队列最多可容纳 5 个 tile
     *     EnableNotificationQueueForSquare150x150(bool enable) - 是否启用中磁贴的 tile 队列功能
     *     EnableNotificationQueueForWide310x150(bool enable) - 是否启用宽磁贴的 tile 队列功能
     *     EnableNotificationQueueForSquare310x310(bool enable) - 是否启用大磁贴的 tile 队列功能
     *     Setting - 获取通知设置(NotificationSetting 枚举)
     *         Enabled - 通知可被显示
     *         DisabledForApplication, DisabledForUser, DisabledByGroupPolicy, DisabledByManifest - 因相应的原因通知被禁止显示
     * 
     * 
     * 注:
     * 1、磁贴规格分为小,中,宽,大,对于 application tile 来说支持哪种规格的磁贴需要在 Package.appxmanifest 中做相应的配置
     * 2、对于 application tile 来说,其左下角是否显示名称可以在 Package.appxmanifest 中配置,可以使其显示指定的短名称,不指定短名称的话则显示的是“显示名称”
     * 3、小规格的磁贴无法在其左下角显示名称,但是可以显示 tile 通知(但是不支持 tile 通知的队列功能)
     * 4、无法为 application tile 设置启动参数,可以为 secondary tile 设置启动参数
     * 
     * 
     * 注:本例是通过 xml 来构造 tile 的,另外也可以通过 NuGet 的 Microsoft.Toolkit.Uwp.Notifications 来构造 tile(其用 c# 对 xml 做了封装)
     */
    
    using System;
    using Windows.Data.Xml.Dom;
    using Windows.UI.Notifications;
    using Windows.UI.Xaml;
    using Windows.UI.Xaml.Controls;
    
    namespace Windows10.Notification.Tile
    {
        public sealed partial class ApplicationTileBasic : Page
        {
            public ApplicationTileBasic()
            {
                this.InitializeComponent();
            }
    
            // 更新 application tile 的数据
            private void btnUpdateTile_Click(object sender, RoutedEventArgs e)
            {
                // 用于描述 tile 通知的 xml 字符串
                string tileXml = $@"
                    <tile>
                        <visual>
                            <binding template='TileSmall'>
                                <text>Small(小){DateTime.Now.ToString("HH:mm:ss")}</text>
                            </binding>
                            <binding template='TileMedium'>
                                <text>Medium(中){DateTime.Now.ToString("HH:mm:ss")}</text>
                            </binding>
                            <binding template='TileWide'>
                                <text>Wide(宽){DateTime.Now.ToString("HH:mm:ss")}</text>
                            </binding>
                            <binding template='TileLarge'>
                                <text>Large(大){DateTime.Now.ToString("HH:mm:ss")}</text>
                            </binding>
                        </visual>
                    </tile>";
    
                // 将 xml 字符串转换为 Windows.Data.Xml.Dom.XmlDocument 对象
                XmlDocument tileDoc = new XmlDocument();
                tileDoc.LoadXml(tileXml);
                // 获取此 tile 的 xml
                // lblMsg.Text = tileDoc.GetXml();
    
                // 实例化 TileNotification 对象
                TileNotification tileNotification = new TileNotification(tileDoc);
                DateTimeOffset expirationTime = DateTimeOffset.UtcNow.AddSeconds(30);
                tileNotification.ExpirationTime = expirationTime; // 30 秒后清除这个 tile
    
                // 将指定的 TileNotification 对象更新到 application tile
                TileUpdater tileUpdater = TileUpdateManager.CreateTileUpdaterForApplication();
                tileUpdater.EnableNotificationQueue(true); // 启用 tile 的队列功能(最多可容纳 5 个 tile)
                tileUpdater.Update(tileNotification);
            }
    
            // 清除 application tile 的数据
            private void btnClearTile_Click(object sender, RoutedEventArgs e)
            {
                TileUpdater tileUpdater = TileUpdateManager.CreateTileUpdaterForApplication();
                tileUpdater.Clear();
            }
        }
    }


    2、本例用于演示 secondary tile 的基础
    Notification/Tile/SecondaryTileBasic.xaml

    <Page
        x:Class="Windows10.Notification.Tile.SecondaryTileBasic"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="using:Windows10.Notification.Tile"
        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">
    
                <TextBlock Name="lblMsg" Margin="5" />
    
                <Button Name="btnPinSecondaryTile" Content="固定一个新的 SecondaryTile(可以固定多个)" Click="btnPinSecondaryTile_Click" Margin="5" />
    
                <Button Name="btnUpdateSecondaryTile" Content="更新所有的 SecondaryTile 通知" Click="btnUpdateSecondaryTile_Click" Margin="5" />
    
                <Button Name="btnUnpinSecondaryTile" Content="取消固定所有的 SecondaryTile" Click="btnUnpinSecondaryTile_Click" Margin="5" />
    
            </StackPanel>
        </Grid>
    </Page>

    Notification/Tile/SecondaryTileBasic.xaml.cs

    /*
     * 本例用于演示 secondary tile 的基础
     * 
     * 
     * SecondaryTile - secondary tile
     *     TileId - secondary tile 的唯一标识
     *     SecondaryTile.Exists(tileId) - 指定 TileId 的 secondary tile 是否存在(静态方法)
     *     SecondaryTile secondaryTile = new SecondaryTile(tileId)
     *         如果指定的 tileId 不存在,则创建 SecondaryTile 对象
     *         如果指定的 tileId 存在,则返回此 SecondaryTile 对象
     *     SecondaryTile secondaryTile = SecondaryTile(string tileId, string displayName, string arguments, Uri square150x150Logo, TileSize desiredSize)
     *         tileId - secondary tile 的唯一标识(指定的 tileId 不存在,则创建 SecondaryTile 对象;指定的 tileId 存在,则返回此 SecondaryTile 对象)
     *         displayName - 磁贴左下角的显示名称(磁贴的 ToolTip 用的也是此值)
     *         arguments - 启动参数
     *         square150x150Logo - 中磁贴图标
     *         desiredSize - 固定到开始屏幕时的期望的初始规格(Square150x150, Wide310x150)
     *     DisplayName - 磁贴左下角的显示名称(磁贴的 ToolTip 用的也是此值)
     *     Arguments - 启动参数(通过磁贴启动 app 时可以获取此参数,只可以在 OnLaunched 中获取,在 OnActivated 之类的中是获取不到的))
     *     VisualElements - 返回一个 SecondaryTileVisualElements 对象,用于设置磁贴的部分显示属性
     *     RequestCreateAsync() - 请求固定此 SecondaryTile(会弹出确认框)
     *     RequestDeleteAsync() - 请求取消固定此 SecondaryTile
     *     UpdateAsync() - 更新此 SecondaryTile(这里不是更新 Tile 通知,而只是更新 SecondaryTile 对象的相关信息)
     *     FindAllAsync() - 获取此 app 固定到开始屏幕的所有 SecondaryTile 集合(静态方法)
     *     
     * SecondaryTileVisualElements - 磁贴的部分显示属性
     *     BackgroundColor - 背景颜色
     *     ForegroundText - 前景色类别(Dark 或 Light)
     *     Square150x150Logo - 中磁贴的图标的地址
     *     Wide310x150Logo - 宽磁贴的图标的地址
     *     Square310x310Logo - 大磁贴的图标的地址
     *     ShowNameOnSquare150x150Logo - 是否在中磁贴的左下角显示名称
     *     ShowNameOnWide310x150Logo - 是否在宽磁贴的左下角显示名称
     *     ShowNameOnSquare310x310Logo - 是否在大磁贴的左下角显示名称
     * 
     * TileNotification - Tile 通知
     *     Content - Tile 的内容,XmlDocument 类型的数据,只读,其需要在构造函数中指定
     *     ExpirationTime - Tile 通知的过期时间,超过这个时间就会清除这个 Tile
     *     
     * TileUpdateManager - Tile 更新管理器
     *     CreateTileUpdaterForSecondaryTile(string tileId) - 为指定的 SecondaryTile 创建一个 Tile 更新器,返回 TileUpdater 类型的数据
     *     
     * TileUpdater - 磁贴的 Tile 更新器
     *     Update(TileNotification notification) - 将指定的 TileNotification 对象更新到指定的 secondary tile
     *     Clear() - 清除 secondary tile 的数据
     *     EnableNotificationQueue(bool enable) - 是否启用 tile 的队列功能(即 tile 循环显示),队列最多可容纳 5 个 tile
     *     EnableNotificationQueueForSquare150x150(bool enable) - 是否启用中磁贴的 tile 队列功能
     *     EnableNotificationQueueForWide310x150(bool enable) - 是否启用宽磁贴的 tile 队列功能
     *     EnableNotificationQueueForSquare310x310(bool enable) - 是否启用大磁贴的 tile 队列功能
     *     Setting - 获取通知设置(NotificationSetting 枚举)
     *         Enabled - 通知可被显示
     *         DisabledForApplication, DisabledForUser, DisabledByGroupPolicy, DisabledByManifest - 因相应的原因通知被禁止显示
     * 
     * 
     * 注:
     * 1、磁贴规格分为小,中,宽,大
     * 2、小规格的磁贴无法在其左下角显示名称,但是可以显示 tile 通知(但是不支持 tile 通知的队列功能)
     * 3、对于 secondary tile 来说,每个磁贴都可以为其设置一个启动参数,此启动参数与磁贴当前显示的是什么通知无关,其只与磁贴有关
     * 4、单击 secondary tile 启动 app 时,可以在 App.xaml.cs 中通过如下方式获取启动参数(本例的相关代码在 /UI/MySplashScreen.xaml.cs 中)
     * protected async override void OnLaunched(LaunchActivatedEventArgs args)
     * {
     *     string arguments = args.Arguments;
     * }
     * 
     * 
     * 注:本例是通过 xml 来构造 tile 的,另外也可以通过 NuGet 的 Microsoft.Toolkit.Uwp.Notifications 来构造 tile(其用 c# 对 xml 做了封装)
     */
    
    using System;
    using System.Collections.Generic;
    using Windows.Data.Xml.Dom;
    using Windows.UI;
    using Windows.UI.Notifications;
    using Windows.UI.StartScreen;
    using Windows.UI.Xaml;
    using Windows.UI.Xaml.Controls;
    
    namespace Windows10.Notification.Tile
    {
        public sealed partial class SecondaryTileBasic : Page
        {
            private Random _random = new Random();
    
            public SecondaryTileBasic()
            {
                this.InitializeComponent();
            }
    
            // 固定一个新的 SecondaryTile(可以固定多个)
            private async void btnPinSecondaryTile_Click(object sender, RoutedEventArgs e)
            {
                Uri square150x150Logo = new Uri("ms-appx:///Assets/Square150x150Logo.png");
                Uri wide310x150Logo = new Uri("ms-appx:///Assets/Wide310x150Logo.png");
                Uri square310x310Logo = new Uri("ms-appx:///Assets/Square310x310Logo.png");
    
                string tileId = _random.Next(100000, 1000000).ToString();
    
                /*
                if (SecondaryTile.Exists(tileId)) // 指定 tileId 的 secondary tile 是否存在
                {
                    SecondaryTile secondaryTile = new SecondaryTile(tileId); // 通过 tileId 获取指定的 SecondaryTile 对象
                }
                */
    
                // 创建一个 SecondaryTile 对象
                SecondaryTile secondaryTile = new SecondaryTile
                (
                    tileId,
                    "DisplayName",
                    $"Arguments(TileId: {tileId}){DateTime.Now.ToString("HH:mm:ss")}", // 不能设置为空,否则会报错
                    square150x150Logo,
                    TileSize.Wide310x150 // 我这里测试,只能设置为 Square150x150 或 Wide310x150
                );
    
                secondaryTile.VisualElements.Wide310x150Logo = wide310x150Logo;
                secondaryTile.VisualElements.Square310x310Logo = square310x310Logo;
    
                secondaryTile.VisualElements.ShowNameOnSquare150x150Logo = true;
                secondaryTile.VisualElements.ShowNameOnWide310x150Logo = true;
                secondaryTile.VisualElements.ShowNameOnSquare310x310Logo = true;
    
                secondaryTile.VisualElements.BackgroundColor = Colors.Orange;
                secondaryTile.VisualElements.ForegroundText = ForegroundText.Light;
    
                try
                {
                    bool isPinned = await secondaryTile.RequestCreateAsync();
                    lblMsg.Text = isPinned ? "固定成功" : "固定失败";
                }
                catch (Exception ex)
                {
                    lblMsg.Text = "固定失败: " + ex.ToString();
                }
            }
    
            // 更新所有的 SecondaryTile 通知
            private async void btnUpdateSecondaryTile_Click(object sender, RoutedEventArgs e)
            {
                IReadOnlyList<SecondaryTile> secondaryTileList = await SecondaryTile.FindAllAsync();
                foreach (var secondaryTile in secondaryTileList)
                {
                    // 用于描述 tile 通知的 xml 字符串
                    string tileXml = $@"
                    <tile>
                        <visual>
                            <binding template='TileSmall'>
                                <text>Small(小){DateTime.Now.ToString("HH:mm:ss")}</text>
                            </binding>
                            <binding template='TileMedium'>
                                <text>Medium(中){DateTime.Now.ToString("HH:mm:ss")}</text>
                            </binding>
                            <binding template='TileWide'>
                                <text>Wide(宽){DateTime.Now.ToString("HH:mm:ss")}</text>
                            </binding>
                            <binding template='TileLarge'>
                                <text>Large(大){DateTime.Now.ToString("HH:mm:ss")}</text>
                            </binding>
                        </visual>
                    </tile>";
    
                    // 将 xml 字符串转换为 Windows.Data.Xml.Dom.XmlDocument 对象
                    XmlDocument tileDoc = new XmlDocument();
                    tileDoc.LoadXml(tileXml);
                    // 获取此 tile 的 xml
                    // lblMsg.Text = tileDoc.GetXml();
    
                    // 实例化 TileNotification 对象
                    TileNotification tileNotification = new TileNotification(tileDoc);
                    DateTimeOffset expirationTime = DateTimeOffset.UtcNow.AddSeconds(30);
                    tileNotification.ExpirationTime = expirationTime; // 30 秒后清除这个 tile
    
                    // 将指定的 TileNotification 对象更新到 secondary tile
                    TileUpdater tileUpdater = TileUpdateManager.CreateTileUpdaterForSecondaryTile(secondaryTile.TileId);
                    tileUpdater.EnableNotificationQueue(true); // 启用 tile 的队列功能(最多可容纳 5 个 tile)
                    tileUpdater.Update(tileNotification);
    
    
                    // 更新此 SecondaryTile 对象的相关信息
                    secondaryTile.Arguments = $"Arguments(TileId: {secondaryTile.TileId}){DateTime.Now.ToString("HH:mm:ss")}";            
                    bool success = await secondaryTile.UpdateAsync();
                }
            }
    
            // 取消固定所有的 SecondaryTile
            private async void btnUnpinSecondaryTile_Click(object sender, RoutedEventArgs e)
            {
                IReadOnlyList<SecondaryTile> secondaryTileList = await SecondaryTile.FindAllAsync();
                foreach (SecondaryTile secondaryTile in secondaryTileList)
                {
                    try
                    {
                        bool isUnpinned = await secondaryTile.RequestDeleteAsync();
                        lblMsg.Text = isUnpinned ? "取消固定成功" : "取消固定失败";
                    }
                    catch (Exception ex)
                    {
                        lblMsg.Text = "取消固定失败: " + ex.ToString();
                    }
                }
            }
        }
    }



    OK
    [源码下载]

  • 上一篇:背水一战 Windows 10 (109) 通知(Tile): 按计划显示 tile 通知, 轮询服务端以更新 tile 通知
    下一篇:背水一战 Windows 10 (107) 通知(Toast): 提示音, 特定场景
  • 【推广】 阿里云小站-上云优惠聚集地(新老客户同享)更有每天限时秒杀!
    【推广】 云服务器低至0.95折 1核2G ECS云服务器8.1元/月
    【推广】 阿里云老用户升级四重礼遇享6.5折限时折扣!
  • 原文:https://www.cnblogs.com/webabcd/p/9206960.html
走看看 - 开发者的网上家园