Edi Wang

Windows Development 83


Windows Phone 8.1 (WinRT) 如何实现Timer

最近在用WinRT重写以前的一个应用,需要显示一个时钟,结果发现没有Timer控件。。。 看来只能自己写代码实现了。屌丝的做法是Thread.Sleep,但那个会卡UI线程,用户会操作不了任何东西。正确的思路应该是用.NET 4.5的async await,不会卡UI线程。替代Thread.Sleep的方法是Task.Delay,它是awaitable的,所以代码是这样的: while (true) { // 要做的操作 await Task.Delay(毫秒); } 为了增加逼格和可重用性,我们需要进一步封装。注意观察本高(diao)手(si)是如何一步步提高逼格的。 首先是循环条件和毫秒数,要能被控制,所以加入属性: public int Interval { get; set; } public bool IsEnabled { get; se...

WP async await WinRT Timer

Windows Phone 8.1 DatePicker和TimePicker控件的数据绑定

Windows Phone Runtime 8.1 (WinRT) 自带了DatePicker和TimePicker控件。妈妈再也不用担心我装WPToolkit了。但是和WPToolkit里面的两个Picker不同,WinRT的控件在MVVM模式里做data binding的时候是要爆的。 首先是DatePicker。 具体的情况表现为:ViewModel里的属性是DateTime类型,并且VM正确实现了INotifyPropertyChanged接口,前台直接用Binding语法绑定这个属性,但VM变化,界面不变。界面变化,VM不变。代码看起来就像是这样: Xaml: ViewModel: private DateTime _selectedDate; public DateTime SelectedDate { get { return _selecte...

WP DatePicker WinRT

Surface Pro 3 个人使用评测之系统和软件

话说没有优秀软件的硬件就是一坨翔,这话说的一点都没错。Surface Pro系列之所以牛逼,就因为它不仅有充满现代科技感的硬件设计,更有完整的桌面版Windows 8.1,有了Windows几乎啥事都能干了,根本不用把果蛆pad放在眼里。今天写的这篇文章就是我使用Surface Pro 3近一个月来对于操作系统和软件的感受。也会教大家一些调教技巧,让你的Pro 3更顺手。 一、Windows版本 美版Surface Pro 3搭载的是Windows 8.1 Pro x64英文版。系统属性和EULAID是这样的: 和Surface RT、Surface 2不同,Pro系列是基于x86架构的硬件的,所以安装的“完整版”Windows就和普通笔记本、台式机上的功能是一模一样的。在电脑上能用的软件,Pro上都能用。当然,RT系统能用的软件Pro也能用。 第一次开机联网后会自动激活Win...

Windows Surface DPI

Portable Class Library中如何调用WCF OData Service

上个月发布了一个WP8.1应用:NuGet Search,并在GitHub开了源:https://github.com/EdiWang/WP-NuGetSearch NuGet的服务接口是个WCF OData Service,为了装逼,我尝试使用了跨Framework的PCI工程,结果no zuo no die了。和一般.NET类库不同,PCL有些tricky的地方要爆。下面是开荒成功的代码: public async Task GetDataAsync(string searchTerm, int pageIndex, bool includePreRelease = false) { try { IDictionary queryOptions = new Dictionary { { "filter",...

WCF PCL OData

我在《上海轨道交通》中是如何解决Windows Phone拼音分组bug的

我的App《上海轨道交通》有个很坑的bug,按拼音首字母分组的站点列表会出现分组错误的情况,比如“莘庄”应该在X下,而WP的SortedLocaleGrouping居然把它分在了S下。这是因为“莘庄”的“莘”是多音字。同理,应该在C下的“长江南路”也到了“Z”下。类似的还有: 分组的代码用的是MSDN的范例改的:http://msdn.microsoft.com/library/windows/apps/jj244365(v=vs.105).aspx 这个范例对于英文来说是没问题的,中文就会出现多音字的问题。 为了解决这个坑爹问题,我写了个PinYinGroupResolver,用的时候可以写出很装逼的代码,比如这样: GroupedStations = new PinYinGroupResolver(sGroup) .For(s =...

WP Group PinYin

不用Start8,不花一分钱,手把手教你3分钟打造Win8.1开始菜单

从Win8出来开始,许多人包括我,都非常反感它去掉了开始菜单。虽然在8.1里加上了开始按钮,但那个按钮只是个开始屏幕的快捷方式,根本就是换汤不换药。更可恨的是,大微软说好今年要给8.1用户带来开始菜单的,结果跳票了。 从Win8起,微软就间接养活了一帮做三方开始菜单的公司,国外的比如Start8,是收费的。Classic Shell倒是免费的。国内的360垃圾助手也有类似的功能。但是他们都有个共同的缺点:禁用了开始按钮原本的功能,并且容易导致explorer.exe崩溃。 有没有办法不花一分钱,不影响开始按钮原有功能,在几分钟内就搞个开始菜单的替代品呢?可以!这是我最终捣鼓后的效果: 有的少年就要“恍然大悟”了,这不就是在任务栏新建了一个指向程序文件夹的工具栏么?喝喝,拿样锁定任务栏后会有问题的,不幸你们自己试试,锁定后Programs右边会出来半个文件夹的图标。 其实呢,思路...

Windows 8.1 Start Menu

我在《上海轨道交通》应用中是如何解析XML数据的

本文针对.NET初学者介绍LINQ TO XML,你会看见很多为了通俗易懂而故意描述得不专业的语句,所以高手勿入!本文介绍的方法不只针对WP,其他任何.NET项目也可以参考。 我在Windows Phone平台上发布的《上海轨道交通》使用的是离线XML作为数据存储。好处是不需要安装任何三方库,.NET自己就有能力解析。如果用JSON装逼还得下载JSON.NET呢。又因为都是只读数据,也用不着为了装逼而用SQL Lite或SQL CE什么的数据库杀鸡用牛刀。 下面介绍一下如何在工程里内嵌XML文件并解析到对象的一般方法。 《上海轨道交通》的XML文件保存的是所有的站点信息,单个节点看起来就像这样:...

LINQ XML WP Shanghai Metro

Windows Phone 8 开发:地图应用测试正常发布后爆掉的解决办法

最近更新了一次我的《上海轨道交通》App,结果爆了。为了加入街区图功能我用了WP自带的Map控件,并且也申请了正确的API Key,发布之前在模拟器和真机上测试一切OK,结果发布后就是这个样子的: 具体的异常信息是: Cannot create instance of type 'Microsoft.Phone.Maps.Controls.Map' [Line: 84 Position: 38]Exception from HRESULT: 0xD0000022 根据之前的经验,这像是没有在AppManifest中打开需要的权限。可是我分明已经勾选了ID_CAP_MAP了,还需要什么权限呢?最后经过一番苦逼的研究,在MSDN上看到了这样一个警告: 你TM在逗我?VS居然在我部署测试程序的时候偷偷把这个capability选上了而不告诉我一下!我的App设计的目的就在于尽量不...

WP Map

Windows Phone 8 开发:应用崩溃时给作者发送错误报告邮件

我们的应用难免会爆,但是手工在各个方法上加try...catch...未必能cover到所有场景,有时候我们不希望应用吞掉错误,发生严重异常时,我们应当允许应用在用户面前爆掉。如果没有处理这些异常,应用程序的表现就是闪退。比较好的做法是在应用崩溃时给用户一个选择是否发送邮件告诉应用作者崩溃的详细日志。对于作者来说,等待DevCenter的异常报告相对而言比较被动。如果能在应用崩溃之后立即得到回馈那就可以尽早修复问题。 做法很简单,和ASP.NET网站在Global.asax中使用的全局错误处理类似,WP应用也有个全局错误处理的事件。 打开App.xaml.cs,定位到Application_UnhandledException(object sender, ApplicationUnhandledExceptionEventArgs e)事件处理函数上。 当任何未处理的异常产生时...

WP Exception

Windows Phone 8 开发:如何判断用户手机是否更新了GDR3

有时候我们开发的软件需要用到GDR3更新的功能,比如调用屏幕旋转的设置之前就先得确定用户已经安装了GDR3。但是WP SDK没有提供直接的方法,所以我们只能通过判断操作系统版本号来确定用户的系统是否安装了GDR3。 GDR3的特征是:系统版本号大于8.0.10492(Developer Preview包含在内)。在手机的关于页面中可以看到当前版本号,安装了GDR3的通常是8.0.10512: 所以,判断GDR3的代码如下: static bool IsGDR3() { return Environment.OSVersion.Version = new Version(8, 0, 10492); } 下面是有图有真相环节: MessageBox.Show(IsGDR3() ? "This Phone has GDR3 installed" : "This P...

WP GDR3