<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_Alexis</title><subtitle type="text">雄关漫道真如铁，而今迈步从头越</subtitle><id>http://feed.cnblogs.com/blog/u/63203/rss</id><updated>2012-05-14T06:13:17Z</updated><author><name>Alexis</name><uri>http://www.cnblogs.com/alexis/</uri></author><generator>feed.cnblogs.com</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/alexis/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/63203/rss"/><entry><id>http://www.cnblogs.com/alexis/archive/2012/04/23/cnblogs_client_for_windows_phone.html</id><title type="text">Windows Phone 项目实战之博客园</title><summary type="text">之前参与了微软和诺基亚举办的春Phone计划,使用三个app换取Lumia800，我也参加了且已经拿到了Lumia。其中我做的小应用《博客园》 就是三个app中的一员，当时做的时候就想着赢了手机后就把它开源，让更多的朋友学习Windows Phone的开发。</summary><published>2012-04-23T13:38:00Z</published><updated>2012-04-23T13:38:00Z</updated><author><name>Alexis</name><uri>http://www.cnblogs.com/alexis/</uri></author><link rel="alternate" href="http://www.cnblogs.com/alexis/archive/2012/04/23/cnblogs_client_for_windows_phone.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/alexis/archive/2012/04/23/cnblogs_client_for_windows_phone.html"/><content type="html">&lt;p&gt;之前参与了微软和诺基亚举办的&lt;a href="http://msdn.microsoft.com/zh-cn/windowsphone/hh850427"&gt;春Phone计划&lt;/a&gt;,使用三个app换取Lumia800，我也参加了且已经拿到了Lumia。其中我做的小应用&lt;a href="http://www.cnblogs.com/alexis/archive/2012/03/03/2378059.html"&gt;《博客园》&lt;/a&gt; 就是三个app中的一员，当时做的时候就想着赢了手机后就把它开源，让更多的朋友学习Windows Phone的开发。&lt;/p&gt;  &lt;p&gt;下面是程序的一些截图，所谓有图有真相：&lt;/p&gt;  &lt;p&gt;首页：首页精华文章、最新新闻、热门新闻以及推荐新闻。下面是刷新、搜索博主以及锁定Pivot的按钮。&lt;/p&gt;  &lt;p&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/alexis/cnblogs_wp7_1.png" width="240" height="400" alt="" /&gt;&lt;/p&gt;  &lt;p&gt;文章正文页面，使用WebBrowser控件作为显示：&lt;/p&gt;  &lt;p&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/alexis/cnblogs_wp7_2.png" width="240" height="400" alt="" /&gt;&lt;/p&gt;  &lt;p&gt;设置界面：设置每次刷新的数目&lt;/p&gt;  &lt;p&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/alexis/cnblogs_wp7_3.png" width="240" height="400" alt="" /&gt;&lt;/p&gt;  &lt;p&gt;关于使用 博客园for windows phone代码的一些说明&lt;/p&gt;  &lt;p&gt;1. 由于是参赛作品，使用者不能直接copy参加微软或者其他主办方举办的应用换手机活动（稍微改一下就可以，不要这么懒哈）&lt;/p&gt;  &lt;p&gt;2. 由于时间精力有限，市场的博客园可能不会继续维护，如果有爱好者做了更好的博客园并且没有账号，我可以代为上传&lt;/p&gt;  &lt;p&gt;3. 代码中使用的WeiboSDK不提供源码，大家可以使用微博官方提供的SDK&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;关于程序代码中一些不足的地方：&lt;/p&gt;  &lt;p&gt;1. 时间仓促，代码可能写的不是很规范，请见谅&lt;/p&gt;  &lt;p&gt;2. 离线下载功能没有做（尽管很多朋友催我做，实在是精力有限，抱歉），有兴趣的朋友可以自己实现&lt;/p&gt;  &lt;p&gt;3. 从文章正文页回到首页列表会非常卡，卡到爆&lt;/p&gt;  &lt;p&gt;4. 缓存处理有待完善，同样还有更新机制（目前程序是每次启动都会去请求网络数据，其实可以设置一个更新、缓存的策略）&lt;/p&gt;  &lt;p&gt;5. 关于代码中的疑问等，&lt;font color="#ff0000"&gt;不欢迎与我交流哈,非诚勿扰&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;&lt;font color="#ff0000"&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;项目地址：&lt;a title="http://cnblogs.codeplex.com/" href="http://cnblogs.codeplex.com/"&gt;http://cnblogs.codeplex.com/&lt;/a&gt; (大家可以打包下载或者使用SVN工具获取源代码)&lt;/p&gt;  &lt;p&gt;&lt;font color="#ff0000"&gt;注意：codeplex上的代码不能正常运行，缺少博客园的API&lt;/font&gt;，如有需要的朋友可以发送邮件到 &lt;a href="&amp;#109;&amp;#97;&amp;#105;&amp;#108;&amp;#116;&amp;#111;&amp;#58;&amp;#99;&amp;#111;&amp;#110;&amp;#116;&amp;#97;&amp;#99;&amp;#116;&amp;#64;&amp;#99;&amp;#110;&amp;#98;&amp;#108;&amp;#111;&amp;#103;&amp;#115;&amp;#46;&amp;#99;&amp;#111;&amp;#109;"&gt;contact@cnblogs.com&lt;/a&gt; 申请相应的API（一般是来者不拒的，哈哈）&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;之前的两个项目实战，或许对大家有所帮助&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.cnblogs.com/alexis/archive/2011/10/06/2199772.html"&gt;《Windows Phone 项目实战之我的微盘》&lt;/a&gt; 开源地址：&lt;a href="http://vdisk.codeplex.com/"&gt;http://vdisk.codeplex.com/&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.cnblogs.com/alexis/archive/2011/07/02/2054728.html"&gt;《Windows Phone 项目实战之账户助手》&lt;/a&gt; 开源地址：&lt;a href="http://accounthelper.codeplex.com/"&gt;http://accounthelper.codeplex.com/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/alexis/aggbug/2467102.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/alexis/archive/2012/04/23/cnblogs_client_for_windows_phone.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/alexis/archive/2012/04/08/xiami_radio.html</id><title type="text">Windows Phone 应用之虾米电台</title><summary type="text">之前做过一款Windows Phone的应用程序《虾米音乐》 ，收到一些热心网友的反馈。其中有一条反馈就是关于其中电台模块的，说是能不能记住上次选择的电台，不要每次进入就显示默认的。老实说，记忆历史电台的功能到现在还没有实现，因为我将虾米音乐中的电台功能抽取出来做成一个小app named《虾米电台》。</summary><published>2012-04-08T11:12:00Z</published><updated>2012-04-08T11:12:00Z</updated><author><name>Alexis</name><uri>http://www.cnblogs.com/alexis/</uri></author><link rel="alternate" href="http://www.cnblogs.com/alexis/archive/2012/04/08/xiami_radio.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/alexis/archive/2012/04/08/xiami_radio.html"/><content type="html">&lt;p&gt;之前做过一款Windows Phone的应用程序&lt;a href="http://www.cnblogs.com/alexis/archive/2011/12/24/windows_phone_xiami.html"&gt;《虾米音乐》&lt;/a&gt; ，收到一些热心网友的反馈。其中有一条反馈就是关于其中电台模块的，说是能不能记住上次选择的电台，不要每次进入就显示默认的。老实说，记忆历史电台的功能到现在还没有实现，因为我将虾米音乐中的电台功能抽取出来做成一个小app named《虾米电台》。&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/alexis/201204/201204081909298411.jpg"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="Screen Capture (3)" border="0" alt="Screen Capture (3)" src="http://images.cnblogs.com/cnblogs_com/alexis/201204/2012040819092914.jpg" width="148" height="244" /&gt;&lt;/a&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/alexis/201204/201204081909308345.jpg"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="Screen Capture (4)" border="0" alt="Screen Capture (4)" src="http://images.cnblogs.com/cnblogs_com/alexis/201204/201204081909304409.jpg" width="148" height="244" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;1. 全面的电台，无论是喜欢星座的你还是怀旧的你，都能找到自己喜欢的电台&lt;/p&gt;  &lt;p&gt;2. 支持歌词同步滚动显示&lt;/p&gt;  &lt;p&gt;3. 记忆上次收听的电台，下次启动后继续听&lt;/p&gt;  &lt;p&gt;4. 分享到微博，将自己喜欢的音乐与微博好友分享&lt;/p&gt;  &lt;p&gt;5. 支持搜索艺人电台（支持拼音搜索）&lt;/p&gt;  &lt;p&gt;市场下载地址： &lt;a title="http://windowsphone.com/s?appid=cfadb206-1995-4ffa-b802-64c8af82db1c" href="http://windowsphone.com/s?appid=cfadb206-1995-4ffa-b802-64c8af82db1c"&gt;http://windowsphone.com/s?appid=cfadb206-1995-4ffa-b802-64c8af82db1c&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;TODO：&lt;/p&gt;  &lt;p&gt;1. 增加主题选择功能&lt;/p&gt;  &lt;p&gt;2. 优化性能&lt;/p&gt;&lt;img src="http://www.cnblogs.com/alexis/aggbug/2437871.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/alexis/archive/2012/04/08/xiami_radio.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/alexis/archive/2012/03/17/windowsphone_webbrowser_save_image.html</id><title type="text">Windows Phone实用开发技巧（36）：保存WebBrowser中的图片</title><summary type="text">有时候，我们需要在Windows Phone应用中使用WebBrowser控件来显示网页内容，在之前的博文《Windows Phone 中WebBrowser打开新窗口》中讲了如何在WebBrowser中打开新的窗口，今天来讲一下如何让用户保存网页中的图片。其实思路跟上一篇文章一样，不同的是我们将图片从WebBrowser中拿出来了，具体的思路如下:1. 将WebBrowser的Source设置为一个带有图片的url，并且将IsScriptEnabled设为True注册其ScriptNotify事件2. 在WebBrowser的LoadCompleted中注入绑定的JavaScript代码，目的是将使我们点击IMG标签时能够执行我们预定义的函数3. 在ScriptNotify中截获WebBrowser中的事件，如果是图片点击，则Popup中显示该图片4. 使用XNA库方法保存图片</summary><published>2012-03-17T07:41:00Z</published><updated>2012-03-17T07:41:00Z</updated><author><name>Alexis</name><uri>http://www.cnblogs.com/alexis/</uri></author><link rel="alternate" href="http://www.cnblogs.com/alexis/archive/2012/03/17/windowsphone_webbrowser_save_image.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/alexis/archive/2012/03/17/windowsphone_webbrowser_save_image.html"/><content type="html">&lt;p&gt;有时候，我们需要在Windows Phone应用中使用WebBrowser控件来显示网页内容，在之前的博文《&lt;a href="http://www.cnblogs.com/alexis/archive/2011/05/06/2038775.html"&gt;Windows Phone 中WebBrowser打开新窗口&lt;/a&gt;》中讲了如何在WebBrowser中打开新的窗口，今天来讲一下如何让用户保存网页中的图片。&lt;/p&gt;  &lt;p&gt;其实思路跟上一篇文章一样，不同的是我们将图片从WebBrowser中拿出来了，具体的思路如下:&lt;/p&gt;  &lt;p&gt;1. 将WebBrowser的Source设置为一个带有图片的url，并且将IsScriptEnabled设为True注册其ScriptNotify事件&lt;/p&gt;  &lt;p&gt;2. 在WebBrowser的LoadCompleted中注入绑定的JavaScript代码，目的是将使我们点击IMG标签时能够执行我们预定义的函数&lt;/p&gt;  &lt;p&gt;3. 在ScriptNotify中截获WebBrowser中的事件，如果是图片点击，则Popup中显示该图片&lt;/p&gt;  &lt;p&gt;4. 使用XNA库方法保存图片&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;ok，首先我们在页面中放置一个WebBrowser&lt;/p&gt;  &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;phone&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;WebBrowser &lt;/span&gt;&lt;span style="color: red"&gt;x&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: red"&gt;Name&lt;/span&gt;&lt;span style="color: blue"&gt;="webBrowser" &lt;/span&gt;&lt;span style="color: red"&gt;LoadCompleted&lt;/span&gt;&lt;span style="color: blue"&gt;="webBrowser_LoadCompleted" &lt;/span&gt;&lt;span style="color: red"&gt;IsScriptEnabled&lt;/span&gt;&lt;span style="color: blue"&gt;="True" &lt;/span&gt;&lt;span style="color: red"&gt;ScriptNotify&lt;/span&gt;&lt;span style="color: blue"&gt;="webBrowser_ScriptNotify" /&amp;gt;&lt;br/&gt;&lt;/span&gt;&lt;p&gt;然后在页面构造函数中设置它的Source为带有图片的地址&lt;/p&gt;&lt;span style="color: blue"&gt;private &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Popup &lt;/span&gt;popUp;&lt;br/&gt;&lt;br/&gt;&lt;span style="color: green"&gt;// Constructor&lt;br/&gt;&lt;/span&gt;&lt;span style="color: blue"&gt;public &lt;/span&gt;MainPage()&lt;br/&gt;{&lt;br/&gt;    InitializeComponent();&lt;br/&gt;    webBrowser.Source = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Uri&lt;/span&gt;(&lt;span style="color: #a31515"&gt;"http://images.baidu.com/i?ct=201326592&amp;amp;cl=2&amp;amp;lm=-1&amp;amp;st=-1&amp;amp;tn=baiduimage&amp;amp;istype=2&amp;amp;fm=index&amp;amp;pv=&amp;amp;z=0&amp;amp;word=404&amp;amp;s=0"&lt;/span&gt;, UriKind.Absolute);&lt;br/&gt;    popUp = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Popup&lt;/span&gt;();&lt;br/&gt;}&lt;p&gt;Popup为后续保存图片时使用的弹出面板&lt;/p&gt;&lt;p&gt;在WebBrowser的LoadCompleted中注入绑定的JavaScript代码&lt;/p&gt;&lt;span style="color: blue"&gt;private void &lt;/span&gt;webBrowser_LoadCompleted(&lt;span style="color: blue"&gt;object &lt;/span&gt;sender, System.Windows.Navigation.&lt;span style="color: #2b91af"&gt;NavigationEventArgs &lt;/span&gt;e)&lt;br/&gt;{&lt;br/&gt;    &lt;span style="color: blue"&gt;try&lt;br/&gt;    &lt;/span&gt;{&lt;br/&gt;        webBrowser.InvokeScript(&lt;span style="color: #a31515"&gt;"eval"&lt;/span&gt;,&lt;br/&gt;            &lt;span style="color: #a31515"&gt;@"&lt;br/&gt;    window.onLinkPressed = function() {&lt;br/&gt;        var elem = event.srcElement;&lt;br/&gt;        if ( elem != null ) {&lt;br/&gt;            window.external.notify(elem.getAttribute('link'));&lt;br/&gt;        }&lt;br/&gt;        return false;&lt;br/&gt;    }&lt;br/&gt;    window.BindLinks = function() {&lt;br/&gt;        var elems = document.getElementsByTagName('img');&lt;br/&gt;        for (var i = 0; i &amp;lt; elems.length; i++) {&lt;br/&gt;            var elem = elems[i];&lt;br/&gt;            var link = elem.getAttribute('src');&lt;br/&gt;            elem.setAttribute('link', link);&lt;br/&gt;            if(link.indexOf('.gif')&amp;gt;0){&lt;br/&gt;                elem.parentNode.removeChild(elem);&lt;br/&gt;            }else{&lt;br/&gt;                elem.attachEvent('onmousedown', onLinkPressed);&lt;br/&gt;            }&lt;br/&gt;        }&lt;br/&gt;    }"&lt;/span&gt;);&lt;br/&gt;        webBrowser.InvokeScript(&lt;span style="color: #a31515"&gt;"BindLinks"&lt;/span&gt;);&lt;br/&gt;    }&lt;br/&gt;    &lt;span style="color: blue"&gt;catch &lt;/span&gt;(&lt;span style="color: #2b91af"&gt;Exception&lt;/span&gt;)&lt;br/&gt;    {&lt;br/&gt;&lt;br/&gt;        &lt;span style="color: blue"&gt;throw&lt;/span&gt;;&lt;br/&gt;    }&lt;br/&gt;    &lt;span style="color: #2b91af"&gt;MessageBox&lt;/span&gt;.Show(&lt;span style="color: #a31515"&gt;"页面加载完成"&lt;/span&gt;);&lt;br/&gt;}&lt;p&gt;注册了两个函数，一个是用于绑定链接，一个用于处理用户点击链接。并且移除后缀为gif的图片。下面看看我们如何在ScriptNotify中处理图片点击事件：&lt;/p&gt;&lt;span style="color: blue"&gt;private void &lt;/span&gt;webBrowser_ScriptNotify(&lt;span style="color: blue"&gt;object &lt;/span&gt;sender, &lt;span style="color: #2b91af"&gt;NotifyEventArgs &lt;/span&gt;e)&lt;br/&gt;{&lt;br/&gt;    &lt;span style="color: blue"&gt;string &lt;/span&gt;input = e.Value.ToString();&lt;br/&gt;    &lt;span style="color: blue"&gt;if &lt;/span&gt;(&lt;span style="color: #2b91af"&gt;Regex&lt;/span&gt;.IsMatch(input, &lt;span style="color: #a31515"&gt;@"http://[^\[^&amp;gt;]*?(gif|jpg|png|jpeg|bmp|bmp)"&lt;/span&gt;))&lt;br/&gt;    {&lt;br/&gt;        &lt;span style="color: #2b91af"&gt;ImageSource &lt;/span&gt;source = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;BitmapImage&lt;/span&gt;(&lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Uri&lt;/span&gt;(input, UriKind.Absolute));&lt;br/&gt;        popUp.Height = 800;&lt;br/&gt;        popUp.Width = 480;&lt;br/&gt;&lt;br/&gt;        &lt;span style="color: #2b91af"&gt;Grid &lt;/span&gt;grd = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Grid&lt;br/&gt;        &lt;/span&gt;{&lt;br/&gt;            Height = 800,&lt;br/&gt;            Width = 480,&lt;br/&gt;            Background = &lt;span style="color: #2b91af"&gt;App&lt;/span&gt;.Current.Resources[&lt;span style="color: #a31515"&gt;"PhoneBackgroundBrush"&lt;/span&gt;] &lt;span style="color: blue"&gt;as &lt;/span&gt;&lt;span style="color: #2b91af"&gt;SolidColorBrush&lt;/span&gt;,&lt;br/&gt;            Opacity = 0.9,&lt;br/&gt;        };&lt;br/&gt;&lt;br/&gt;        &lt;span style="color: #2b91af"&gt;Image &lt;/span&gt;img = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Image &lt;/span&gt;{ Source = source };&lt;br/&gt;&lt;br/&gt;        grd.Children.Add(img);&lt;br/&gt;&lt;br/&gt;        &lt;span style="color: #2b91af"&gt;Button &lt;/span&gt;btnSave = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Button&lt;br/&gt;        &lt;/span&gt;{&lt;br/&gt;            Content = &lt;span style="color: #a31515"&gt;"保存图片"&lt;/span&gt;,&lt;br/&gt;            Height = 80,&lt;br/&gt;            Width = 200,&lt;br/&gt;            Margin = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Thickness&lt;/span&gt;(48),&lt;br/&gt;            VerticalAlignment = System.Windows.VerticalAlignment.Bottom&lt;br/&gt;        };&lt;br/&gt;        btnSave.Click += (e1, e2) =&amp;gt;&lt;br/&gt;        {&lt;br/&gt;            SaveImage(&lt;span style="color: #2b91af"&gt;DateTime&lt;/span&gt;.Now.ToFileTime().ToString(), img.Source &lt;span style="color: blue"&gt;as &lt;/span&gt;&lt;span style="color: #2b91af"&gt;BitmapImage&lt;/span&gt;);&lt;br/&gt;        };&lt;br/&gt;        grd.Children.Add(btnSave);&lt;br/&gt;&lt;br/&gt;        popUp.Child = grd;&lt;br/&gt;        popUp.IsOpen = &lt;span style="color: blue"&gt;true&lt;/span&gt;;&lt;br/&gt;    }&lt;br/&gt;}&lt;p&gt;使用正则表达式判断当前跳转的url是不是一个合法的图片，如果是截获下来并创建一个弹出层，显示图片，&lt;/p&gt;&lt;p&gt;保存方法很简单：&lt;/p&gt;&lt;span style="color: blue"&gt;private void &lt;/span&gt;SaveImage(&lt;span style="color: blue"&gt;string &lt;/span&gt;fileName, &lt;span style="color: #2b91af"&gt;BitmapImage &lt;/span&gt;source)&lt;br/&gt;{&lt;br/&gt;    &lt;span style="color: #2b91af"&gt;MemoryStream &lt;/span&gt;ms = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;MemoryStream&lt;/span&gt;();&lt;br/&gt;    &lt;span style="color: blue"&gt;try&lt;br/&gt;    &lt;/span&gt;{&lt;br/&gt;        &lt;span style="color: #2b91af"&gt;MediaLibrary &lt;/span&gt;library = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;MediaLibrary&lt;/span&gt;();&lt;br/&gt;        &lt;span style="color: #2b91af"&gt;WriteableBitmap &lt;/span&gt;bitmap = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;WriteableBitmap&lt;/span&gt;(source);&lt;br/&gt;        &lt;span style="color: #2b91af"&gt;Extensions&lt;/span&gt;.SaveJpeg(bitmap, ms, bitmap.PixelWidth, bitmap.PixelHeight, 0, 100);&lt;br/&gt;        ms.Seek(0, SeekOrigin.Begin);&lt;br/&gt;        ms.Seek(0, SeekOrigin.Current);&lt;br/&gt;        library.SavePicture(fileName, ms);&lt;br/&gt;        ms.Close();&lt;br/&gt;        &lt;span style="color: #2b91af"&gt;MessageBox&lt;/span&gt;.Show(&lt;span style="color: #a31515"&gt;"保存图片成功"&lt;/span&gt;);&lt;br/&gt;    }&lt;br/&gt;    &lt;span style="color: blue"&gt;catch&lt;br/&gt;    &lt;/span&gt;{&lt;br/&gt;        &lt;span style="color: #2b91af"&gt;MessageBox&lt;/span&gt;.Show(&lt;span style="color: #a31515"&gt;"保存图片失败"&lt;/span&gt;);&lt;br/&gt;    }&lt;br/&gt;    &lt;span style="color: blue"&gt;finally&lt;br/&gt;    &lt;/span&gt;{&lt;br/&gt;        ms.Close();&lt;br/&gt;    }&lt;br/&gt;}&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;源代码新浪微盘&lt;a href="http://vdisk.weibo.com/s/3fQxH"&gt;下载&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/alexis/aggbug/2403275.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/alexis/archive/2012/03/17/windowsphone_webbrowser_save_image.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/alexis/archive/2012/03/03/2378059.html</id><title type="text">Windows Phone 应用之博客园</title><summary type="text">一直使用Google Reader订阅博客园的新闻，但是苦于抽不出太多时间去Google Reader上看这些最新IT资讯，导致我一次又一次的把它标注为已读，所以就花了点时间弄了个博客园新闻Windows Phone客户端，这样我就可以在一些碎片时间里随时随地浏览最新的Tech新闻了</summary><published>2012-03-03T01:59:00Z</published><updated>2012-03-03T01:59:00Z</updated><author><name>Alexis</name><uri>http://www.cnblogs.com/alexis/</uri></author><link rel="alternate" href="http://www.cnblogs.com/alexis/archive/2012/03/03/2378059.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/alexis/archive/2012/03/03/2378059.html"/><content type="html">&lt;p&gt;一直使用Google Reader订阅博客园的新闻，但是苦于抽不出太多时间去Google Reader上看这些最新IT资讯，导致我一次又一次的把它标注为已读，所以就花了点时间弄了个博客园新闻Windows Phone客户端，这样我就可以在一些碎片时间里随时随地浏览最新的Tech新闻了。&lt;/p&gt;  &lt;p&gt;软件logo&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/alexis/201203/201203030956118260.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="20120303wp701" border="0" alt="20120303wp701" src="http://images.cnblogs.com/cnblogs_com/alexis/201203/201203030956129863.png" width="148" height="244" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;首页是一个Pivot，有3类：最新新闻、推荐新闻以及热门新闻，Appbar中的最右侧让你将pivot暂时锁住，避免左右滑动的误操作。&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/alexis/201203/201203030956126209.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="20120303wp702" border="0" alt="20120303wp702" src="http://images.cnblogs.com/cnblogs_com/alexis/201203/201203030956126176.png" width="148" height="244" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;新闻正文页，使用一个WebBrowser作为正文内存的实现，读者可以点击里面的图片或者超链接，还可以左右滑动已浏览前一篇后一篇的文章&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/alexis/201203/20120303095613255.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="20120303wp703" border="0" alt="20120303wp703" src="http://images.cnblogs.com/cnblogs_com/alexis/201203/201203030956133045.png" width="148" height="244" /&gt;&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;设置界面可以设置每次刷新的条数，默认是20条。还可以设置新闻正文页的阅读主题，另外也可以在这里管理绑定的微博账号&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/alexis/201203/20120303095614189.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="20120303wp704" border="0" alt="20120303wp704" src="http://images.cnblogs.com/cnblogs_com/alexis/201203/201203030956141028.png" width="148" height="244" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;最后是关于页面&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/alexis/201203/201203030956145978.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="20120303wp705" border="0" alt="20120303wp705" src="http://images.cnblogs.com/cnblogs_com/alexis/201203/201203030956152041.png" width="148" height="244" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;市场下载地址：&lt;a href="http://windowsphone.com/s?appid=d36d1702-8c1f-491a-a5b2-8dd9f8cfd4a6"&gt;http://windowsphone.com/s?appid=d36d1702-8c1f-491a-a5b2-8dd9f8cfd4a6&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/alexis/aggbug/2378059.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/alexis/archive/2012/03/03/2378059.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/alexis/archive/2012/02/05/save_music_as_ringtone.html</id><title type="text">Windows Phone实用开发技巧（35）：保存音乐为铃声</title><summary type="text">在Windows Phone 7.5 中，我们在程序中可以将某段音乐保存为手机的铃声。但是保存的时候对音乐文件有一些限制：1. 必须是MP3或者WMA格式的文件2. 铃声文件的长度必须小于40秒3. 铃声文件没有版权限制4. 铃声文件大小必须小于1M</summary><published>2012-02-05T05:35:00Z</published><updated>2012-02-05T05:35:00Z</updated><author><name>Alexis</name><uri>http://www.cnblogs.com/alexis/</uri></author><link rel="alternate" href="http://www.cnblogs.com/alexis/archive/2012/02/05/save_music_as_ringtone.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/alexis/archive/2012/02/05/save_music_as_ringtone.html"/><content type="html">&lt;p&gt;在Windows Phone 7.5 中，我们在程序中可以将某段音乐保存为手机的铃声。但是保存的时候对音乐文件有一些限制：&lt;/p&gt;  &lt;p&gt;1. 必须是MP3或者WMA格式的文件&lt;/p&gt;  &lt;p&gt;2. 铃声文件的长度必须小于40秒&lt;/p&gt;  &lt;p&gt;3. 铃声文件没有版权限制&lt;/p&gt;  &lt;p&gt;4. 铃声文件大小必须小于1M&lt;/p&gt;  &lt;p&gt;因为在实际处理中，我们想要保存为铃声的文件很有可能是一首完整的歌曲，大小会超过1M。那么我们如何才能将歌曲高潮部分保存为铃声呢？ 比如《上海滩》肯定想保存什么&amp;#8220;浪奔，浪涌&amp;#8221;的部分。&lt;/p&gt;  &lt;p&gt;根据我的一些非专业的理解：一首歌曲一般有两个轮回，高潮部分一般出现在每个轮回的最后，即大致一首歌四分之一和三分之一之间。那我们就可以只保存那一部分为另一个文件即可。&lt;/p&gt;  &lt;p&gt;下面的Demo演示了如何从本地的一首歌里面截取部分保存为铃声的。&lt;/p&gt;  &lt;p&gt;首先来看看截取的代码：&lt;/p&gt;  &lt;span style="color: blue"&gt;private void &lt;/span&gt;SaveIntoIso()&lt;br/&gt;{&lt;br/&gt;    &lt;span style="color: #2b91af"&gt;Stream &lt;/span&gt;stream = &lt;span style="color: #2b91af"&gt;App&lt;/span&gt;.GetResourceStream(&lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Uri&lt;/span&gt;(&lt;span style="color: #a31515"&gt;"mangoRingtones;component/beat_it.mp3"&lt;/span&gt;, UriKind.Relative)).Stream;&lt;br/&gt;&lt;br/&gt;    &lt;span style="color: green"&gt;//read some of them&lt;br/&gt;    &lt;/span&gt;stream.Seek(stream.Length / 4, 0);&lt;br/&gt;    &lt;span style="color: blue"&gt;byte&lt;/span&gt;[] buffer = &lt;span style="color: blue"&gt;new byte&lt;/span&gt;[stream.Length / 3 - stream.Length / 4];&lt;br/&gt;    stream.Read(buffer, 0, buffer.Length);&lt;br/&gt;&lt;br/&gt;    &lt;span style="color: green"&gt;//save into isostore&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: blue"&gt;using &lt;/span&gt;(&lt;span style="color: blue"&gt;var &lt;/span&gt;isostore = &lt;span style="color: #2b91af"&gt;IsolatedStorageFile&lt;/span&gt;.GetUserStoreForApplication())&lt;br/&gt;    {&lt;br/&gt;        &lt;span style="color: blue"&gt;using &lt;/span&gt;(&lt;span style="color: blue"&gt;var &lt;/span&gt;inp = isostore.OpenFile(fileName, FileMode.OpenOrCreate, FileAccess.Write))&lt;br/&gt;        {&lt;br/&gt;            inp.Write(buffer, 0, buffer.Length);&lt;br/&gt;        }&lt;br/&gt;    }&lt;br/&gt;&lt;br/&gt;    stream.Close();&lt;br/&gt;    stream.Dispose();&lt;br/&gt;}&lt;p&gt;从本地读取流，取其部分保存为另一个文件。&lt;/p&gt;&lt;p&gt;那么再来看看，我们如何在Windows Phone 中将音频文件保存为手机铃声。&lt;/p&gt;&lt;span style="color: #2b91af"&gt;SaveRingtoneTask &lt;/span&gt;task = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;SaveRingtoneTask&lt;/span&gt;();&lt;br/&gt;task.DisplayName = &lt;span style="color: #a31515"&gt;"beat it"&lt;/span&gt;;&lt;br/&gt;task.Source = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Uri&lt;/span&gt;(&lt;span style="color: #a31515"&gt;@"isostore:/" &lt;/span&gt;+ fileName);&lt;br/&gt;task.Completed += &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;EventHandler&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;TaskEventArgs&lt;/span&gt;&amp;gt;(task_Completed);&lt;br/&gt;task.Show();&lt;p&gt;注意引用独立存储空间中的文件可以使用&lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Uri&lt;/span&gt;(&lt;span style="color: #a31515"&gt;@"isostore:/" &lt;/span&gt;+ fileName); 的方式。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;你可以在这里找到本篇文章的&lt;a href="http://vdisk.weibo.com/s/2kvwc"&gt;源代码&lt;/a&gt;。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/alexis/aggbug/2338813.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/alexis/archive/2012/02/05/save_music_as_ringtone.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/alexis/archive/2012/02/05/Get_FirstChar_of_ChineseWord.html</id><title type="text">Windows Phone实用开发技巧（34）：获取汉字拼音的首字母</title><summary type="text">在之前的文章中曾经介绍过如何在Windows Phone下获取汉字的所有拼音，当时的方法是将所有的汉字、拼音放到一个集合中，然后匹配查找的，这样就会导致一个问题，就是没有在集合中的汉字是找不到拼音的，也会有一些异常情况的发生。今天介绍一种新的方法，使用codeplex上开源的项目GB2312 for Silverlight.</summary><published>2012-02-05T02:19:00Z</published><updated>2012-02-05T02:19:00Z</updated><author><name>Alexis</name><uri>http://www.cnblogs.com/alexis/</uri></author><link rel="alternate" href="http://www.cnblogs.com/alexis/archive/2012/02/05/Get_FirstChar_of_ChineseWord.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/alexis/archive/2012/02/05/Get_FirstChar_of_ChineseWord.html"/><content type="html">&lt;p&gt;在之前的文章中曾经介绍过如何在&lt;a href="http://www.cnblogs.com/alexis/archive/2011/06/11/2070513.html"&gt;Windows Phone下获取汉字的所有拼音&lt;/a&gt;，当时的方法是将所有的汉字、拼音放到一个集合中，然后匹配查找的，这样就会导致一个问题，就是没有在集合中的汉字是找不到拼音的，也会有一些异常情况的发生。&lt;/p&gt;  &lt;p&gt;今天介绍一种新的方法，使用codeplex上开源的项目&lt;a href="http://gb2312.codeplex.com/"&gt;GB2312 for Silverlight&lt;/a&gt;. &lt;/p&gt;  &lt;p&gt;1.创建一个项目，命名为mangoGB2312&lt;/p&gt;  &lt;p&gt;2.将GB2312 for Silverlight项目中的两个文件都拷贝至项目目录GB2312下，并且修改GB2312Encoding.cs的命名空间为mangoGB2312.GB2312，如下图所示&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/alexis/201202/201202051016217405.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/alexis/201202/201202051016226358.png" width="244" height="197" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;3.将gb2312.bin的生成方式修改为嵌入式资源，如下图&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/alexis/201202/201202051016225519.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/alexis/201202/201202051016226424.png" width="244" height="166" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;4.编写提取汉字首字母的函数，我已经封装到一个帮助类里面了，代码如下:&lt;/p&gt;  &lt;span style="color: blue"&gt;public class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;FirstLetterHelper&lt;br/&gt;&lt;/span&gt;{&lt;br/&gt;    &lt;span style="color: gray"&gt;/// &amp;lt;summary&amp;gt; &lt;br/&gt;    /// &lt;/span&gt;&lt;span style="color: green"&gt;得到一个汉字的拼音第一个字母，如果是一个英文字母则直接返回大写字母 &lt;br/&gt;    &lt;/span&gt;&lt;span style="color: gray"&gt;/// &amp;lt;/summary&amp;gt; &lt;br/&gt;    /// &amp;lt;param name="CnChar"&amp;gt;&lt;/span&gt;&lt;span style="color: green"&gt;单个汉字&lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/param&amp;gt; &lt;br/&gt;    /// &amp;lt;returns&amp;gt;&lt;/span&gt;&lt;span style="color: green"&gt;单个大写字母&lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/returns&amp;gt; &lt;br/&gt;    &lt;/span&gt;&lt;span style="color: blue"&gt;public static string &lt;/span&gt;GetCharSpellCode(&lt;span style="color: blue"&gt;string &lt;/span&gt;CnChar)&lt;br/&gt;    {&lt;br/&gt;        &lt;span style="color: blue"&gt;long &lt;/span&gt;iCnChar;&lt;br/&gt;        &lt;span style="color: #2b91af"&gt;GB2312Encoding &lt;/span&gt;encoder = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;GB2312Encoding&lt;/span&gt;();&lt;br/&gt;        &lt;span style="color: blue"&gt;byte&lt;/span&gt;[] ZW = encoder.GetBytes(CnChar);&lt;br/&gt;&lt;br/&gt;        &lt;span style="color: green"&gt;//如果是字母，则直接返回 &lt;br/&gt;        &lt;/span&gt;&lt;span style="color: blue"&gt;if &lt;/span&gt;(ZW.Length == 1)&lt;br/&gt;        {&lt;br/&gt;            &lt;span style="color: blue"&gt;return &lt;/span&gt;CnChar.ToUpper();&lt;br/&gt;        }&lt;br/&gt;        &lt;span style="color: blue"&gt;else&lt;br/&gt;        &lt;/span&gt;{&lt;br/&gt;            &lt;span style="color: green"&gt;// get the array of byte from the single char &lt;br/&gt;            &lt;/span&gt;&lt;span style="color: blue"&gt;int &lt;/span&gt;i1 = (&lt;span style="color: blue"&gt;short&lt;/span&gt;)(ZW[0]);&lt;br/&gt;            &lt;span style="color: blue"&gt;int &lt;/span&gt;i2 = (&lt;span style="color: blue"&gt;short&lt;/span&gt;)(ZW[1]);&lt;br/&gt;            iCnChar = i1 * 256 + i2;&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        &lt;span style="color: green"&gt;// iCnChar match the constant &lt;br/&gt;        &lt;/span&gt;&lt;span style="color: blue"&gt;if &lt;/span&gt;((iCnChar &amp;gt;= 45217) &amp;amp;&amp;amp; (iCnChar &amp;lt;= 45252))&lt;br/&gt;        {&lt;br/&gt;            &lt;span style="color: blue"&gt;return &lt;/span&gt;&lt;span style="color: #a31515"&gt;"A"&lt;/span&gt;;&lt;br/&gt;        }&lt;br/&gt;        &lt;span style="color: blue"&gt;else if &lt;/span&gt;((iCnChar &amp;gt;= 45253) &amp;amp;&amp;amp; (iCnChar &amp;lt;= 45760))&lt;br/&gt;        {&lt;br/&gt;            &lt;span style="color: blue"&gt;return &lt;/span&gt;&lt;span style="color: #a31515"&gt;"B"&lt;/span&gt;;&lt;br/&gt;        }&lt;br/&gt;        &lt;span style="color: blue"&gt;else if &lt;/span&gt;((iCnChar &amp;gt;= 45761) &amp;amp;&amp;amp; (iCnChar &amp;lt;= 46317))&lt;br/&gt;        {&lt;br/&gt;            &lt;span style="color: blue"&gt;return &lt;/span&gt;&lt;span style="color: #a31515"&gt;"C"&lt;/span&gt;;&lt;br/&gt;        }&lt;br/&gt;        &lt;span style="color: blue"&gt;else if &lt;/span&gt;((iCnChar &amp;gt;= 46318) &amp;amp;&amp;amp; (iCnChar &amp;lt;= 46825))&lt;br/&gt;        {&lt;br/&gt;            &lt;span style="color: blue"&gt;return &lt;/span&gt;&lt;span style="color: #a31515"&gt;"D"&lt;/span&gt;;&lt;br/&gt;        }&lt;br/&gt;        &lt;span style="color: blue"&gt;else if &lt;/span&gt;((iCnChar &amp;gt;= 46826) &amp;amp;&amp;amp; (iCnChar &amp;lt;= 47009))&lt;br/&gt;        {&lt;br/&gt;            &lt;span style="color: blue"&gt;return &lt;/span&gt;&lt;span style="color: #a31515"&gt;"E"&lt;/span&gt;;&lt;br/&gt;        }&lt;br/&gt;        &lt;span style="color: blue"&gt;else if &lt;/span&gt;((iCnChar &amp;gt;= 47010) &amp;amp;&amp;amp; (iCnChar &amp;lt;= 47296))&lt;br/&gt;        {&lt;br/&gt;            &lt;span style="color: blue"&gt;return &lt;/span&gt;&lt;span style="color: #a31515"&gt;"F"&lt;/span&gt;;&lt;br/&gt;        }&lt;br/&gt;        &lt;span style="color: blue"&gt;else if &lt;/span&gt;((iCnChar &amp;gt;= 47297) &amp;amp;&amp;amp; (iCnChar &amp;lt;= 47613))&lt;br/&gt;        {&lt;br/&gt;            &lt;span style="color: blue"&gt;return &lt;/span&gt;&lt;span style="color: #a31515"&gt;"G"&lt;/span&gt;;&lt;br/&gt;        }&lt;br/&gt;        &lt;span style="color: blue"&gt;else if &lt;/span&gt;((iCnChar &amp;gt;= 47614) &amp;amp;&amp;amp; (iCnChar &amp;lt;= 48118))&lt;br/&gt;        {&lt;br/&gt;            &lt;span style="color: blue"&gt;return &lt;/span&gt;&lt;span style="color: #a31515"&gt;"H"&lt;/span&gt;;&lt;br/&gt;        }&lt;br/&gt;        &lt;span style="color: blue"&gt;else if &lt;/span&gt;((iCnChar &amp;gt;= 48119) &amp;amp;&amp;amp; (iCnChar &amp;lt;= 49061))&lt;br/&gt;        {&lt;br/&gt;            &lt;span style="color: blue"&gt;return &lt;/span&gt;&lt;span style="color: #a31515"&gt;"J"&lt;/span&gt;;&lt;br/&gt;        }&lt;br/&gt;        &lt;span style="color: blue"&gt;else if &lt;/span&gt;((iCnChar &amp;gt;= 49062) &amp;amp;&amp;amp; (iCnChar &amp;lt;= 49323))&lt;br/&gt;        {&lt;br/&gt;            &lt;span style="color: blue"&gt;return &lt;/span&gt;&lt;span style="color: #a31515"&gt;"K"&lt;/span&gt;;&lt;br/&gt;        }&lt;br/&gt;        &lt;span style="color: blue"&gt;else if &lt;/span&gt;((iCnChar &amp;gt;= 49324) &amp;amp;&amp;amp; (iCnChar &amp;lt;= 49895))&lt;br/&gt;        {&lt;br/&gt;            &lt;span style="color: blue"&gt;return &lt;/span&gt;&lt;span style="color: #a31515"&gt;"L"&lt;/span&gt;;&lt;br/&gt;        }&lt;br/&gt;        &lt;span style="color: blue"&gt;else if &lt;/span&gt;((iCnChar &amp;gt;= 49896) &amp;amp;&amp;amp; (iCnChar &amp;lt;= 50370))&lt;br/&gt;        {&lt;br/&gt;            &lt;span style="color: blue"&gt;return &lt;/span&gt;&lt;span style="color: #a31515"&gt;"M"&lt;/span&gt;;&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        &lt;span style="color: blue"&gt;else if &lt;/span&gt;((iCnChar &amp;gt;= 50371) &amp;amp;&amp;amp; (iCnChar &amp;lt;= 50613))&lt;br/&gt;        {&lt;br/&gt;            &lt;span style="color: blue"&gt;return &lt;/span&gt;&lt;span style="color: #a31515"&gt;"N"&lt;/span&gt;;&lt;br/&gt;        }&lt;br/&gt;        &lt;span style="color: blue"&gt;else if &lt;/span&gt;((iCnChar &amp;gt;= 50614) &amp;amp;&amp;amp; (iCnChar &amp;lt;= 50621))&lt;br/&gt;        {&lt;br/&gt;            &lt;span style="color: blue"&gt;return &lt;/span&gt;&lt;span style="color: #a31515"&gt;"O"&lt;/span&gt;;&lt;br/&gt;        }&lt;br/&gt;        &lt;span style="color: blue"&gt;else if &lt;/span&gt;((iCnChar &amp;gt;= 50622) &amp;amp;&amp;amp; (iCnChar &amp;lt;= 50905))&lt;br/&gt;        {&lt;br/&gt;            &lt;span style="color: blue"&gt;return &lt;/span&gt;&lt;span style="color: #a31515"&gt;"P"&lt;/span&gt;;&lt;br/&gt;        }&lt;br/&gt;        &lt;span style="color: blue"&gt;else if &lt;/span&gt;((iCnChar &amp;gt;= 50906) &amp;amp;&amp;amp; (iCnChar &amp;lt;= 51386))&lt;br/&gt;        {&lt;br/&gt;            &lt;span style="color: blue"&gt;return &lt;/span&gt;&lt;span style="color: #a31515"&gt;"Q"&lt;/span&gt;;&lt;br/&gt;        }&lt;br/&gt;        &lt;span style="color: blue"&gt;else if &lt;/span&gt;((iCnChar &amp;gt;= 51387) &amp;amp;&amp;amp; (iCnChar &amp;lt;= 51445))&lt;br/&gt;        {&lt;br/&gt;            &lt;span style="color: blue"&gt;return &lt;/span&gt;&lt;span style="color: #a31515"&gt;"R"&lt;/span&gt;;&lt;br/&gt;        }&lt;br/&gt;        &lt;span style="color: blue"&gt;else if &lt;/span&gt;((iCnChar &amp;gt;= 51446) &amp;amp;&amp;amp; (iCnChar &amp;lt;= 52217))&lt;br/&gt;        {&lt;br/&gt;            &lt;span style="color: blue"&gt;return &lt;/span&gt;&lt;span style="color: #a31515"&gt;"S"&lt;/span&gt;;&lt;br/&gt;        }&lt;br/&gt;        &lt;span style="color: blue"&gt;else if &lt;/span&gt;((iCnChar &amp;gt;= 52218) &amp;amp;&amp;amp; (iCnChar &amp;lt;= 52697))&lt;br/&gt;        {&lt;br/&gt;            &lt;span style="color: blue"&gt;return &lt;/span&gt;&lt;span style="color: #a31515"&gt;"T"&lt;/span&gt;;&lt;br/&gt;        }&lt;br/&gt;        &lt;span style="color: blue"&gt;else if &lt;/span&gt;((iCnChar &amp;gt;= 52698) &amp;amp;&amp;amp; (iCnChar &amp;lt;= 52979))&lt;br/&gt;        {&lt;br/&gt;            &lt;span style="color: blue"&gt;return &lt;/span&gt;&lt;span style="color: #a31515"&gt;"W"&lt;/span&gt;;&lt;br/&gt;        }&lt;br/&gt;        &lt;span style="color: blue"&gt;else if &lt;/span&gt;((iCnChar &amp;gt;= 52980) &amp;amp;&amp;amp; (iCnChar &amp;lt;= 53640))&lt;br/&gt;        {&lt;br/&gt;            &lt;span style="color: blue"&gt;return &lt;/span&gt;&lt;span style="color: #a31515"&gt;"X"&lt;/span&gt;;&lt;br/&gt;        }&lt;br/&gt;        &lt;span style="color: blue"&gt;else if &lt;/span&gt;((iCnChar &amp;gt;= 53689) &amp;amp;&amp;amp; (iCnChar &amp;lt;= 54480))&lt;br/&gt;        {&lt;br/&gt;            &lt;span style="color: blue"&gt;return &lt;/span&gt;&lt;span style="color: #a31515"&gt;"Y"&lt;/span&gt;;&lt;br/&gt;        }&lt;br/&gt;        &lt;span style="color: blue"&gt;else if &lt;/span&gt;((iCnChar &amp;gt;= 54481) &amp;amp;&amp;amp; (iCnChar &amp;lt;= 55289))&lt;br/&gt;        {&lt;br/&gt;            &lt;span style="color: blue"&gt;return &lt;/span&gt;&lt;span style="color: #a31515"&gt;"Z"&lt;/span&gt;;&lt;br/&gt;        }&lt;br/&gt;        &lt;span style="color: blue"&gt;else return &lt;/span&gt;(&lt;span style="color: #a31515"&gt;"#"&lt;/span&gt;);&lt;br/&gt;    }&lt;br/&gt;}&lt;p&gt;5.测试程序，将模拟器中的键盘勾选上中文输入法，如下图&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/alexis/201202/201202051016233633.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/alexis/201202/201202051016237570.png" width="234" height="244" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;6.输入一些文字后，点击GET就可以得到汉字的首字母了&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/alexis/201202/201202051016231507.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/alexis/201202/201202051016232619.png" width="244" height="231" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;你可以在这里找到本篇文章的&lt;a href="http://vdisk.weibo.com/s/2ksEm"&gt;源代码&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/alexis/aggbug/2338778.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/alexis/archive/2012/02/05/Get_FirstChar_of_ChineseWord.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/alexis/archive/2011/12/24/windows_phone_xiami.html</id><title type="text">Windows Phone 应用之虾米音乐</title><summary type="text">个人比较喜欢虾米音乐，于是自己利用业余时间DIY了一个Windows Phone 客户端。（由于时间精力有限，难免存在各种bug，请大家见谅）功能点如下：1. 全Metro风格，给你与系统一致的用户体验2. 全功能电台，可以选择不同风格的音乐电台，让你一次听个爽3. 及时的排行榜信息，让你知道现在什么最流行4. 支持精选集，让你了解大家都收集了哪些音乐，或许有你想要的哦5. 支持四种方式的搜索：搜音乐、搜专辑、搜歌手、收精选集，让你一次搜个够6. 支持音乐下载（仅提供试用，如需到官方网站使用请购买）7. 支持后台播放</summary><published>2011-12-24T04:08:00Z</published><updated>2011-12-24T04:08:00Z</updated><author><name>Alexis</name><uri>http://www.cnblogs.com/alexis/</uri></author><link rel="alternate" href="http://www.cnblogs.com/alexis/archive/2011/12/24/windows_phone_xiami.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/alexis/archive/2011/12/24/windows_phone_xiami.html"/><content type="html">&lt;p&gt;Windows Phone 虾米客户端&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;strong style="font-size: 18pt; color: red; "&gt;Update: 下载地址：&amp;nbsp;&lt;a href="http://files.cnblogs.com/alexis/Xiami_1.3_0331.xap"&gt;http://files.cnblogs.com/alexis/Xiami_1.3_0331.xap&lt;/a&gt;&amp;nbsp;&lt;/strong&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;个人比较喜欢虾米音乐，于是自己利用业余时间DIY了一个Windows Phone 客户端。（由于时间精力有限，难免存在各种bug，请大家见谅）&lt;/p&gt;&lt;div&gt;功能点如下：&lt;/div&gt;&lt;div&gt;1. 全Metro风格，给你与系统一致的用户体验&lt;/div&gt;&lt;div&gt;2. 全功能电台，可以选择不同风格的音乐电台，让你一次听个爽&lt;/div&gt;&lt;div&gt;3. 及时的排行榜信息，让你知道现在什么最流行&lt;/div&gt;&lt;div&gt;4. 支持精选集，让你了解大家都收集了哪些音乐，或许有你想要的哦&lt;/div&gt;&lt;div&gt;5. 支持四种方式的搜索：搜音乐、搜专辑、搜歌手、收精选集，让你一次搜个够&lt;/div&gt;&lt;div&gt;6. 支持音乐下载（仅提供试用，如需到官方网站使用请购买）&lt;/div&gt;&lt;div&gt;7. 支持后台播放，让你在听虾米的时候可以做whatever，只要你不退出程序&lt;/div&gt;&lt;/div&gt;&lt;p&gt;8. 支持查看歌曲的歌词，让你听周杰伦的歌曲毫无压力&amp;nbsp;&lt;/p&gt;&lt;p&gt;9. 可以将当前所听音乐分享到新浪微博，让朋友们也听一听&amp;nbsp;&lt;/p&gt;&lt;p&gt;10. 可以播放手机Zune里面的音乐，并提供跟Zune播放器一致的播放界面&lt;/p&gt;&lt;p&gt;11. 支持登录虾米账户，让你在手机里面也能一键收听你喜欢的歌曲，同时提供注册功能。&lt;/p&gt;&lt;p&gt;12. 碰到喜欢的歌曲怎么办？ 收藏撒，登录虾米账号，点击收藏就能将该歌曲添加到你的音乐库哦，抓住即是猿粪。&lt;/p&gt;&lt;p&gt;13. 碰到喜欢的电台怎么办？不想每次进入程序找这个电台肿么办？Pin啊，长按电台列表中喜欢的电台，你就能将喜爱的电台Pin到桌面。&lt;/p&gt;&lt;p&gt;14. 更多的惊喜等待你的发现....&amp;nbsp;&lt;/p&gt;&lt;p&gt;【号外】提供良好的错误页面提示，当程序遇到异常后，不要惊慌，你会看到&amp;#8220;404 你懂的 &amp;#8221;页面，这时候你应该知道要做什么吧？&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;img src="http://images.cnblogs.com/cnblogs_com/alexis/xiami404.jpg" border="0" alt="" width="414" height="370" /&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div&gt;首页使用Panorama空间，有类似系统Start的Tile Menu提供快捷方式，并且可以登录注册账号以及上次播放的音乐&lt;/div&gt;&lt;p&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/alexis/20111218_xiami01.jpg" height="600" width="800" border="0" alt="" /&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;虾米电台，各种给力，可以搜喜爱艺人的电台，可以让虾米猜你喜欢的音乐&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/alexis/20111218_xiami02.jpg" height="500" width="800" border="0" alt="" /&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;AM精选集&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/alexis/20111218_xiami03.jpg" height="500" width="800" border="0" alt="" /&gt; &lt;/p&gt;&lt;p&gt;排行榜&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/alexis/20111218_xiami04.jpg" height="500" width="800" border="0" alt="" /&gt; &lt;/p&gt;&lt;p&gt;可以查看某个歌手的详细信息：专辑、好听的歌曲，相似的艺人&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/alexis/20111218_xiami05.jpg" height="500" width="800" border="0" alt="" /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;版本更新：&lt;/p&gt;&lt;p&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/alexis/vsidk.jpg" width="100" height="100" alt="" /&gt;&amp;nbsp;XAP包都放置在微盘上&lt;/p&gt;&lt;p&gt;Build 版&amp;nbsp;&amp;nbsp;&lt;a href="http://vdisk.weibo.com/s/1yiUT"&gt;Xiami_Build_2011_1210.xap&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Beta1版&amp;nbsp;&lt;a href="http://vdisk.weibo.com/s/1yjTi"&gt;Xiami_Beta1_2011_1218.xap&lt;/a&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Release Note：&lt;/p&gt;&lt;div&gt;&lt;div&gt;1. 修复搜索精选集打开无效的问题&lt;/div&gt;&lt;div&gt;2. 修复点击单曲不能播放的问题&lt;/div&gt;&lt;div&gt;3. 修改在Light主题下，歌词看不了的问题&lt;/div&gt;&lt;div&gt;4. 在播放界面新增音量控制菜单&lt;/div&gt;&lt;div&gt;5. 新增收藏 ：精选集、电台、歌曲、专辑的功能&lt;/div&gt;&lt;div&gt;6. 新增多语言支持，目前支持英文与简体中文&lt;/div&gt;&lt;div&gt;7. 新增本地音乐播放&lt;/div&gt;&lt;div&gt;8. 新增分享到微博功能&lt;/div&gt;&lt;/div&gt;&lt;p&gt;9. 新增分享微博功能&amp;nbsp;&lt;/p&gt;&lt;p&gt;RC版 &amp;nbsp;&lt;a href="http://vdisk.weibo.com/s/1DLBg"&gt;Xiami_RC_2011_1224.xap&lt;/a&gt;&amp;nbsp;【new】&lt;/p&gt;&lt;p&gt;&amp;nbsp;Release Note：&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1. 修复分享微博链接出错问题&lt;/div&gt;&lt;div&gt;2. 修复本地文件播放时播下一首没有改变UI的问题&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;strong style="font-size: 18pt; color: red; "&gt;【更新】已经上市场了，地址&lt;/strong&gt;:&lt;a href="http://www.windowsphone.com/zh-CN/apps/f71768fc-4dd4-4e95-953b-55fa1ea430f6"&gt;http://www.windowsphone.com/zh-CN/apps/f71768fc-4dd4-4e95-953b-55fa1ea430f6&lt;/a&gt;&lt;a href="http://www.windowsphone.com/en-US/apps/dd889df9-3809-4504-80b6-03c69425d6af"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/alexis/aggbug/2291606.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/alexis/archive/2011/12/24/windows_phone_xiami.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/alexis/archive/2011/12/24/2300107.html</id><title type="text">Windows Phone实用开发技巧（33）：不重启程序切换当前语言</title><summary type="text">在之前的《Windows Phone 应用程序的全球化》 中讲到了如果创建一个多语言支持的Windows Phone应用程序，本篇文章让我们dig a little deeper。即在设置界面中设置好当前的语言，不用重新进入程序就将当前的界面切换为已选的语言。前提是用到了Mango中的API。（所以本篇文章只对7.1项目有效）。本篇文章的实例代码是基于《Windows Phone 应用程序的全球化》 的，所以如果没有读过该文章的同学可以都看一下。</summary><published>2011-12-24T00:25:00Z</published><updated>2011-12-24T00:25:00Z</updated><author><name>Alexis</name><uri>http://www.cnblogs.com/alexis/</uri></author><link rel="alternate" href="http://www.cnblogs.com/alexis/archive/2011/12/24/2300107.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/alexis/archive/2011/12/24/2300107.html"/><content type="html">&lt;p&gt;在之前的&lt;a href="http://www.cnblogs.com/alexis/archive/2011/05/15/2046774.html"&gt;《Windows Phone 应用程序的全球化》&lt;/a&gt; 中讲到了如果创建一个多语言支持的Windows Phone应用程序，本篇文章让我们dig a little deeper。即在设置界面中设置好当前的语言，不用重新进入程序就将当前的界面切换为已选的语言。前提是用到了Mango中的API。（所以本篇文章只对7.1项目有效）。&lt;/p&gt;  &lt;p&gt;本篇文章的实例代码是基于&lt;a href="http://www.cnblogs.com/alexis/archive/2011/05/15/2046774.html"&gt;《Windows Phone 应用程序的全球化》&lt;/a&gt; 的，所以如果没有读过该文章的同学可以都看一下。&lt;/p&gt;  &lt;p&gt;那么如何做到不重启应用就能够切换语言呢，在MSDN上讲到新设置的语言只对新创建的页面有效，即页面执行了构造函数后才能将切换后的语言资源加载上去。既然是新的页面才有效，那我们就可以让用户在切换好语言后就跳转到新的页面不就行了嘛。但是这样会有一个问题是&amp;#8220;以前的老页面怎么办，在导航历史中的页面怎么办&amp;#8221;。说到这儿，大家应该能想到在mango的API中提供了一个移除导航历史中上个页面的功能了吧。我们需要做的就是在用户切换好语言点击回退的时候将所有的页面都清除掉，然后重新导航到首页，这时候也需要把之前的设置界面清除掉。ok，下面来看看具体的代码吧:&lt;/p&gt;  &lt;p&gt;我们需要重写点击回退事件OnBackKeyPress&lt;/p&gt;  &lt;span style="color: blue"&gt;protected override void &lt;/span&gt;OnBackKeyPress(System.ComponentModel.&lt;span style="color: #2b91af"&gt;CancelEventArgs &lt;/span&gt;e)&lt;br/&gt;{&lt;br/&gt;    &lt;span style="color: green"&gt;//set current language&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: blue"&gt;var &lt;/span&gt;lang = &lt;span style="color: #2b91af"&gt;AppSettingHelper&lt;/span&gt;.GetValueOrDefault&amp;lt;&lt;span style="color: blue"&gt;string&lt;/span&gt;&amp;gt;(&lt;span style="color: #a31515"&gt;"language"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"en-US"&lt;/span&gt;);&lt;br/&gt;    &lt;span style="color: #2b91af"&gt;CultureInfo &lt;/span&gt;ci = &lt;span style="color: blue"&gt;new &lt;/span&gt;System.Globalization.&lt;span style="color: #2b91af"&gt;CultureInfo&lt;/span&gt;(lang);&lt;br/&gt;    &lt;span style="color: #2b91af"&gt;AppResource&lt;/span&gt;.Culture = ci;&lt;br/&gt;    &lt;span style="color: #2b91af"&gt;Thread&lt;/span&gt;.CurrentThread.CurrentCulture = ci;&lt;br/&gt;    &lt;span style="color: #2b91af"&gt;Thread&lt;/span&gt;.CurrentThread.CurrentUICulture = ci;&lt;br/&gt;    &lt;span style="color: green"&gt;//remove all history pages&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: blue"&gt;while &lt;/span&gt;(NavigationService.CanGoBack)&lt;br/&gt;    {&lt;br/&gt;        NavigationService.RemoveBackEntry();&lt;br/&gt;    }&lt;br/&gt;    NavigationService.Navigate(&lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Uri&lt;/span&gt;(&lt;span style="color: #a31515"&gt;"/MainPage.xaml"&lt;/span&gt;, UriKind.Relative));&lt;br/&gt;    &lt;span style="color: blue"&gt;base&lt;/span&gt;.OnBackKeyPress(e);&lt;br/&gt;}&lt;p&gt;在该事件中，我们需要做以下三件事&lt;/p&gt;&lt;p&gt;1. 设置当前的语言&lt;/p&gt;&lt;p&gt;2.移除历史页面&lt;/p&gt;&lt;p&gt;3.跳转到首页&lt;/p&gt;&lt;p&gt;接下来，我们需要重写页面的另外的一个事件，用来将当前的设置界面移除掉：&lt;/p&gt;&lt;span style="color: blue"&gt;protected override void &lt;/span&gt;OnNavigatedFrom(System.Windows.Navigation.&lt;span style="color: #2b91af"&gt;NavigationEventArgs &lt;/span&gt;e)&lt;br/&gt;{&lt;br/&gt;    &lt;span style="color: #2b91af"&gt;Deployment&lt;/span&gt;.Current.Dispatcher.BeginInvoke(&lt;span style="color: blue"&gt;delegate&lt;br/&gt;    &lt;/span&gt;{&lt;br/&gt;        &lt;span style="color: green"&gt;//remove current setting page&lt;br/&gt;        &lt;/span&gt;NavigationService.RemoveBackEntry();&lt;br/&gt;    });&lt;br/&gt;    &lt;span style="color: blue"&gt;base&lt;/span&gt;.OnNavigatedFrom(e);&lt;br/&gt;}&lt;br/&gt;源代码可以在&lt;a href="http://vdisk.weibo.com/s/1DKtR"&gt;这里找到&lt;/a&gt;&lt;img src="http://www.cnblogs.com/alexis/aggbug/2300107.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/alexis/archive/2011/12/24/2300107.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/alexis/archive/2011/12/18/2291995.html</id><title type="text">Windows Phone实用开发技巧（32）：照片角度处理</title><summary type="text">在实际项目中，可能需要用户从相册中选择图片然后进行相应的处理。但是不知道大家有没有发现这样一种情况，就是手机里看是竖着的，但是上传到微博或者哪里的时候确实横着的。一种情况是你拿手机竖着拍照得话，照片就是横着的，虽然在手机里看是竖着的。（可能有点抽象，遇到此情况的同学应该深有感触）那么我们在客户端中应该如何处理这种情况呢？一种想法是获取图片的角度，如果是90°，就把照片翻转过来，再进行相应的操作。那这样就涉及到2个问题</summary><published>2011-12-18T12:07:00Z</published><updated>2011-12-18T12:07:00Z</updated><author><name>Alexis</name><uri>http://www.cnblogs.com/alexis/</uri></author><link rel="alternate" href="http://www.cnblogs.com/alexis/archive/2011/12/18/2291995.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/alexis/archive/2011/12/18/2291995.html"/><content type="html">&lt;p&gt;在实际项目中，可能需要用户从相册中选择图片然后进行相应的处理。但是不知道大家有没有发现这样一种情况，就是手机里看是竖着的，但是上传到微博或者哪里的时候确实横着的。一种情况是你拿手机竖着拍照得话，照片就是横着的，虽然在手机里看是竖着的。（可能有点抽象，遇到此情况的同学应该深有感触）&lt;/p&gt;  &lt;p&gt;那么我们在客户端中应该如何处理这种情况呢？一种想法是获取图片的角度，如果是90&amp;#176;，就把照片翻转过来，再进行相应的操作。那这样就涉及到2个问题&lt;/p&gt;  &lt;p&gt;1. 如何获取相册中照片的角度&lt;/p&gt;  &lt;p&gt;2. 如何翻转已有的照片（流、或者Bitmap或者WriteableBitmap）&lt;/p&gt;  &lt;p&gt;查看了系统的API，并没有对相片的角度提供支持，但是我们可以使用&lt;a href="http://www.codeproject.com/KB/graphics/exiflib.aspx"&gt;ExifLib&lt;/a&gt;开源库去做。&lt;/p&gt;  &lt;p&gt;下述的方法就是获取选取图片的角度的&lt;/p&gt;  &lt;span style="color: gray"&gt;/// &amp;lt;summary&amp;gt;&lt;br/&gt;/// &lt;/span&gt;&lt;span style="color: green"&gt;get angle of photo&lt;br/&gt;&lt;/span&gt;&lt;span style="color: gray"&gt;/// &amp;lt;/summary&amp;gt;&lt;br/&gt;/// &amp;lt;param name="stream"&amp;gt;&lt;/span&gt;&lt;span style="color: green"&gt;photo stream&lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/param&amp;gt;&lt;br/&gt;/// &amp;lt;param name="filename"&amp;gt;&lt;/span&gt;&lt;span style="color: green"&gt;photo name&lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/param&amp;gt;&lt;br/&gt;/// &amp;lt;returns&amp;gt;&lt;/span&gt;&lt;span style="color: green"&gt;angle of the photo&lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/returns&amp;gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: blue"&gt;public static int &lt;/span&gt;GetAngle(&lt;span style="color: #2b91af"&gt;Stream &lt;/span&gt;stream, &lt;span style="color: blue"&gt;string &lt;/span&gt;filename)&lt;br/&gt;{&lt;br/&gt;    ExifLib.ExifOrientation _orientation;&lt;br/&gt;    &lt;span style="color: blue"&gt;int &lt;/span&gt;_angle = 0;&lt;br/&gt;    stream.Position = 0;&lt;br/&gt;    JpegInfo info = ExifReader.ReadJpeg(stream, filename);&lt;br/&gt;    &lt;span style="color: blue"&gt;if &lt;/span&gt;(info!=&lt;span style="color: blue"&gt;null&lt;/span&gt;)&lt;br/&gt;    {&lt;br/&gt;        _orientation = info.Orientation;&lt;br/&gt;        &lt;span style="color: blue"&gt;switch &lt;/span&gt;(info.Orientation)&lt;br/&gt;        {&lt;br/&gt;            &lt;span style="color: blue"&gt;case &lt;/span&gt;ExifOrientation.TopLeft:&lt;br/&gt;            &lt;span style="color: blue"&gt;case &lt;/span&gt;ExifOrientation.Undefined:&lt;br/&gt;                _angle = 0;&lt;br/&gt;                &lt;span style="color: blue"&gt;break&lt;/span&gt;;&lt;br/&gt;            &lt;span style="color: blue"&gt;case &lt;/span&gt;ExifOrientation.TopRight:&lt;br/&gt;                _angle = 90;&lt;br/&gt;                &lt;span style="color: blue"&gt;break&lt;/span&gt;;&lt;br/&gt;            &lt;span style="color: blue"&gt;case &lt;/span&gt;ExifOrientation.BottomRight:&lt;br/&gt;                _angle = 180;&lt;br/&gt;                &lt;span style="color: blue"&gt;break&lt;/span&gt;;&lt;br/&gt;            &lt;span style="color: blue"&gt;case &lt;/span&gt;ExifOrientation.BottomLeft:&lt;br/&gt;                _angle = 270;&lt;br/&gt;                &lt;span style="color: blue"&gt;break&lt;/span&gt;;&lt;br/&gt;&lt;br/&gt;        }&lt;br/&gt;    }&lt;br/&gt;    &lt;span style="color: blue"&gt;return &lt;/span&gt;_angle;&lt;br/&gt;}&lt;p&gt;获取到角度后，如果角度是90&amp;#176;，即是反的，我们需要将其纠正过来，可以使用如下的方法：&lt;/p&gt;&lt;span style="color: blue"&gt;private &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Stream &lt;/span&gt;RotateStream(&lt;span style="color: #2b91af"&gt;Stream &lt;/span&gt;stream, &lt;span style="color: blue"&gt;int &lt;/span&gt;angle)&lt;br/&gt;{&lt;br/&gt;    stream.Position = 0;&lt;br/&gt;    &lt;span style="color: blue"&gt;if &lt;/span&gt;(angle % 90 != 0 || angle &amp;lt; 0) &lt;span style="color: blue"&gt;throw new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;ArgumentException&lt;/span&gt;();&lt;br/&gt;    &lt;span style="color: blue"&gt;if &lt;/span&gt;(angle % 360 == 0) &lt;span style="color: blue"&gt;return &lt;/span&gt;stream;&lt;br/&gt;&lt;br/&gt;    &lt;span style="color: #2b91af"&gt;BitmapImage &lt;/span&gt;bitmap = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;BitmapImage&lt;/span&gt;();&lt;br/&gt;    bitmap.SetSource(stream);&lt;br/&gt;    &lt;span style="color: #2b91af"&gt;WriteableBitmap &lt;/span&gt;wbSource = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;WriteableBitmap&lt;/span&gt;(bitmap);&lt;br/&gt;&lt;br/&gt;    &lt;span style="color: #2b91af"&gt;WriteableBitmap &lt;/span&gt;wbTarget = &lt;span style="color: blue"&gt;null&lt;/span&gt;;&lt;br/&gt;    &lt;span style="color: blue"&gt;if &lt;/span&gt;(angle % 180 == 0)&lt;br/&gt;    {&lt;br/&gt;        wbTarget = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;WriteableBitmap&lt;/span&gt;(wbSource.PixelWidth, wbSource.PixelHeight);&lt;br/&gt;    }&lt;br/&gt;    &lt;span style="color: blue"&gt;else&lt;br/&gt;    &lt;/span&gt;{&lt;br/&gt;        wbTarget = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;WriteableBitmap&lt;/span&gt;(wbSource.PixelHeight, wbSource.PixelWidth);&lt;br/&gt;    }&lt;br/&gt;&lt;br/&gt;    &lt;span style="color: blue"&gt;for &lt;/span&gt;(&lt;span style="color: blue"&gt;int &lt;/span&gt;x = 0; x &amp;lt; wbSource.PixelWidth; x++)&lt;br/&gt;    {&lt;br/&gt;        &lt;span style="color: blue"&gt;for &lt;/span&gt;(&lt;span style="color: blue"&gt;int &lt;/span&gt;y = 0; y &amp;lt; wbSource.PixelHeight; y++)&lt;br/&gt;        {&lt;br/&gt;            &lt;span style="color: blue"&gt;switch &lt;/span&gt;(angle % 360)&lt;br/&gt;            {&lt;br/&gt;                &lt;span style="color: blue"&gt;case &lt;/span&gt;90:&lt;br/&gt;                    wbTarget.Pixels[(wbSource.PixelHeight - y - 1) + x * wbTarget.PixelWidth] = wbSource.Pixels[x + y * wbSource.PixelWidth];&lt;br/&gt;                    &lt;span style="color: blue"&gt;break&lt;/span&gt;;&lt;br/&gt;                &lt;span style="color: blue"&gt;case &lt;/span&gt;180:&lt;br/&gt;                    wbTarget.Pixels[(wbSource.PixelWidth - x - 1) + (wbSource.PixelHeight - y - 1) * wbSource.PixelWidth] = wbSource.Pixels[x + y * wbSource.PixelWidth];&lt;br/&gt;                    &lt;span style="color: blue"&gt;break&lt;/span&gt;;&lt;br/&gt;                &lt;span style="color: blue"&gt;case &lt;/span&gt;270:&lt;br/&gt;                    wbTarget.Pixels[y + (wbSource.PixelWidth - x - 1) * wbTarget.PixelWidth] = wbSource.Pixels[x + y * wbSource.PixelWidth];&lt;br/&gt;                    &lt;span style="color: blue"&gt;break&lt;/span&gt;;&lt;br/&gt;            }&lt;br/&gt;        }&lt;br/&gt;    }&lt;br/&gt;    &lt;span style="color: #2b91af"&gt;MemoryStream &lt;/span&gt;targetStream = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;MemoryStream&lt;/span&gt;();&lt;br/&gt;    wbTarget.SaveJpeg(targetStream, wbTarget.PixelWidth, wbTarget.PixelHeight, 0, 100);&lt;br/&gt;    &lt;span style="color: blue"&gt;return &lt;/span&gt;targetStream;&lt;br/&gt;}&lt;p&gt;&lt;a href="http://vdisk.weibo.com/s/1wl6P"&gt;Demo源代码下载&lt;/a&gt;&lt;/p&gt;&lt;p&gt;原文&lt;a href="http://timheuer.com/blog/archive/2010/09/23/working-with-pictures-in-camera-tasks-in-windows-phone-7-orientation-rotation.aspx"&gt;Handling picture orientation in CameraCaptureTask in Windows Phone 7&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/alexis/aggbug/2291995.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/alexis/archive/2011/12/18/2291995.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/alexis/archive/2011/12/12/Windows_Phone_String_Encrpty.html</id><title type="text">Windows Phone实用开发技巧（31）：密码加密</title><summary type="text">我们在实际开发的时候可能需要记住用户的信息，比如用户名与密码，通常的作用是在之后的网络请求中需要认证。密码是敏感信息，我们需要对其进行相应的加密后再存储到独立存储空间或者配置信息中。</summary><published>2011-12-12T12:50:00Z</published><updated>2011-12-12T12:50:00Z</updated><author><name>Alexis</name><uri>http://www.cnblogs.com/alexis/</uri></author><link rel="alternate" href="http://www.cnblogs.com/alexis/archive/2011/12/12/Windows_Phone_String_Encrpty.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/alexis/archive/2011/12/12/Windows_Phone_String_Encrpty.html"/><content type="html">&lt;p&gt;我们在实际开发的时候可能需要记住用户的信息，比如用户名与密码，通常的作用是在之后的网络请求中需要认证。密码是敏感信息，我们需要对其进行相应的加密后再存储到独立存储空间或者配置信息中。&lt;/p&gt;  &lt;p&gt;在Windows Phone中有一个简单的API可以方便的实现字符串的界面，下面给出相应的demo：&lt;/p&gt;  &lt;p&gt;程序的大致布局如下：有一个输入框用于输入要加密的字符串，点击加密按钮后，将输入的字符串进行相应的加密。点击解密按钮将刚刚加密的字符串进行解密。&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/alexis/201112/201112122045373981.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/alexis/201112/201112122045405391.png" width="194" height="244" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;我们使用的是SDK中自带的加密类：&lt;span style="color: #2b91af"&gt;ProtectedData&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;加密按钮的处理事件如下：将输入的字符串转换为字节数组，然后使用ProtectedData以及预先定义的字节数组进行加密，加密后得到的也是一个字节数据，我们可以使用&lt;span style="color: #2b91af"&gt;Convert&lt;/span&gt;.ToBase64String得到其对应的字符串：&lt;/p&gt;  &lt;span style="color: blue"&gt;private void &lt;/span&gt;button1_Click(&lt;span style="color: blue"&gt;object &lt;/span&gt;sender, &lt;span style="color: #2b91af"&gt;RoutedEventArgs &lt;/span&gt;e)&lt;br/&gt;{&lt;br/&gt;    &lt;span style="color: blue"&gt;byte&lt;/span&gt;[] input = System.Text.&lt;span style="color: #2b91af"&gt;Encoding&lt;/span&gt;.UTF8.GetBytes(textBox1.Text);&lt;br/&gt;    &lt;span style="color: blue"&gt;string &lt;/span&gt;result=&lt;span style="color: #2b91af"&gt;Convert&lt;/span&gt;.ToBase64String(&lt;span style="color: #2b91af"&gt;ProtectedData&lt;/span&gt;.Protect(input, opt));&lt;br/&gt;    textBlock3.Text = result;&lt;br/&gt;}&lt;p&gt;预先定义的字节数组如下：&lt;/p&gt;&lt;span style="color: blue"&gt;byte&lt;/span&gt;[] opt = &lt;span style="color: blue"&gt;new byte&lt;/span&gt;[] { 1, 2, 4, 8, 16 };&lt;p&gt;再来看下解密按钮的处理事件：&lt;/p&gt;&lt;span style="color: blue"&gt;private void &lt;/span&gt;button2_Click(&lt;span style="color: blue"&gt;object &lt;/span&gt;sender, &lt;span style="color: #2b91af"&gt;RoutedEventArgs &lt;/span&gt;e)&lt;br/&gt;{&lt;br/&gt;    &lt;span style="color: blue"&gt;if &lt;/span&gt;(&lt;span style="color: blue"&gt;string&lt;/span&gt;.IsNullOrEmpty(textBlock3.Text))&lt;br/&gt;    {&lt;br/&gt;        &lt;span style="color: #2b91af"&gt;MessageBox&lt;/span&gt;.Show(&lt;span style="color: #a31515"&gt;"请先加密"&lt;/span&gt;);&lt;br/&gt;        &lt;span style="color: blue"&gt;return&lt;/span&gt;;&lt;br/&gt;    }&lt;br/&gt;    &lt;span style="color: blue"&gt;byte&lt;/span&gt;[] output=&lt;span style="color: #2b91af"&gt;Convert&lt;/span&gt;.FromBase64String(textBlock3.Text);&lt;br/&gt;    &lt;span style="color: blue"&gt;byte&lt;/span&gt;[] en=&lt;span style="color: #2b91af"&gt;ProtectedData&lt;/span&gt;.Unprotect(output, opt);&lt;br/&gt;    textBlock2.Text = System.Text.&lt;span style="color: #2b91af"&gt;Encoding&lt;/span&gt;.UTF8.GetString(en, 0, en.Length);&lt;br/&gt;}&lt;p&gt;首先获取加密后的字符串对应的字节数组，然后使用Unprotect函数进行解密，注意如果在加密的时候提供了选项数组，那么在解密的时候也需要提供一样的字节数组。&lt;/p&gt;&lt;p&gt;你可以在这里找到本篇文章的&lt;a href="http://vdisk.weibo.com/s/1tUzn"&gt;源代码&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/alexis/aggbug/2285280.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/alexis/archive/2011/12/12/Windows_Phone_String_Encrpty.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry></feed>
