Edi Wang

Microsoft MVP for Azure

All Posts

Windows Phone Runtime 8.1 按返回键彻底关闭App

Windows Phone Runtime 8.1里面的坑不止一点点,最明显的是很多应用以前可以通过按返回键关闭,但是在8.1之后,如果你用了WinRT的runtime写程序,就会发现返回键的行为仅仅是返回WP的主屏幕,而不是关闭App。长按返回键你会发现你的App是被“最小化”在后台了。WP8.1的新版日历应用也是这样。 虽然这对系统性能没有什么影响,但是让处女座用户看见了就会感觉不爽,所以我们还是把它改掉吧。 WinRT里面这个硬件返回按钮是有专门的事件的:HardwareButtons.BackPressed。我们需要处理的情况仅仅是在应用的主页面上,按手机返回按钮关闭App,所以不需要override全局的HardwareButtons.BackPressed事件。只需要在主页面(通常是MainPage.xaml.cs)里override两个导航事件: protected …
Windows Phone WinRT

Windows Phone Runtime 8.1 如何显示系统状态栏(以前的SystemTray)

首先。。。虽然我文章写的2,但是国内愿意主动分享WP开发经验的博客太少了,大家都是粉,为了这个平台不容易,所以我有点什么都会拿出来分享,觉得文章菜的请不要喷。。。 开发WP8.1的小伙伴们如果选择了WinRT的runtime,可能会被坑:如果你的手机主题是黑色的,但是你的应用选择了白色主题,就像这样 RequestedTheme="Light" 那你会发现,虽然你在写UI配色方面偷懒了许多,但是WP的系统状态栏(显示信号、时间的地方),也就是Silverlight Runtime里称作SystemTray的,配色并不会因为你选择了“Light”而变成黑色这种对比色,它始终是跟着手机系统设置走的(黑色主题则为白色,白色主题则为黑色),于是你的应用就会出现一条白色的状态栏在手机顶端,用户再也不能愉快的看时间了。草草草草草。 当你想修这个问题的时候,你又会发现微软已经把Silverlight时代
Windows Phone WinRT

Windows Phone 8.1 Silverlight运行时StorageFolder.GetFolderFromPathAsync爆掉的问题

微软说好的一键Target WP8.1的神话终究还是个坑。不少朋友发现有些API虽然编译通过,但依然是爆炸的。比如 await StorageFolder.GetFolderFromPathAsync(); 运行时会就直接爆炸了: 这个坑留在我的几个应用里好久了,今天刚解决。方法是换个API。。。。。 原来是这样子: var path = await StorageFolder.GetFolderFromPathAsync("Assets/StationFloorMaps/"); var imgTemplate = await path.GetFileAsync(_imgPath.Replace("Assets/StationFloorMaps/", string.Empty)); 现在是这样子: var package = Windows.ApplicationModel.
Silverlight Windows Phone

VS2013 Plug-in Development: How Do I Obtain the Path of a Selected File in Solution Explorer

最近在爆个插件,有个需求就是能够在Solution Explorer中右键点击某个文件然后做一些下流的操作,那么首先就要想办法得到用户选择的文件或者文件们。肿么搞呢。研究了一下WebEssential的代码,总结了一下: 首先,你需要获得DTE2对象,貌似指的是你当前的VS实例。为了方便使用定义成一个静态属性,放到package类里面: 也就是继承Package类的那个类,比如public sealed class ForeverAlonePackage : Package private static DTE2 _dte; internal static DTE2 DTE { get { if (_dte == null) _dte = ServiceProvider.GlobalProvider.GetService(
VSIX

How to move Microsoft Azure Application Insights

本文目前仅适用于国际版的Azure,国内版没有Application Insight服务,请注意。如果你还没有感受过Application Insight这个人类的最新希望,可以到大微软的Channel 9电视台学习一下:http://channel9.msdn.com/Series/Application-Insights-for-Visual-Studio-Online 另外,本文所说的迁移方法不会保留Application Insight的历史数据,如果你看到这里就想喷:你TM在逗我?这叫什么迁移? 。。。 那还是别往下看了。我的标题叫迁移,是因为我实在找不到别的词了。 如果你换了个Microsoft Azure的订阅,怎么迁移以往的ASP.NET, WP工程上面已经配置好的Application Insight呢?目前Azure Portal没有提供更改订阅的功能。所以我们只能在
Visual Studio Azure Application Insight

EntityFramework 6 SqlQuery Passes Nullable Type Arguments

有时候我们需要在EF里直接执行参数化的SQL语句,如果有返回,就要把结果映射成C#对象集合。貌似是从EF4.2开始(4.0写法不一样)提供了DbContext.Database.SqlQuery()的API可以直接执行SQL。但是如果碰到可控类型的参数,比如Guid?,就会爆。 看一个例子,定义的SQL语句如下: string sql = @"SELECT p2.Id AS PeriodId, p2.Title AS PeriodTitle, u.UserId AS UserId, u.DisplayName AS
Entity Framework SQL

如何定时开关机Microsoft Azure上的虚拟机

作为一个屌丝,用Azure的时候得处处想着省钱,在你不用虚拟机的时候关机是个省钱的好办法。当然,每天手动登录Portal去开关机比较麻烦。如果你用VM的时间段比较固定,可以做个定时开关机的任务帮你省钱。 做法是用一台机器作为Controller,在上面建立开关机任务,调度Azure上的VM。比如你自己的机器每天早上8点开机,下午5点关机。你希望Azure上的某台VM早上8:30开机,下午4:30关机。那你就可以把自己的机器作为Controller。当然,你也可以在Azure上开一台专门作为Controller的Server,给它分配一个768MB内存的屌丝instance(diaostance)来省钱。 这台Controller机器上必须安装Microsoft Azure PowerShell,并且要在PowerShell里登录一次Azure。本文不再叙述,具体做法请看我之前写的《图解 …
Azure PowerShell VM

图解:如何在Visual Studio 2013中连接中国版的Azure

VS2013的Server Explorer在第一次连接Azure的时候默认弹出的登录框只能登录国际版的Azure。但是国内很多屌丝没有国际版怎么办呢?其实国内世纪互联运营的windowsazure.cn也可以通过导入订阅的方式来连接。 1. 登录国内版Azure之后,访问这个地址,下载你的订阅文件:https://manage.windowsazure.cn/publishsettings/index 2. 在VS2013里打开Server Explorer,不管你有没有连接到国际版的Azure,这里操作方法都是一样的。在“Azure”上点右键,选择“Manage Subscriptions...” 3. 在弹出的对话框里,选择“Certificates”选项卡,然后点击“Import”按钮,把刚才下载的订阅文件导入。 4. 导入成功以后应该是这个样子的。 5. 接下来,你就能同 …
Azure

How to use Timer on Windows Phone 8.1 (WinRT)

Recently I am rewriting an old App using WinRT, I need to display a clock, but I find there is no Timer control. It looks like I have to implement the Timer myself. I don't use Thread.Sleep because it will block UI thread. I prefer using async await over it. To replace Thread.Sleep, I use Task.Delay:  while (true) { // 要做的操作 await Task.Delay(毫秒); } 为了增加逼格和可重用性,我们需要进一步封装。注意观察本高(
Windows Phone Async 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 _selectedDate; } …
Windows Phone DatePicker WinRT