重新想象 Windows 8 Store Apps (59) - 锁屏

简介: 原文:重新想象 Windows 8 Store Apps (59) - 锁屏[源码下载] 重新想象 Windows 8 Store Apps (59) - 锁屏 作者:webabcd介绍重新想象 Windows 8 Store Apps 之 锁屏 登录锁屏,获取当前程序的锁屏权限,从锁屏中...
原文: 重新想象 Windows 8 Store Apps (59) - 锁屏

[源码下载]


重新想象 Windows 8 Store Apps (59) - 锁屏



作者:webabcd


介绍
重新想象 Windows 8 Store Apps 之 锁屏

  • 登录锁屏,获取当前程序的锁屏权限,从锁屏中移除
  • 发送徽章或文本到锁屏
  • 将一个 app 的多个 tile 绑定到锁屏
  • 自定义锁屏图片



示例
1、演示如何登录锁屏,获取当前程序的锁屏权限,从锁屏中移除
LockScreen/AccessLockScreen.xaml

<Page
    x:Class="XamlDemo.LockScreen.AccessLockScreen"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:XamlDemo.LockScreen"
    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">
            
            <TextBlock Name="lblMsg" FontSize="14.667" />

            <Button Name="btnRequestAccess" Content="请求登录锁屏" Margin="0 10 0 0" Click="btnRequestAccess_Click" />

            <Button Name="btnGetAccessStatus" Content="获取当前程序的锁屏权限" Margin="0 10 0 0" Click="btnGetAccessStatus_Click" />

            <Button Name="btnRemoveAccess" Content="从锁屏中移除" Margin="0 10 0 0" Click="btnRemoveAccess_Click" />

        </StackPanel>
    </Grid>
</Page>

LockScreen/AccessLockScreen.xaml.cs

/*
 * 演示如何登录锁屏,获取当前程序的锁屏权限,从锁屏中移除
 * 
 * 注:
 * 要想请求锁屏权限,需要后台任务支持“推送通知”或“控制通道”
 */

using System;
using Windows.ApplicationModel.Background;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;

namespace XamlDemo.LockScreen
{
    public sealed partial class AccessLockScreen : Page
    {
        public AccessLockScreen()
        {
            this.InitializeComponent();
        }

        private async void btnRequestAccess_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                // 向系统请求登录锁屏,会弹出确认对话框
                //     需要后台任务支持“推送通知”或“控制通道”,否则会抛出异常
                //     不能在模拟器中运行
                //     如果 BackgroundAccessStatus 不等于 Unspecified,则即使调用 RequestAccessAsync() 也不会出现对话框,需要用户去“设置”中去添加或移除锁屏应用
                BackgroundAccessStatus status = await BackgroundExecutionManager.RequestAccessAsync();

                /*
                 * BackgroundAccessStatus - 当前 app 的锁屏权限
                 *     Unspecified - 用户尚未选择
                 *     Denied - 被用户拒绝
                 *     AllowedWithAlwaysOnRealTimeConnectivity - 用于允许了,且支持实时连接,即使电量低
                 *     AllowedMayUseActiveRealTimeConnectivity - 用于允许了,且支持实时连接,但是如果电量低则无法实时连接
                 */

                lblMsg.Text = "RequestAccessAsync(): " + status.ToString();
            }
            catch (Exception ex)
            {
                lblMsg.Text = ex.ToString();
            }
        }

        private void btnGetAccessStatus_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                // 获取当前应用程序的锁屏权限
                BackgroundAccessStatus status = BackgroundExecutionManager.GetAccessStatus();
                lblMsg.Text = "GetAccessStatus(): " + status.ToString();
            }
            catch (Exception ex)
            {
                lblMsg.Text = ex.ToString();
            }
        }

        private void btnRemoveAccess_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                // 将当前应用程序从锁屏中移除
                BackgroundExecutionManager.RemoveAccess();
                lblMsg.Text = "RemoveAccess()";
            }
            catch (Exception ex)
            {
                lblMsg.Text = ex.ToString();
            }
        }
    }
}


2、演示如何发送徽章或文本到锁屏
LockScreen/SendNotification.xaml

<Page
    x:Class="XamlDemo.LockScreen.SendNotification"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:XamlDemo.LockScreen"
    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">

            <Button Name="btnSendBadge" Content="send badage to lock screen" Click="btnSendBadge_Click" />

            <Button Name="btnSendTile" Content="send tile text to lock screen" Margin="0 10 0 0" Click="btnSendTile_Click" />

        </StackPanel>
    </Grid>
</Page>

LockScreen/SendNotification.xaml.cs

/*
 * 演示如何发送徽章或文本到锁屏
 * 
 * 注:
 * 如果需要发送文本到锁屏,需要手动在“设置”中将 app 添加到“选择要显示详细状态的应用”中
 * 
 * 另:
 * 关于 tile 和 badge 请参见:XamlDemo/Tile
 */

using NotificationsExtensions.BadgeContent;
using NotificationsExtensions.TileContent;
using Windows.UI.Notifications;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;

namespace XamlDemo.LockScreen
{
    public sealed partial class SendNotification : Page
    {
        public SendNotification()
        {
            this.InitializeComponent();
        }

        private void btnSendBadge_Click(object sender, RoutedEventArgs e)
        {
            // 发送 badge 到锁屏
            BadgeNumericNotificationContent badgeContent = new BadgeNumericNotificationContent(3);
            BadgeNotification badge = badgeContent.CreateNotification();
            BadgeUpdater badgeUpdater = BadgeUpdateManager.CreateBadgeUpdaterForApplication();
            badgeUpdater.Update(badge);
        }

        private void btnSendTile_Click(object sender, RoutedEventArgs e)
        {
            // 发送文本到锁屏,前提是此 app 在“选择要显示详细状态的应用”中
            ITileWideSmallImageAndText03 tileContent = TileContentFactory.CreateTileWideSmallImageAndText03();
            tileContent.TextBodyWrap.Text = "hello webabcd";
            tileContent.Image.Src = "ms-appx:///Assets/Logo.png";
            tileContent.RequireSquareContent = false;
            TileUpdateManager.CreateTileUpdaterForApplication().Update(tileContent.CreateNotification());
        }
    }
}


3、演示如何将一个 app 的多个 tile 绑定到锁屏
LockScreen/MultipleTiles.xaml

<Page
    x:Class="XamlDemo.LockScreen.MultipleTiles"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:XamlDemo.LockScreen"
    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">

            <Button Name="btnOnlyBadge" Content="只能发送 badge 的可以绑定到锁屏的 SecondaryTile" Click="btnOnlyBadge_Click" />

            <Button Name="btnBadgeAndText" Content="既能发送 badge 又能发送 text 的可以绑定到锁屏的 SecondaryTile" Margin="0 10 0 0" Click="btnBadgeAndText_Click" />

        </StackPanel>
    </Grid>
</Page>

LockScreen/MultipleTiles.xaml.cs

/*
 * 演示如何将一个 app 的多个 tile 绑定到锁屏
 * 
 * 要想将 SecondaryTile 绑定到锁屏,需要注意:
 * 1、需要设置 SecondaryTile 的 LockScreenBadgeLogo
 * 2、如果需要文本支持则还需要设置 SecondaryTile 的 LockScreenDisplayBadgeAndTileText 为 true
 * 3、需要手动在“设置”中将 SecondaryTile 添加到锁屏,当然如果需要文本支持则需要手动将 app 添加到“选择要显示详细状态的应用”中
 */

using NotificationsExtensions.BadgeContent;
using NotificationsExtensions.TileContent;
using System;
using Windows.UI.Notifications;
using Windows.UI.Popups;
using Windows.UI.StartScreen;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using XamlDemo.Common;

namespace XamlDemo.LockScreen
{
    public sealed partial class MultipleTiles : Page
    {
        private string _tile1Id = "123";
        private string _tile2Id = "456";

        public MultipleTiles()
        {
            this.InitializeComponent();
        }

        // 仅支持 badge 的可以登录锁屏的 SecondaryTile
        private async void btnOnlyBadge_Click(object sender, RoutedEventArgs e)
        {
            SecondaryTile secondTile = new SecondaryTile(
                _tile1Id,
                "testOnlyBadge",
                "testOnlyBadge",
                "argument1",
                TileOptions.ShowNameOnLogo,
                new Uri("ms-appx:///Assets/Logo.png")
            );

            // 需要指定 LockScreenBadgeLogo
            secondTile.LockScreenBadgeLogo = new Uri("ms-appx:///Assets/BadgeLogo.png");

            bool isPinned = await secondTile.RequestCreateForSelectionAsync(Helper.GetElementRect((FrameworkElement)sender), Placement.Above);
            if (isPinned)
            {
                BadgeNumericNotificationContent badgeContent = new BadgeNumericNotificationContent(2);
                BadgeUpdateManager.CreateBadgeUpdaterForSecondaryTile(_tile1Id).Update(badgeContent.CreateNotification());
            }
        }

        // 即支持徽章又支持文本的可以登录锁屏的 SecondaryTile
        private async void btnBadgeAndText_Click(object sender, RoutedEventArgs e)
        {
            SecondaryTile secondTile = new SecondaryTile(
                _tile2Id,
                "testBadgeAndText",
                "testBadgeAndText",
                "argument2",
                TileOptions.ShowNameOnLogo | TileOptions.ShowNameOnWideLogo,
                new Uri("ms-appx:///Assets/Logo.png"),
                new Uri("ms-appx:///Assets/WideLogo.png")
            );

            // 需要指定 LockScreenBadgeLogo
            secondTile.LockScreenBadgeLogo = new Uri("ms-appx:///Assets/BadgeLogo.png");
            // 需要设置 LockScreenDisplayBadgeAndTileText 为 true
            secondTile.LockScreenDisplayBadgeAndTileText = true;

            bool isPinned = await secondTile.RequestCreateForSelectionAsync(Helper.GetElementRect((FrameworkElement)sender), Placement.Above);
            if (isPinned)
            {
                ITileWideText03 tileContent = TileContentFactory.CreateTileWideText03();
                tileContent.TextHeadingWrap.Text = "hello webabcd";
                tileContent.RequireSquareContent = false;
                TileUpdateManager.CreateTileUpdaterForSecondaryTile(_tile2Id).Update(tileContent.CreateNotification());
            }
        }
    }
}


4、演示如何自定义锁屏图片
LockScreen/CustomLockScreenImage.xaml

<Page
    x:Class="XamlDemo.LockScreen.CustomLockScreenImage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:XamlDemo.LockScreen"
    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">

            <Button Name="btnDemo" Content="自定义锁屏图片" Click="btnDemo_Click" />
            
            <Image Name="img" Width="200" Height="200" Margin="0 10 0 0" HorizontalAlignment="Left" />
            
        </StackPanel>
    </Grid>
</Page>

LockScreen/CustomLockScreenImage.xaml.cs

/*
 * 演示如何自定义锁屏图片
 */

using System;
using Windows.Storage;
using Windows.Storage.Pickers;
using Windows.Storage.Streams;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Media.Imaging;
using XamlDemo.Common;

namespace XamlDemo.LockScreen
{
    public sealed partial class CustomLockScreenImage : Page
    {
        public CustomLockScreenImage()
        {
            this.InitializeComponent();
        }

        private async void btnDemo_Click(object sender, RoutedEventArgs e)
        {
            if (Helper.EnsureUnsnapped())
            {
                FileOpenPicker imagePicker = new FileOpenPicker
                {
                    ViewMode = PickerViewMode.Thumbnail,
                    SuggestedStartLocation = PickerLocationId.PicturesLibrary,
                    FileTypeFilter = { ".jpg", ".jpeg", ".png", ".bmp" }
                };

                StorageFile imageFile = await imagePicker.PickSingleFileAsync();
                if (imageFile != null)
                {
                    // 将指定的图片设置为锁屏图片
                    await Windows.System.UserProfile.LockScreen.SetImageFileAsync(imageFile);

                    // 获取当前的锁屏图片
                    IRandomAccessStream imageStream = Windows.System.UserProfile.LockScreen.GetImageStream();
                    if (imageStream != null)
                    {
                        BitmapImage lockScreenImage = new BitmapImage();
                        lockScreenImage.SetSource(imageStream);
                        img.Source = lockScreenImage;
                    }
                }
            }
        }
    }
}



OK
[源码下载]

目录
相关文章
|
4月前
|
Linux C++ Windows
【Azure 应用服务】Azure App Service(Windows)环境中如何让.NET应用调用SAP NetWeaver RFC函数
【Azure 应用服务】Azure App Service(Windows)环境中如何让.NET应用调用SAP NetWeaver RFC函数
【Azure 应用服务】Azure App Service(Windows)环境中如何让.NET应用调用SAP NetWeaver RFC函数
|
1月前
|
C# Windows
【Azure App Service】在App Service for Windows上验证能占用的内存最大值
根据以上测验,当使用App Service内存没有达到预期的值,且应用异常日志出现OutOfMemory时,就需要检查Platform的设置是否位64bit。
44 11
|
4月前
|
Java 应用服务中间件 开发工具
[App Service for Windows]通过 KUDU 查看 Tomcat 配置信息
[App Service for Windows]通过 KUDU 查看 Tomcat 配置信息
|
4月前
|
Java 应用服务中间件 Windows
【App Service for Windows】为 App Service 配置自定义 Tomcat 环境
【App Service for Windows】为 App Service 配置自定义 Tomcat 环境
|
4月前
|
PHP Windows
【Azure App Service for Windows】 PHP应用出现500 : The page cannot be displayed because an internal server error has occurred. 错误
【Azure App Service for Windows】 PHP应用出现500 : The page cannot be displayed because an internal server error has occurred. 错误
|
4月前
|
PHP 开发工具 git
【Azure 应用服务】在 App Service for Windows 中自定义 PHP 版本的方法
【Azure 应用服务】在 App Service for Windows 中自定义 PHP 版本的方法
|
4月前
|
网络安全 API 数据安全/隐私保护
【Azure App Service】.NET代码实验App Service应用中获取TLS/SSL 证书 (App Service Windows)
【Azure App Service】.NET代码实验App Service应用中获取TLS/SSL 证书 (App Service Windows)
|
4月前
|
Shell PHP Windows
【Azure App Service】Web Job 报错 UNC paths are not supported. Defaulting to Windows directory.
【Azure App Service】Web Job 报错 UNC paths are not supported. Defaulting to Windows directory.
|
4月前
|
存储 Linux Windows
【应用服务 App Service】App Service For Windows 如何挂载Storage Account File Share 示例
【应用服务 App Service】App Service For Windows 如何挂载Storage Account File Share 示例
|
4月前
|
应用服务中间件 nginx Windows
【Azure 应用服务】在App Service for Windows中实现反向代理
【Azure 应用服务】在App Service for Windows中实现反向代理