您的位置:首页 > 其它

与众不同 windows phone (47) - 8.0 其它: 锁屏信息和锁屏背景, 电池状态, 多分辨率, 商店, 内置协议, 快速恢复

2014-01-16 08:29 477 查看
[源码下载]

[align=center]与众不同 windows phone (47) - 8.0 其它: 锁屏信息和锁屏背景, 电池状态, 多分辨率, 商店, 内置协议, 快速恢复[/align]

作者:webabcd

介绍
与众不同 windows phone 8.0 之 其它

锁屏信息和锁屏背景

电池状态

多分辨率应用

与 Windows Phone 商店相关的操作

系统的内置协议

快速恢复应用

App.xaml.cs 的说明

manifest 的说明

示例
1、演示如何发送信息到锁屏,以及如何修改锁屏背景
Others/LockScreen.xaml

<phone:PhoneApplicationPage
x:Class="Demo.Others.LockScreen"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
FontFamily="{StaticResource PhoneFontFamilyNormal}"
FontSize="{StaticResource PhoneFontSizeNormal}"
Foreground="{StaticResource PhoneForegroundBrush}"
SupportedOrientations="Portrait" Orientation="Portrait"
mc:Ignorable="d"
shell:SystemTray.IsVisible="True">

<Grid x:Name="LayoutRoot" Background="Transparent">
<StackPanel>

<TextBlock Name="lblMsg" TextWrapping="Wrap" />

<Button Name="btnGotoLockScreen" Content="跳转到锁屏设置界面" Click="btnGotoLockScreen_Click" />

<Button Name="btnSendMessageToLockScreen" Content="发送信息到锁屏" Click="btnSendMessageToLockScreen_Click" />

<Button Name="btnLockScreenBackground" Content="修改锁屏背景" Click="btnLockScreenBackground_Click" />

</StackPanel>
</Grid>

</phone:PhoneApplicationPage>


Others/LockScreen.xaml.cs

/*
* 演示如何发送信息到锁屏,以及如何修改锁屏背景
*
*
* 注:在 manifest 中需要增加的内容和说明如下
* 1、搜索并修改“<DeviceLockImageURI />”节点的内容如下:
* <!--锁屏图标:38 * 38 像素,仅支持白色和透明-->
* <DeviceLockImageURI IsRelative="true" IsResource="false">Assets\LockScreen.png</DeviceLockImageURI>
*
* 2、在 <Extensions /> 节点中增加内容如下:
* <!--支持锁屏上显示图标和数字-->
* <Extension TaskID="_default" ExtensionName="LockScreen_Notification_IconCount" ConsumerID="{111DFF24-AA15-4A96-8006-2BFF8122084F}" />
* <!--支持锁屏上显示文本-->
* <Extension TaskID="_default" ExtensionName="LockScreen_Notification_TextField" ConsumerID="{111DFF24-AA15-4A96-8006-2BFF8122084F}" />
* <!--支持锁屏背景的修改-->
* <Extension TaskID="_default" ExtensionName="LockScreen_Background" ConsumerID="{111DFF24-AA15-4A96-8006-2BFF8122084F}" />
*/

using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows;
using System.Windows.Navigation;
using Microsoft.Phone.Controls;
using Microsoft.Phone.Shell;
using Windows.System;
using Windows.Phone.System.UserProfile;

namespace Demo.Others
{
public partial class LockScreen : PhoneApplicationPage
{
public LockScreen()
{
InitializeComponent();
}

protected override void OnNavigatedTo(NavigationEventArgs e)
{
// 在锁屏设置界面,如果将本 app 设置为背景提供程序,则锁屏界面上会有一个名为“打开应用”的按钮,点击后会通过 /MainPage.xaml?WallpaperSettings=1 启动本 app
// 相关的 UriMapper 参见 MyUriMapper.cs

IDictionary<string, string> queryStrings = this.NavigationContext.QueryString;
if (queryStrings.ContainsKey("WallpaperSettings"))
lblMsg.Text = "在锁屏界面启动了本 app,启动的 url 是:" + e.Uri.ToString();

base.OnNavigatedTo(e);
}

// 跳转到锁屏设置界面
private async void btnGotoLockScreen_Click(object sender, RoutedEventArgs e)
{
bool success = await Launcher.LaunchUriAsync(new Uri("ms-settings-lock:"));
}

// 发送信息到锁屏
private void btnSendMessageToLockScreen_Click(object sender, RoutedEventArgs e)
{
// 锁屏信息来自 tile(StandardTileData, FlipTile, IconicTile, CycleTile 均可)
ShellTile shellTile = ShellTile.ActiveTiles.First();
if (shellTile != null)
{
StandardTileData tile = new StandardTileData();
tile.BackContent = "发送信息到锁屏"; // 需要在锁屏上显示的文本内容(需要在锁屏界面设置本 app 为显示详细状态)
tile.Count = 10; // 需要在锁屏上显示的数字内容,图标来自 <DeviceLockImageURI /> 节点的设置(需要在锁屏界面设置本 app 为显示即时状态)

shellTile.Update(tile);
}
}

// 修改锁屏背景
private async void btnLockScreenBackground_Click(object sender, RoutedEventArgs e)
{
try
{
/*
* 注:
* 在项目根目录下增加 DefaultLockScreen.jpg 文件,用于当 app 成为锁屏背景的实际提供程序却没有设置锁屏背景时,作为锁屏背景的默认图片
* 比如用户在锁屏设置页面选择了本 app 作为锁屏背景的实际提供程序,此时本 app 无法设置锁屏背景,那么锁屏背景图就会被设置为项目根目录下的 DefaultLockScreen.jpg 文件
*/

// 判断本 app 是否是锁屏背景的实际提供程序
bool isProvider = LockScreenManager.IsProvidedByCurrentApplication;
if (!isProvider)
{
// 请求成为锁屏背景的实际提供程序(会弹出一个对话框)
LockScreenRequestResult result = await LockScreenManager.RequestAccessAsync();

// LockScreenRequestResult.Granted - 用户已允许;LockScreenRequestResult.Denied - 用户已拒绝
isProvider = result == LockScreenRequestResult.Granted;
}

if (isProvider)
{
// 图片地址支持“ms-appx:///”和“ms-appdata:///Local/”,文件名必须与当前锁屏背景的文件名不同
Uri uri = new Uri("ms-appx:///Assets/AppTile.png", UriKind.Absolute);

// 设置当前锁屏的背景图
Windows.Phone.System.UserProfile.LockScreen.SetImageUri(uri);

// 获取当前锁屏的背景图的 uri
Uri currentUri = Windows.Phone.System.UserProfile.LockScreen.GetImageUri();
lblMsg.Text = "当前锁屏的背景图的 url: " + currentUri.ToString();
}
else
{
lblMsg.Text = "用户不允许此 app 成为锁屏背景的实际提供程序";
}
}
catch (Exception ex)
{
lblMsg.Text = ex.ToString();
}
}
}
}


2、演示如何获取电池的状态信息
Others/BatteryDemo.xaml.cs

/*
* 演示如何获取电池的状态信息
*/

using System;
using System.Windows.Navigation;
using Microsoft.Phone.Controls;
using Windows.Phone.Devices.Power;
using Microsoft.Phone.Info;

namespace Demo.Others
{
public partial class BatteryDemo : PhoneApplicationPage
{
private Battery _battery;

public BatteryDemo()
{
InitializeComponent();
}

protected override void OnNavigatedTo(NavigationEventArgs e)
{
// 获取电话的默认 Battery 对象
_battery = Battery.GetDefault();

// 获取电池在完全用完之前的所剩时间
TimeSpan remainingTime = _battery.RemainingDischargeTime;

// 获取剩余电量的百分比
int remainingChargePercent = _battery.RemainingChargePercent;

// 判断当前是电池供电还是外部电源供电
lblMsg.Text = "PowerSource: " + DeviceStatus.PowerSource.ToString();
lblMsg.Text += Environment.NewLine;
lblMsg.Text += "剩余时间:" + string.Format("{0}{1}{2}{3}{4}{5}", remainingTime.Days, "天", remainingTime.Hours, "小时", remainingTime.Minutes, "分");
lblMsg.Text += Environment.NewLine;
lblMsg.Text += "电量百分比:" + remainingChargePercent.ToString() + "%";

// 剩余电量的百分比发生变化时所触发的事件
_battery.RemainingChargePercentChanged += _battery_RemainingChargePercentChanged;

base.OnNavigatedTo(e);
}

protected override void OnNavigatingFrom(NavigatingCancelEventArgs e)
{
_battery.RemainingChargePercentChanged -= _battery_RemainingChargePercentChanged;

base.OnNavigatingFrom(e);
}

void _battery_RemainingChargePercentChanged(object sender, object e)
{
// 剩余电量的百分比发生了变化
}
}
}


3、演示如何获取当前分辨率
Others/MultiResolution.xaml

<phone:PhoneApplicationPage
x:Class="Demo.Others.MultiResolution"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
FontFamily="{StaticResource PhoneFontFamilyNormal}"
FontSize="{StaticResource PhoneFontSizeNormal}"
Foreground="{StaticResource PhoneForegroundBrush}"
SupportedOrientations="Portrait" Orientation="Portrait"
mc:Ignorable="d"
shell:SystemTray.IsVisible="True">

<Grid x:Name="LayoutRoot" Background="Transparent">
<StackPanel>

<TextBlock TextWrapping="Wrap">
<Run>1、WVGA - 480 x 800; WXGA - 768 x 1280; 720p - 720 x 1280</Run>
<LineBreak />
<Run>2、大多数情况下,建议使用 WXGA 资产,他们会在其他分辨率下自动缩放且显示良好</Run>
<LineBreak />
<Run>3、如果需要不同分辨率使用不同资产,则必须写代码,参见 code-behind 中判断当前分辨率的代码</Run>
<LineBreak />
<Run>4、适应不同分辨率的启动屏幕,需要在项目的根目录下放置三个启动屏幕文件:SplashScreenImage.Screen-WVGA.jpg, SplashScreenImage.Screen-WXGA.jpg, plashScreenImage.Screen-720p.jpg</Run>
<LineBreak />
<Run>5、如果只想用一个启动屏幕文件的话,则在项目的根目录下放置一个分辨率为 768 x 1280 的名为 SplashScreenImage.jpg 的文件即可(不同分辨率会自动缩放)</Run>
</TextBlock>

<TextBlock Name="lblMsg" TextWrapping="Wrap" Margin="0 10 0 0" />

</StackPanel>
</Grid>

</phone:PhoneApplicationPage>


Others/MultiResolution.xaml.cs

/*
* 演示如何获取当前分辨率
*/

using System.Windows.Navigation;
using Microsoft.Phone.Controls;

namespace Demo.Others
{
public partial class MultiResolution : PhoneApplicationPage
{
public MultiResolution()
{
InitializeComponent();
}

protected override void OnNavigatedTo(NavigationEventArgs e)
{
// 获取当前的分辨率
lblMsg.Text = "Resolution: " + ResolutionHelper.CurrentResolution.ToString();

base.OnNavigatedTo(e);
}
}

public enum Resolution { WVGA, WXGA, HD720p, Unknown };

public static class ResolutionHelper
{
/// <summary>
/// 480 x 800
/// </summary>
private static bool IsWvga
{
get
{
return App.Current.Host.Content.ScaleFactor == 100;
}
}

/// <summary>
/// 768 x 1280
/// </summary>
private static bool IsWxga
{
get
{
return App.Current.Host.Content.ScaleFactor == 160;
}
}

/// <summary>
/// 720 x 1280
/// </summary>
private static bool Is720p
{
get
{
return App.Current.Host.Content.ScaleFactor == 150;
}
}

public static Resolution CurrentResolution
{
get
{
if (IsWvga)
return Resolution.WVGA;
else if (IsWxga)
return Resolution.WXGA;
else if (Is720p)
return Resolution.HD720p;
else
return Resolution.Unknown;
}
}
}
}


4、演示与 Windows Phone 商店相关的操作
Others/StoreDemo.xaml.cs

/*
* 演示与 Windows Phone 商店相关的操作
*
* 注:
* 应用内购买测试请参考:http://msdn.microsoft.com/zh-cn/library/windowsphone/develop/jj681689
*/

using Microsoft.Phone.Controls;
using Windows.ApplicationModel.Store;

namespace Demo.Others
{
public partial class StoreDemo : PhoneApplicationPage
{
public StoreDemo()
{
InitializeComponent();

CurrentAppDemo();

LicenseInformationDemo();
}

private void CurrentAppDemo()
{
// 由 Windows 商店创建的此 app 的 id
// CurrentApp.AppId;

// 获取此 app 在 Windows 商店中的 URI 地址
// CurrentApp.LinkUri;

// 获取当前 app 的 LicenseInformation 对象
// CurrentApp.LicenseInformation;

// 请求应用程序内购买完整许可证(wp 目前不可用)
// CurrentApp.RequestAppPurchaseAsync();

// 请求应用程序内购买指定产品的许可证
// CurrentApp.RequestProductPurchaseAsync

// 获取此 app 的全部购买记录(wp 目前不可用)
// CurrentApp.GetAppReceiptAsync();

// 获取此 app 的指定产品的购买记录
// CurrentApp.GetProductReceiptAsync();

// 获取此 app 的 ListingInformation 信息
// CurrentApp.LoadListingInformationAsync();

// 获取此 app 的指定关键字的 ListingInformation 信息
// CurrentApp.LoadListingInformationByKeywordsAsync();

// 获取此 app 的指定产品 Id 的 ListingInformation 信息
// CurrentApp.LoadListingInformationByProductIdsAsync();

// 通知商城本 app 已将指定产品 Id 的产品交付给了用户,在调用此方法之前,用户不能再次购买此产品
// CurrentApp.ReportProductFulfillment();

// ListingInformation - 此 app 在 Windows 商店中的相关信息
//     AgeRating - app 的年龄分级
//     CurrentMarket - app 的当前商店,如:en-us
//     Name - app 在当前商店中的名称
//     FormattedPrice - app 在当前商店中的价格
//     Description - app 在当前商店中的程序说明
//     ProductListings - app 在当前商店中的 ProductListing 集合

// ProductListing - app 的产品信息
//     ProductId - 产品 ID
//     Name - 产品名称
//     FormattedPrice - 产品当前市场的格式化后的价格
//     ImageUri - 产品关联的图片的 uri
//     Description - 产品说明
//     Keywords - 搜索关键字
//     ProductType - 产品类型
//         Unknown - 未知
//         Durable - 耐用型:用户购买后由用户永远所有的产品)
//         Consumable - 消费型:可以购买、使用(消耗)和再度购买的产品
//     Tag - 自定义标记字符串
}

private void LicenseInformationDemo()
{
// 当前 app 的许可证信息
LicenseInformation licenseInformation = CurrentApp.LicenseInformation;

// 许可证ok则为true,否则无许可证或许可证过期则为false
// licenseInformation.IsActive;

// 是否是试用许可证
// licenseInformation.IsTrial;

// 许可证的到期时间
// licenseInformation.ExpirationDate;

// 许可证状态发生变化时所触发的事件
// licenseInformation.LicenseChanged;

// 获取此 app 相关的 ProductLicenses 集合
// licenseInformation.ProductLicenses;

// ProductLicense - 产品许可证
//     ProductId - 产品 ID
//     IsActive - 此产品许可证ok则为true,否则无此产品许可证或此产品许可证过期则为false
//     IsConsumable - 产品类型是否是消费型
//     ExpirationDate - 此产品许可证的到期时间
}
}
}


5、演示系统的内置协议(uri 关联)
Others/ReservedProtocol.xaml.cs

/*
* 演示系统的内置协议(uri 关联)
*
*
* 注:系统保留的文件类型和保留的协议类型详见如下链接
* http://msdn.microsoft.com/zh-cn/library/windowsphone/develop/jj207065 */

using System;
using System.Windows;
using Microsoft.Phone.Controls;
using Windows.System;

namespace Demo.Others
{
public partial class ReservedProtocol : PhoneApplicationPage
{
public ReservedProtocol()
{
InitializeComponent();
}

private async void btnAirplane_Click(object sender, RoutedEventArgs e)
{
// 跳转到“飞行模式设置”页
bool success = await Launcher.LaunchUriAsync(new Uri("ms-settings-airplanemode:"));
}

private async void btnBluetooth_Click(object sender, RoutedEventArgs e)
{
// 跳转到“蓝牙设置”页
bool success = await Launcher.LaunchUriAsync(new Uri("ms-settings-bluetooth:"));
}

private async void btnCellular_Click(object sender, RoutedEventArgs e)
{
// 跳转到“手机网络设置”页
bool success = await Launcher.LaunchUriAsync(new Uri("ms-settings-cellular:"));
}

private async void btnWiFi_Click(object sender, RoutedEventArgs e)
{
// 跳转到“WiFi设置”页
bool success = await Launcher.LaunchUriAsync(new Uri("ms-settings-wifi:"));
}

private async void btnLocation_Click(object sender, RoutedEventArgs e)
{
// 跳转到“定位设置”页
bool success = await Launcher.LaunchUriAsync(new Uri("ms-settings-location:"));
}

private async void btnEmailAccount_Click(object sender, RoutedEventArgs e)
{
// 跳转到“电子邮件+账户设置”页
bool success = await Launcher.LaunchUriAsync(new Uri("ms-settings-emailandaccounts:"));
}

private async void btnLockScreen_Click(object sender, RoutedEventArgs e)
{
// 跳转到“锁屏设置”页
bool success = await Launcher.LaunchUriAsync(new Uri("ms-settings-lock:"));
}

private async void btnCallTo_Click(object sender, RoutedEventArgs e)
{
// 拨打指定的电话号码
bool success = await Launcher.LaunchUriAsync(new Uri("tel:1391234567"));
// bool success = await Launcher.LaunchUriAsync(new Uri("callto:1391234567"));
}

private async void btnHttp_Click(object sender, RoutedEventArgs e)
{
// 用浏览器打开一个指定的 http 链接
bool success = await Launcher.LaunchUriAsync(new Uri("http://webabcd.cnblogs.com/"));
}

private async void btnMailTo_Click(object sender, RoutedEventArgs e)
{
// 向指定的地址发送邮件
bool success = await Launcher.LaunchUriAsync(new Uri("mailto:aaa@xxx.com"));
}

private async void btnMarketplaceDetail_Click(object sender, RoutedEventArgs e)
{
// 打开指定 app 在商店中的详细页
bool success = await Launcher.LaunchUriAsync(new Uri("zune:navigate?appid=02adaaff-ad55-42b4-9ca1-fd4d1dadd32a"));
}

private async void btnMarketplaceReview_Click(object sender, RoutedEventArgs e)
{
// 在商店中评论指定的 app
bool success = await Launcher.LaunchUriAsync(new Uri("zune:reviewapp?appid=02adaaff-ad55-42b4-9ca1-fd4d1dadd32a"));
}

private async void btnMarketplaceSearch_Click(object sender, RoutedEventArgs e)
{
// 在商店中搜索 app(支持按关键字和发行商搜索)
bool success = await Launcher.LaunchUriAsync(new Uri("zune:search?keyword=&publisher=webabcd&contenttype=app"));
}
}
}


6、演示什么是快速恢复应用,以及如何设置快速恢复应用
Others/FastResume.xaml

<phone:PhoneApplicationPage
x:Class="Demo.Others.FastResume"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
FontFamily="{StaticResource PhoneFontFamilyNormal}"
FontSize="{StaticResource PhoneFontSizeNormal}"
Foreground="{StaticResource PhoneForegroundBrush}"
SupportedOrientations="Portrait" Orientation="Portrait"
mc:Ignorable="d"
shell:SystemTray.IsVisible="True">

<Grid x:Name="LayoutRoot" Background="Transparent">
<StackPanel>

<TextBlock TextWrapping="Wrap">
<Run>1、什么是快速恢复应用:当你点击 tile 启动了 app 后,再回到开始屏幕,再点击 tile 可以直接恢复应用而不是重新启动应用(wp8 新特性)</Run>
<LineBreak />
<Run>2、如何实现快速恢复应用:在 manifest 中的 DefaultTask 节点中增加 ActivationPolicy="Resume"</Run>
</TextBlock>

</StackPanel>
</Grid>

</phone:PhoneApplicationPage>


7、App.xaml.cs 的说明
Others/AppXamlCs.xaml

<phone:PhoneApplicationPage
x:Class="Demo.Others.AppXamlCs"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
FontFamily="{StaticResource PhoneFontFamilyNormal}"
FontSize="{StaticResource PhoneFontSizeNormal}"
Foreground="{StaticResource PhoneForegroundBrush}"
SupportedOrientations="Portrait" Orientation="Portrait"
mc:Ignorable="d"
shell:SystemTray.IsVisible="True">

<Grid Background="Transparent">
<StackPanel>

<TextBlock x:Name="lblMsg" TextWrapping="Wrap">
<Run>关于 App.xaml.cs 的说明,参见它的注释就好,写得很清楚了</Run>
<LineBreak />
<Run>注意:导航过程中发生异常会通过 RootFrame_NavigationFailed 捕获,其他未处理异常会通过 Application_UnhandledException 捕获</Run>
</TextBlock>

</StackPanel>
</Grid>

</phone:PhoneApplicationPage>


8、manifest 的说明
Others/Manifest.xaml

<phone:PhoneApplicationPage
x:Class="Demo.Others.Manifest"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
FontFamily="{StaticResource PhoneFontFamilyNormal}"
FontSize="{StaticResource PhoneFontSizeNormal}"
Foreground="{StaticResource PhoneForegroundBrush}"
SupportedOrientations="Portrait" Orientation="Portrait"
mc:Ignorable="d"
shell:SystemTray.IsVisible="True">

<Grid Background="Transparent">
<StackPanel>

<TextBlock x:Name="lblMsg" TextWrapping="Wrap">
<Run>关于 manifest 的说明,详见 WMAppManifest.xml</Run>
<LineBreak />
<Run>1、应用程序 UI: UI 相关的设置</Run>
<LineBreak />
<Run>2、功能: 勾选你需要用到的功能,有时提示无权限可能就是相关的功能没有勾选</Run>
<LineBreak />
<Run>3、要求: 勾选你程序的硬件要求,可以防止不符合要求的设备安装</Run>
<LineBreak />
<Run>4、打包: 打包就是打包了</Run>
</TextBlock>

</StackPanel>
</Grid>

</phone:PhoneApplicationPage>


OK
[源码下载]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐