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

[源碼下載]


html

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



做者:webabcd


介紹
背水一戰 Windows 10 之 通知(Tile)html5

  • application tile 基礎
  • secondary tile 基礎



示例
一、本例用於演示 application tile 的基礎
Notification/Tile/ApplicationTileBasic.xamlc++

<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.csweb

/*
 * 本例用於演示 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 - 因相應的緣由通知被禁止顯示
 * 
 * 
 * 注:
 * 一、磁貼規格分爲小,中,寬,大,對於 application tile 來講支持哪一種規格的磁貼須要在 Package.appxmanifest 中作相應的配置
 * 二、對於 application tile 來講,其左下角是否顯示名稱能夠在 Package.appxmanifest 中配置,可使其顯示指定的短名稱,不指定短名稱的話則顯示的是「顯示名稱」
 * 三、小規格的磁貼沒法在其左下角顯示名稱,可是能夠顯示 tile 通知(可是不支持 tile 通知的隊列功能)
 * 四、沒法爲 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();
        }
    }
}


二、本例用於演示 secondary tile 的基礎
Notification/Tile/SecondaryTileBasic.xamlexpress

<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.csc#

/*
 * 本例用於演示 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 - 因相應的緣由通知被禁止顯示
 * 
 * 
 * 注:
 * 一、磁貼規格分爲小,中,寬,大
 * 二、小規格的磁貼沒法在其左下角顯示名稱,可是能夠顯示 tile 通知(可是不支持 tile 通知的隊列功能)
 * 三、對於 secondary tile 來講,每一個磁貼均可覺得其設置一個啓動參數,此啓動參數與磁貼當前顯示的是什麼通知無關,其只與磁貼有關
 * 四、單擊 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

相關文章
相關標籤/搜索