Windows Phone Update3 (新分辨率 1080 x 1920 不会影响到现有WP8应用)

更新内容: Update 3 OS version: 8.0.10501.127 or 8.0.10512.142* Accessibility. We’ve made several improvements for customers who are visually impaired. 辅助功能 – 改进弱视用户的手机使用体验 Storage. Now you can easily free up storage space on your phone and manage temporary files. New categories show what’s taking up space. 存储 – 可简单清理存储空间、管理临时分拣、显示空间使用情况 Driving Mode. Feeling distracted behind the wheel?…

0

WP8: 一个在ListBox 中ItemTemplate中放入ScrollViewer导致SelectedChangd不能触发的状况,及其解决办法

在做Windows Phone App开发中,有一项内容是使用ListBox并且将TextBlock放到ItemTemplate中,参考以下代码: 1: <ListBox x:Name=”MyListBox” HorizontalAlignment=”Left” SelectionChanged=”MyListBox_SelectionChanged” > 2: <ListBox.ItemTemplate> 3: <DataTemplate> 4: <StackPanel Orientation=”Horizontal” Background=”Blue” Height=”80″ Margin=”15,0,0,7″> 5: <TextBlock Text=”{Binding SomeContent}” FontSize=”25″/> 6: </StackPanel> 7: </DataTemplate> 8: </ListBox.ItemTemplate> 9: </ListBox> 在这个示例中,我创建了一个ListBox,并且把TextBlock放到了ItemTemplate中。在把TextBlock填充完之前,都是好的。 当我把StackPanel固定高度后,TextBlock不能显示全部内容。不过如果不这样,这个列表里面的内容就会显示很乱。所以,我决定在TextBlock旁边加一个ScrollViewer,这样用户就可以上下滑动显示内容。 1: <ListBox x:Name=”MyListBox” HorizontalAlignment=”Left” SelectionChanged=”MyListBox_SelectionChanged” > 2: <ListBox.ItemTemplate> 3: <DataTemplate> 4: <StackPanel Orientation=”Horizontal” Background=”Blue” Height=”80″> 5: <ScrollViewer HorizontalScrollBarVisibility=”Hidden”> 6: <TextBlock Text=”{Binding…

2

Windows Phone 8 App: ScrollViewer Issue inside Item Template with SelectedChanged in ListBox

While working with Windows Phone App Development, one of the commonest tasks is to use ListBox and put TextBlock inside ItemTemplate, considering the XAML below: 1: <ListBox x:Name="MyListBox" HorizontalAlignment="Left" SelectionChanged="MyListBox_SelectionChanged" > 2: <ListBox.ItemTemplate> 3: <DataTemplate> 4: <StackPanel Orientation="Horizontal" Background="Blue" Height="80" Margin="15,0,0,7"> 5: <TextBlock Text="{Binding SomeContent}" FontSize="25"/> 6: </StackPanel> 7: </DataTemplate> 8: </ListBox.ItemTemplate> 9: </ListBox> In…

3

如何在Windows应用商店中提交您的Windows 8.1 应用更新

翘首以盼的Windows 8.1 不负众望的与大家见面了,与此同时也带来了全新的应用商店,小伙伴儿们要赶紧升级系统啦! 今天给大家介绍下如何提交一个Windows 8.1 的应用,其实微软针对这次系统版本升级对于应用商店的支持类似之前的Windows Phone商店,可以让您的应用同时支持Windows 8 和 windows 8.1 首先登陆 Windows 应用商店 http://dev.windows.com 管理界面功能基本与 8.0 版本没有区别 接着我们可以选择一个应用商店中的应用进行编辑更新 选择创建新版本 随后我们就进入了应用更新流程中,在此我们可以根据应用的实际情况进行更新,今天我就主要介绍下如何更新您的8.1应用,随之点击程序包。 进入程序包更新页面。我们会惊喜的发现这里多出一个显示8.1程序包的位置。 当然这里我们的应用还是要和商店账号进行关联签名。(同 8.0) 随后我们将打包好的8.1的Appx包上传至应用商店 点击保存。 随后您需要设置针对8.1的应用从新编辑提要内容说明。 这里windows应用商店会帮您把8.0的描述信息自动复制过来,当然在这里我建议大家在这里加入8.1的新功能描述和截图帮助用户了解我们的应用。 (包括:提要、应用功能、屏幕截图、说明已经建议的硬件) 和windows8.0共享的内容(关键字、版权和商标信息、其他许可条款、以及促销图像、网站链接、支持人员联系信息和隐私策略) 点击提交进行认证按钮,至此您就完成了 Windows 8.1 应用更新。 剩下的事情就是耐心等待应用认证流程了 :)

0

Windows Store App中判断运行的app应用是否有用户操作

对于有些Line of Business (LOB)的应用,可能为了保护一些屏幕上显示的敏感信息,会有监测用户空闲时间并锁定当前屏幕的需求。对此Windows一直有提供“屏幕保护”并在唤醒时回到登录界面的功能,但是毕竟这个设置以及空闲时间并不能通过WinRT的API进行设置,那么我们如何才能做到在应用级别内做到呢? 这个解决方案主要是解决两个问题,先是需要来检测人为操作,包括鼠标键盘和触摸输入,其次就是加入一个内建的timer来检测空闲时间,并触发timeout之后的下一步逻辑,如锁定屏幕、弹出提示等等。 对于前者,我们可以通过Window.Current.CoreWindow.KeyDown以及Window.Current.CoreWindow.PointerMoved来在app全局范围内进行事件检测。而对于timer逻辑,我这里简单地包装了一个类,可以根据需要在app级别或者page级别来加入,并自定timeout之后的动作。 public class AppIdleDetector { public TimeSpan IdleTime { get { return DateTime.Now – IdleStartedTime; } }   public void Start() { UnhookCoreWindowsEvents(); HookCoreWindowsEvents(); ResetIdleTimer(); }   public void Stop() { UnhookCoreWindowsEvents(); }   private DateTime IdleStartedTime;     private void ResetIdleTimer() { IdleStartedTime = DateTime.Now; }   private void…

0

Windows 8.1 Store App内截屏

在开发Windows Store App中,对应用程序进行截图是经常面临的一个问题。但是由于API的限制,我们没有办法对Windows Store App进行截屏。不过,Windows 8.1的出现带来了新的希望: Rendering the XAML tree to a bitmap WebView for JavaScirpt 接下来我将要用简单的代码来演示一下这两个新的API。 Rendering the XAML tree to a bitmap Windows 8.1的runtime在Windows.UI.Xaml.Media.Imaging中新加入了RenderTargetBitmap,而这里有两个非常重要的方法: RenderTargetBitmap.RenderAsync:把UIElement渲染成图片。 RenderTargetBitmap.GetPixelsAsync:把RenderTargetBitmap图片保存成BGRA8格式的流文件。 下面是在XAML render to bitmap 示例中找的一份C#代码,具体的代码可以在示例中下载: Render XAML Tree to image source 1: RenderTargetBitmap renderTargetBitmap = new RenderTargetBitmap(); 2: await renderTargetBitmap.RenderAsync(RenderedGrid); 3: RenderedImage.Source = renderTargetBitmap; Render XAML Tree…

0

如何禁用GridView中的ScrollViewer的滚动

这篇文章所讨论的问题似乎有些基础,因为ScrollViewer控件有Horizontal/VerticalScrollMode属性可以用来控制滚动条的行为,如设定成ScrollMode.Disabled的期望结果就是能够禁用滚动操作。 一开始我们也是这样认为的,直到我们发现,在GridView中,如果当前使用的是触控,则通过此方法能够得到期望的结果,但是如果当前是在鼠标模式,那在设置成ScrollMode.Disabled之后,仍旧能够通过鼠标滚轮来进行ScrollViewer的滚动。 在Windows Store App中,无论是使用触屏还是传统的鼠标键盘,我们总是试图能够提供相对一致的用户体验,但是这里似乎在控件行为上两种输入方式产生了差异。 最初我们尝试通过捕获控件的PointerWheelChanged事件,但是由于这是属于RoutedEvent,所以即使我们在某一个层级UIElement的PointerWheelChanged设定了handled=true,也无法阻止visual tree中下层控件捕捉到滚动操作并响应。 经过多次尝试,我们最终得出了以下的解决方案,即当我们想要冻结滚动的时候,先获取到SV控件,然后获取到其偏移值,然后再绑定这个控件的ViewChanged事件,在每次事件触发时对其执行强制ScrollTo指令,测试可用。 ScrollViewer sv = GetVisualChild<ScrollViewer>(itemGridView); var frozenOffset = sv.HorizontalOffset; sv.ViewChanged += (ss,ee) => { sv.ScrollToHorizontalOffset(frozenOffset); }; 希望这个这个小贴士能够解决开发中碰到的实际问题。

0

Win8/WP store app的代码安全与混淆

我们在为Top App的技术支持过程中,一直有收到关于Windows 8 & Windows Phone商店应用的代码安全解决方案的询问。在这篇文章中,我简单地把我们收集到的信息做一个总结。所以很抱歉这篇文章并不是一个解决方案。 当前Windows Phone 8支持C#/VB.NET、C++来进行开发,而Windows 8 Store App则再多一个JS。     Windows 8 Store App   Win8 store app的package上传到store之后,只会在签名层面多一些处理,而不会牵涉到任何的代码保护或者混淆措施。所以我们在本地的app安装目录下,可以直接拿到.Net app的IL dll,或者直接用写字板就能打开HTML/WinJS app的代码。 微软没有官方的代码混淆解决方案或产品。我们有找到以下几个能够混淆Win8/WP store app (.NET)代码的第三方解决方案,不过比较遗憾的是这些都是收费应用,但基本都提供了试用版。其中第一家preemptive,好几代的VisualStudio中都集成了其Community Edition,但遗憾这个版本并不支持Win8/WP store app。这些第三方产品都不在微软的官方技术支持范围内,我们亦不保证能够完美运行,所以在上传您的app之前,希望多加测试。 .NET Obfuscation (Marketplace/Professional edition) http://www.preemptive.com/products/dotfuscator/dotfuscator-for-marketplace-apps Eazfuscator.NET http://www.gapotchenko.com/eazfuscator.net Babel Obfuscator http://www.babelfor.net/ Crypto Obfuscator For .Net http://www.ssware.com/cryptoobfuscator/obfuscator-net.htm Skater .NET Obfuscator http://rustemsoft.com/obfuscator_net.asp 而对于WinJS,理论上市面上提供javascript minify的工具都应该能够提供解决方案,我们有找到 jscrambler https://jscrambler.com/…

0

在WP8中为地图控件加入当前地图的移动和停止的检测

在WP8,地图控件经过了修整,新的Map API 在Microsoft.Phone.Maps.Controls 命名空间下,而原来的BingMap control (在Microsoft.Phone.Controls.Maps命名空间,注意区别)已经不再推荐使用了。 这个CASE的需求非常简单,假设我们当前地图中的内容正在移动的时候,触发某些事件或者显示某些提示,而在停止移动之后,继而有另外一种提示,也就是需要找到一种方法,在WP8中,检测到当前地图正在移动或者停止移动。   我们的研究从Microsoft.Phone.Maps.Controls.Map 对象的若干个事件入手,但是发现都没有现成的能够满足我们要求的对象。诸如CenterChanged, ViewChanged,ZoomLevelChanged这些事件,也是只在某些如Center、ZoomLevel的相关属性变动时才会触发,但是并不能直接告诉我们当前地图正在移动或停止。 我们的解决方案是在CenterChanged事件中,加入一个DispatcherTimer,这个timer每间隔一定事件就进行检测,并和前一次timer触发时center有所改变而记录下的时间来进行比较,判断当前地图是否正在移动。代码实现如下:   1: DateTime lastCenterChangeTime = DateTime.Now; 2:  3: bool isChanging = false; //这里完全也可以设定成一个实现INotifyPropertyChanged的ViewModel的通知属性,这样一旦属性值改变了,就可以通过绑定反馈到视图页面 4:  5: 6:  7: private DispatcherTimer notifyCenterChangedTimer; 8: const int timerInterval = 100; //timer的执行间隔 9: const int changeMinInterval =300;//最小触发地图位置变动的时间间隔 10:  11: private void sampleMap_CenterChanged(object sender, MapCenterChangedEventArgs e) 12:  13: {…

0

如何在Windows商店应用中防止HTTPS通讯被中间人攻击解密?

背景 几个月前,我们这里接到一份消息,有个人评论一家业内著名的Windows Store开发者使用明文传递用户账号信息。这是一个很震惊的问题,我们无法想象这样一家著名的开发公司也会犯如此低级的错误。我们的生活早已离不开这家公司开发的软件,当然也离不开Windows 8。 在紧急的研究之后,我们发现,事实并非如此,实际上,这个App是使用加密的HTTPS信道去传输信息的。而评论这条消息的人正是使用了一种类似于中间人攻击的方法,在本地破解了HTTPS的传输,并读取到了内容。 而这个工具也是我们经常使用的用作HTTP分析的工具——Fiddler。不过,这个工具仅仅只能作为本地的代理去分析从本地或到达本地的流量。虽然我们没有办法去获取到加密过的HTTPS流量,但是我们可以使用这个工具去解密本机发出的HTTPS流量,无论我们是用什么样子的浏览器。 具体细节,可以参考Fiddler官方的一篇文章,http://fiddler2.com/Fiddler/help/httpsdecryption.asp,这篇文章描述了如果使用中间人攻击的方法,采用一张伪造的HTTPS证书来分析HTTPS流量。 其实,回到最初的问题,这个评论人提到的问题是可以在此App的不同平台版本下重现的,当然,也可以在其他软件中重现。而这位“怀有恶意的”评论人并没有提及这些事实,仅仅针对于Windows 8 Store版本。也使得我们不得不怀疑,这位评论人究竟出于什么样的原因编造了这样的事情。 虽然我们知道了事情的经过,也虽然我们这里并没有做错什么,可是我们是不是还能做点什么,避免此类事情的再次发生呢? 研究: 作为一名MSFT的工程师,我们还是把重点放在了技术上面。通过技术去减少此类不实评论。实际中,我们没有办法阻止中间人获取到流量信息,但是我们可以探测到他们。现在我们最大的困难是,在桌面时代,我们有着很多可用的API,可是在Windows RT时代,可用的资源就变少了。 最初,我们想在Windows RT上找到一种可以远程颁发证书的方法,像是在传统的.NET平台中做得一样,RemoteCertificateValidationCallback。不幸的是,直到最后,我们也没有办法在API层面上找到可以去验证SSL证书的方法。 不过,在配置层面呢? 解决方法: 之所以Fiddler可以去解密HTTPS流量,是在于,Fiddler把自己的证书放到了Windows的根信任证书里,而我们的Windows Store App又继承信任了Windows根信任证书。 如果我们把所有的信任证书都拿掉,仅仅保留一份我们自己的证书,事情就可以解决了。灵感来源于此,SSL server authentication using application specific trusted roots: 你可以编写 Windows 应用商店应用,该应用使用自己的信任密钥,而不是从系统信任中继承。在安装你的应用之后,你可以使用清单来指定根证书也安装在专用存储中,而且该应用可以使用根证书与 Web 服务器建立安全的 HTTPS 连接。根不必通过 Microsoft 根程序进行信任。根仅受你的应用的信任,而且不会影响对系统上其他应用的信任。 还有,Setting the certificates extension: 证书扩展使你能够随应用安装证书、指定是否从系统信任继承,以及设置证书选择标准。 事情变得简单了,我们仅仅需要让我们自己的App信任唯一的由我们自己颁发的证书就可以了。请看下面App Manifest文件的截图,在Solution Explorer里,仅仅需要把证书文件部分设置为“build action = content, copy if newer”:   哪里获得我们需要的证书: 在我们测试中,我仅仅用到了自签名的cer证书。但是,我们怎么能得到一张在生产环境中使用的证书呢?其实,很简单,去问问看你的网站管理员!不过,如果他不是很和蔼可亲怎么办?其实我们也可以自己从浏览器中提取。…

1