posts - 615, comments - 10490, trackbacks - 594, articles - 0
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

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

Posted on 2013-09-12 08:42 webabcd 阅读(...) 评论(...) 编辑 收藏

[源码下载]


重新想象 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
[源码下载]