介紹
重新想象 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
[源碼下載]:http://files.cnblogs.com/webabcd/Windows8.rar