<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_专注ASP.NET &amp; RIA以及SQLServer BI&amp;GIS</title><subtitle type="text">骂别人不革命，便是革命者，则自己不做事，而骂别人的事做得不好，自然便是更做事者。若与此辈理论，可以被牵连到白费唇舌，一事无成，也就是白活一世，于己于人，都无益处。我现在得了妙法，是谣言不辩，诬蔑不洗，只管自己做事。——鲁迅1934年6月21日信 </subtitle><id>http://feed.cnblogs.com/blog/u/12144/rss</id><updated>2011-11-30T03:58:25Z</updated><author><name>哥本哈士奇(aspnetx)</name><uri>http://www.cnblogs.com/aspnetx/</uri></author><generator>CNBlogs BlogServer</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/aspnetx/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/12144/rss"/><entry><id>http://www.cnblogs.com/aspnetx/archive/2011/11/30/2268886.html</id><title type="text">分析系统的几个技术方案</title><summary type="text">分析系统通常作为整个IT系统的一部分，具体技术上的划分属于BI的范畴，对于一个大型的信息系统来说，分析模块是比较重要的一块，这里根据常见的需求，以及个人的一些经验，总结出若干技术方案以供参考。</summary><published>2011-11-30T03:56:00Z</published><updated>2011-11-30T03:56:00Z</updated><author><name>哥本哈士奇(aspnetx)</name><uri>http://www.cnblogs.com/aspnetx/</uri></author><link rel="alternate" href="http://www.cnblogs.com/aspnetx/archive/2011/11/30/2268886.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/aspnetx/archive/2011/11/30/2268886.html"/><content type="html">&lt;p&gt;&lt;span style="line-height: normal" lang="EN-US"&gt;&lt;font face="Calibri"&gt;&lt;font style="font-size: 10.5pt" color="#000000"&gt;&amp;nbsp;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="text-justify: inter-ideograph; line-height: normal; text-indent: 0pt; margin: 0cm 0cm 0pt; word-break: normal"  align="justify"&gt;&lt;strong style="mso-bidi-font-weight: normal"&gt;&lt;span style="line-height: normal; font-family: ; mso-ascii-font-family: calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: calibri; mso-hansi-theme-font: minor-latin"&gt;&lt;font face="宋体"&gt;&lt;font style="font-size: 10.5pt" color="#000000"&gt;摘要&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;span style="line-height: normal" lang="EN-US"&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p style="text-justify: inter-ideograph; line-height: normal; text-indent: 0pt; margin: 0cm 0cm 0pt; word-break: normal"  align="justify"&gt;&lt;font color="#000000"&gt;&lt;span style="line-height: normal; font-family: ; mso-ascii-font-family: calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: calibri; mso-hansi-theme-font: minor-latin"&gt;&lt;font face="宋体"&gt;&lt;font style="font-size: 10.5pt"&gt;分析系统通常作为整个&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;font style="font-size: 10.5pt"&gt;&lt;span style="line-height: normal" lang="EN-US"&gt;&lt;font face="Calibri"&gt;IT&lt;/font&gt;&lt;/span&gt;&lt;span style="line-height: normal; font-family: ; mso-ascii-font-family: calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: calibri; mso-hansi-theme-font: minor-latin"&gt;&lt;font face="宋体"&gt;系统的一部分，具体技术上的划分属于&lt;/font&gt;&lt;/span&gt;&lt;span style="line-height: normal" lang="EN-US"&gt;&lt;font face="Calibri"&gt;BI&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;span style="line-height: normal; font-family: ; mso-ascii-font-family: calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: calibri; mso-hansi-theme-font: minor-latin"&gt;&lt;font face="宋体"&gt;&lt;font style="font-size: 10.5pt"&gt;的范畴，对于一个大型的信息系统来说，分析模块是比较重要的一块，这里根据常见的需求，以及个人的一些经验，总结出若干技术方案以供参考。&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;span style="line-height: normal" lang="EN-US"&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="text-justify: inter-ideograph; line-height: normal; text-indent: 0pt; margin: 0cm 0cm 0pt; word-break: normal"  align="justify"&gt;&lt;span style="line-height: normal" lang="EN-US"&gt;&lt;font face="Calibri"&gt;&lt;font style="font-size: 10.5pt" color="#000000"&gt;&amp;nbsp;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="text-justify: inter-ideograph; line-height: normal; text-indent: 0pt; margin: 0cm 0cm 0pt; word-break: normal"  align="justify"&gt;&lt;span style="line-height: normal" lang="EN-US"&gt;&lt;font face="Calibri"&gt;&lt;font style="font-size: 10.5pt" color="#000000"&gt;&amp;nbsp;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="text-justify: inter-ideograph; line-height: normal; text-indent: 0pt; margin: 0cm 0cm 0pt; word-break: normal"  align="justify"&gt;&lt;strong style="mso-bidi-font-weight: normal"&gt;&lt;font color="#000000"&gt;&lt;span style="line-height: normal; font-family: ; mso-ascii-font-family: calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: calibri; mso-hansi-theme-font: minor-latin"&gt;&lt;font face="宋体"&gt;&lt;font style="font-size: 10.5pt"&gt;一切都是&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;span style="line-height: normal" lang="EN-US"&gt;&lt;font face="Calibri"&gt;&lt;font style="font-size: 10.5pt"&gt;T-SQL&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p style="text-justify: inter-ideograph; line-height: normal; text-indent: 0pt; margin: 0cm 0cm 0pt; word-break: normal"  align="justify"&gt;&lt;font color="#000000"&gt;&lt;span style="line-height: normal; font-family: ; mso-ascii-font-family: calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: calibri; mso-hansi-theme-font: minor-latin"&gt;&lt;font face="宋体"&gt;&lt;font style="font-size: 10.5pt"&gt;就是所有的统计数据都是通过&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;font style="font-size: 10.5pt"&gt;&lt;span style="line-height: normal" lang="EN-US"&gt;&lt;font face="Calibri"&gt;SQL&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;span style="line-height: normal; font-family: ; mso-ascii-font-family: calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: calibri; mso-hansi-theme-font: minor-latin"&gt;&lt;font face="宋体"&gt;&lt;font style="font-size: 10.5pt"&gt;语句从存储过程中得到，这样的方案我见过很多，通常都是数据非常少，而且是需求特别明确的情况。&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;span style="line-height: normal" lang="EN-US"&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="text-justify: inter-ideograph; line-height: normal; text-indent: 0pt; margin: 0cm 0cm 0pt; word-break: normal"  align="justify"&gt;&lt;font color="#000000"&gt;&lt;span style="line-height: normal; font-family: ; mso-ascii-font-family: calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: calibri; mso-hansi-theme-font: minor-latin"&gt;&lt;font face="宋体"&gt;&lt;font style="font-size: 10.5pt"&gt;另也有高手用类似&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;font style="font-size: 10.5pt"&gt;&lt;span style="line-height: normal" lang="EN-US"&gt;&lt;font face="Calibri"&gt;Cube&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;span style="line-height: normal; font-family: ; mso-ascii-font-family: calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: calibri; mso-hansi-theme-font: minor-latin"&gt;&lt;font face="宋体"&gt;&lt;font style="font-size: 10.5pt"&gt;聚合的方法将要统计的数据按照各个维度粒度存放好（若干表中），这样的方案也未尝不可，如果一定要抛弃已成型的技术产品的话。&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;span style="line-height: normal" lang="EN-US"&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="text-justify: inter-ideograph; line-height: normal; text-indent: 0pt; margin: 0cm 0cm 0pt; word-break: normal"  align="justify"&gt;&lt;span style="line-height: normal; font-family: ; mso-ascii-font-family: calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: calibri; mso-hansi-theme-font: minor-latin"&gt;&lt;font face="宋体"&gt;&lt;font style="font-size: 10.5pt" color="#000000"&gt;经验：&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;span style="line-height: normal" lang="EN-US"&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="text-justify: inter-ideograph; line-height: normal; text-indent: 0pt; margin: 0cm 0cm 0pt; word-break: normal"  align="justify"&gt;&lt;span style="line-height: normal; font-family: ; mso-ascii-font-family: calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: calibri; mso-hansi-theme-font: minor-latin"&gt;&lt;font face="宋体"&gt;&lt;font style="font-size: 10.5pt" color="#000000"&gt;有几个项目最终会是如此简单呢？所以这是我&lt;strong style="mso-bidi-font-weight: normal"&gt;极其不推荐&lt;/strong&gt;的一个方案。无论怎样，这都是效率最低，最不灵活风险最高的一个方案。除非你真的能限制住用户的需求，或者用户的需求就是确定的。&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;span style="line-height: normal" lang="EN-US"&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="text-justify: inter-ideograph; line-height: normal; text-indent: 0pt; margin: 0cm 0cm 0pt; word-break: normal"  align="justify"&gt;&lt;span style="line-height: normal" lang="EN-US"&gt;&lt;font face="Calibri"&gt;&lt;font style="font-size: 10.5pt" color="#000000"&gt;&amp;nbsp;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="text-justify: inter-ideograph; line-height: normal; text-indent: 0pt; margin: 0cm 0cm 0pt; word-break: normal"  align="justify"&gt;&lt;span style="line-height: normal" lang="EN-US"&gt;&lt;font face="Calibri"&gt;&lt;font style="font-size: 10.5pt" color="#000000"&gt;&amp;nbsp;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="text-justify: inter-ideograph; line-height: normal; text-indent: 0pt; margin: 0cm 0cm 0pt; word-break: normal"  align="justify"&gt;&lt;strong style="mso-bidi-font-weight: normal"&gt;&lt;span style="line-height: normal; font-family: ; mso-ascii-font-family: calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: calibri; mso-hansi-theme-font: minor-latin"&gt;&lt;font face="宋体"&gt;&lt;font style="font-size: 10.5pt" color="#000000"&gt;对报告的格式和输出要求比较高的&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;span style="line-height: normal" lang="EN-US"&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p style="text-justify: inter-ideograph; line-height: normal; text-indent: 0pt; margin: 0cm 0cm 0pt; word-break: normal"  align="justify"&gt;&lt;font color="#000000"&gt;&lt;span style="line-height: normal; font-family: ; mso-ascii-font-family: calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: calibri; mso-hansi-theme-font: minor-latin"&gt;&lt;font face="宋体"&gt;&lt;font style="font-size: 10.5pt"&gt;适合的方案：&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;span style="line-height: normal" lang="EN-US"&gt;&lt;font face="Calibri"&gt;&lt;font style="font-size: 10.5pt"&gt;Reporting Services&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt; &lt;p style="text-justify: inter-ideograph; line-height: normal; text-indent: 0pt; margin: 0cm 0cm 0pt; word-break: normal"  align="justify"&gt;&lt;span style="line-height: normal; font-family: ; mso-ascii-font-family: calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: calibri; mso-hansi-theme-font: minor-latin"&gt;&lt;font face="宋体"&gt;&lt;font style="font-size: 10.5pt" color="#000000"&gt;这类报表在很多行业中都可能遇到，比如下面这张：&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="text-justify: inter-ideograph; line-height: normal; text-indent: 0pt; margin: 0cm 0cm 0pt; word-break: normal"  align="justify"&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/aspnetx/201111/201111301154416671.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" alt="image" src="http://images.cnblogs.com/cnblogs_com/aspnetx/201111/201111301155086547.png" border="0" height="437" width="613" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p style="text-justify: inter-ideograph; line-height: normal; text-indent: 0pt; margin: 0cm 0cm 0pt; word-break: normal"  align="justify"&gt;&lt;span style="line-height: normal; mso-no-proof: yes" lang="EN-US"&gt;&lt;/span&gt;&lt;span style="line-height: normal" lang="EN-US"&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="text-justify: inter-ideograph; line-height: normal; text-indent: 0pt; margin: 0cm 0cm 0pt; word-break: normal"  align="justify"&gt;&lt;font color="#000000"&gt;&lt;span style="line-height: normal; font-family: ; mso-ascii-font-family: calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: calibri; mso-hansi-theme-font: minor-latin"&gt;&lt;font face="宋体"&gt;&lt;font style="font-size: 10.5pt"&gt;这类报表的特点是行列比较多，格式比较固定，通常要求系统严格按照这个格式来出。对格式的要求，我曾经见过最变态的是，将输出的表格跟表样对着阳光比，差一个像素都不行。而不得不提的是，&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;font style="font-size: 10.5pt"&gt;&lt;span style="line-height: normal" lang="EN-US"&gt;&lt;font face="Calibri"&gt;SSRS&lt;/font&gt;&lt;/span&gt;&lt;span style="line-height: normal; font-family: ; mso-ascii-font-family: calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: calibri; mso-hansi-theme-font: minor-latin"&gt;&lt;font face="宋体"&gt;的设计和输出往往都会有些误差，这一点跟&lt;/font&gt;&lt;/span&gt;&lt;span style="line-height: normal" lang="EN-US"&gt;&lt;font face="Calibri"&gt;word&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;span style="line-height: normal; font-family: ; mso-ascii-font-family: calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: calibri; mso-hansi-theme-font: minor-latin"&gt;&lt;font face="宋体"&gt;&lt;font style="font-size: 10.5pt"&gt;差不多，相信很多写过毕业论文的朋友多会有这样的经验，所以调整起来往往都是一个痛苦的过程。&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;span style="line-height: normal" lang="EN-US"&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="text-justify: inter-ideograph; line-height: normal; text-indent: 0pt; margin: 0cm 0cm 0pt; word-break: normal"  align="justify"&gt;&lt;font color="#000000"&gt;&lt;span style="line-height: normal; font-family: ; mso-ascii-font-family: calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: calibri; mso-hansi-theme-font: minor-latin"&gt;&lt;font face="宋体"&gt;&lt;font style="font-size: 10.5pt"&gt;再就一点，这样的报表量需求往往都非常大，尤其是政务部门，通常都会&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;font style="font-size: 10.5pt"&gt;&lt;span style="line-height: normal" lang="EN-US"&gt;&lt;font face="Calibri"&gt;100&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;span style="line-height: normal; font-family: ; mso-ascii-font-family: calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: calibri; mso-hansi-theme-font: minor-latin"&gt;&lt;font face="宋体"&gt;&lt;font style="font-size: 10.5pt"&gt;张以上。&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;span style="line-height: normal" lang="EN-US"&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="text-justify: inter-ideograph; line-height: normal; text-indent: 0pt; margin: 0cm 0cm 0pt; word-break: normal"  align="justify"&gt;&lt;span style="line-height: normal; font-family: ; mso-ascii-font-family: calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: calibri; mso-hansi-theme-font: minor-latin"&gt;&lt;font face="宋体"&gt;&lt;font style="font-size: 10.5pt" color="#000000"&gt;经验：&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;span style="line-height: normal" lang="EN-US"&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="text-justify: inter-ideograph; line-height: normal; text-indent: 0pt; margin: 0cm 0cm 0pt; word-break: normal"  align="justify"&gt;&lt;font color="#000000"&gt;&lt;span style="line-height: normal; font-family: ; mso-ascii-font-family: calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: calibri; mso-hansi-theme-font: minor-latin"&gt;&lt;font face="宋体"&gt;&lt;font style="font-size: 10.5pt"&gt;从目前来说确实没有什么比较好的方案可以取代这个方法，而且本身报表服务的授权是在整个&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;font style="font-size: 10.5pt"&gt;&lt;span style="line-height: normal" lang="EN-US"&gt;&lt;font face="Calibri"&gt;SQLServer&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;span style="line-height: normal; font-family: ; mso-ascii-font-family: calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: calibri; mso-hansi-theme-font: minor-latin"&gt;&lt;font face="宋体"&gt;&lt;font style="font-size: 10.5pt"&gt;授权当中的，所以没有理由不用它。&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;span style="line-height: normal" lang="EN-US"&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="text-justify: inter-ideograph; line-height: normal; text-indent: 0pt; margin: 0cm 0cm 0pt; word-break: normal"  align="justify"&gt;&lt;span style="line-height: normal" lang="EN-US"&gt;&lt;font face="Calibri"&gt;&lt;font style="font-size: 10.5pt" color="#000000"&gt;&amp;nbsp;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="text-justify: inter-ideograph; line-height: normal; text-indent: 0pt; margin: 0cm 0cm 0pt; word-break: normal"  align="justify"&gt;&lt;span style="line-height: normal" lang="EN-US"&gt;&lt;font face="Calibri"&gt;&lt;font style="font-size: 10.5pt" color="#000000"&gt;&amp;nbsp;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="text-justify: inter-ideograph; line-height: normal; text-indent: 0pt; margin: 0cm 0cm 0pt; word-break: normal"  align="justify"&gt;&lt;strong style="mso-bidi-font-weight: normal"&gt;&lt;span style="line-height: normal; font-family: ; mso-ascii-font-family: calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: calibri; mso-hansi-theme-font: minor-latin"&gt;&lt;font face="宋体"&gt;&lt;font style="font-size: 10.5pt" color="#000000"&gt;对报告的快速开发要求高的&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;span style="line-height: normal" lang="EN-US"&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p style="text-justify: inter-ideograph; line-height: normal; text-indent: 0pt; margin: 0cm 0cm 0pt; word-break: normal"  align="justify"&gt;&lt;font color="#000000"&gt;&lt;span style="line-height: normal; font-family: ; mso-ascii-font-family: calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: calibri; mso-hansi-theme-font: minor-latin"&gt;&lt;font face="宋体"&gt;&lt;font style="font-size: 10.5pt"&gt;适合的方案：&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;span style="line-height: normal" lang="EN-US"&gt;&lt;font face="Calibri"&gt;&lt;font style="font-size: 10.5pt"&gt;MOSS+PPS&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt; &lt;p style="text-justify: inter-ideograph; line-height: normal; text-indent: 0pt; margin: 0cm 0cm 0pt; word-break: normal"  align="justify"&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/aspnetx/201111/201111301155128103.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" alt="image" src="http://images.cnblogs.com/cnblogs_com/aspnetx/201111/201111301155208673.png" border="0" height="344" width="622" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p style="text-justify: inter-ideograph; line-height: normal; text-indent: 0pt; margin: 0cm 0cm 0pt; word-break: normal"  align="justify"&gt;&lt;span style="line-height: normal; mso-no-proof: yes" lang="EN-US"&gt;&lt;/span&gt;&lt;span style="line-height: normal" lang="EN-US"&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="text-justify: inter-ideograph; line-height: normal; text-indent: 0pt; margin: 0cm 0cm 0pt; word-break: normal"  align="justify"&gt;&lt;font color="#000000"&gt;&lt;span style="line-height: normal; font-family: ; mso-ascii-font-family: calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: calibri; mso-hansi-theme-font: minor-latin"&gt;&lt;font face="宋体"&gt;&lt;font style="font-size: 10.5pt"&gt;通常比较适合对报表或者报告的格式没有什么明确的要求，只要求将数据表述明白，而要求就是能快速的制作出来。比如领导明天要看这个月各方面费用的支出情况，那么很明显通过&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;font style="font-size: 10.5pt"&gt;&lt;span style="line-height: normal" lang="EN-US"&gt;&lt;font face="Calibri"&gt;PPS&lt;/font&gt;&lt;/span&gt;&lt;span style="line-height: normal; font-family: ; mso-ascii-font-family: calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: calibri; mso-hansi-theme-font: minor-latin"&gt;&lt;font face="宋体"&gt;是最快的，而且借助&lt;/font&gt;&lt;/span&gt;&lt;span style="line-height: normal" lang="EN-US"&gt;&lt;font face="Calibri"&gt;MOSS&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;span style="line-height: normal; font-family: ; mso-ascii-font-family: calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: calibri; mso-hansi-theme-font: minor-latin"&gt;&lt;font face="宋体"&gt;&lt;font style="font-size: 10.5pt"&gt;的平台发布也很容易。&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;span style="line-height: normal" lang="EN-US"&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="text-justify: inter-ideograph; line-height: normal; text-indent: 0pt; margin: 0cm 0cm 0pt; word-break: normal"  align="justify"&gt;&lt;font color="#000000"&gt;&lt;span style="line-height: normal; font-family: ; mso-ascii-font-family: calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: calibri; mso-hansi-theme-font: minor-latin"&gt;&lt;font face="宋体"&gt;&lt;font style="font-size: 10.5pt"&gt;另外也可以考虑第三方的解决方案，比如&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;font style="font-size: 10.5pt"&gt;&lt;span style="line-height: normal" lang="EN-US"&gt;&lt;font face="Calibri"&gt;Dundas&lt;/font&gt;&lt;/span&gt;&lt;span style="line-height: normal; font-family: ; mso-ascii-font-family: calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: calibri; mso-hansi-theme-font: minor-latin"&gt;&lt;font face="宋体"&gt;，微软曾购买过很多它的产品集成到&lt;/font&gt;&lt;/span&gt;&lt;span style="line-height: normal" lang="EN-US"&gt;&lt;font face="Calibri"&gt;SQLServer&lt;/font&gt;&lt;/span&gt;&lt;span style="line-height: normal; font-family: ; mso-ascii-font-family: calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: calibri; mso-hansi-theme-font: minor-latin"&gt;&lt;font face="宋体"&gt;中。先前这家公司是做组件的，但是现在只做&lt;/font&gt;&lt;/span&gt;&lt;span style="line-height: normal" lang="EN-US"&gt;&lt;font face="Calibri"&gt;Dashboard&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;span style="line-height: normal; font-family: ; mso-ascii-font-family: calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: calibri; mso-hansi-theme-font: minor-latin"&gt;&lt;font face="宋体"&gt;&lt;font style="font-size: 10.5pt"&gt;了，效果也很不错：&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt; &lt;p style="text-justify: inter-ideograph; line-height: normal; text-indent: 0pt; margin: 0cm 0cm 0pt; word-break: normal"  align="justify"&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/aspnetx/201111/201111301155282831.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" alt="image" src="http://images.cnblogs.com/cnblogs_com/aspnetx/201111/201111301155442750.png" border="0" height="387" width="574" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p style="text-justify: inter-ideograph; line-height: normal; text-indent: 0pt; margin: 0cm 0cm 0pt; word-break: normal"  align="justify"&gt;&lt;span style="line-height: normal; mso-no-proof: yes" lang="EN-US"&gt;&lt;/span&gt;&lt;span style="line-height: normal" lang="EN-US"&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="text-justify: inter-ideograph; line-height: normal; text-indent: 0pt; margin: 0cm 0cm 0pt; word-break: normal"  align="justify"&gt;&lt;span style="line-height: normal; font-family: ; mso-ascii-font-family: calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: calibri; mso-hansi-theme-font: minor-latin"&gt;&lt;font face="宋体"&gt;&lt;font style="font-size: 10.5pt" color="#000000"&gt;经验：&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;span style="line-height: normal" lang="EN-US"&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="text-justify: inter-ideograph; line-height: normal; text-indent: 0pt; margin: 0cm 0cm 0pt; word-break: normal"  align="justify"&gt;&lt;font color="#000000"&gt;&lt;span style="line-height: normal; font-family: ; mso-ascii-font-family: calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: calibri; mso-hansi-theme-font: minor-latin"&gt;&lt;font face="宋体"&gt;&lt;font style="font-size: 10.5pt"&gt;如果在整体的解决方案中，这里只&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;font style="font-size: 10.5pt"&gt;&lt;span style="line-height: normal" lang="EN-US"&gt;&lt;font face="Calibri"&gt;OLTP+OLAP&lt;/font&gt;&lt;/span&gt;&lt;span style="line-height: normal; font-family: ; mso-ascii-font-family: calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: calibri; mso-hansi-theme-font: minor-latin"&gt;&lt;font face="宋体"&gt;，没有&lt;/font&gt;&lt;/span&gt;&lt;span style="line-height: normal" lang="EN-US"&gt;&lt;font face="Calibri"&gt;MOSS&lt;/font&gt;&lt;/span&gt;&lt;span style="line-height: normal; font-family: ; mso-ascii-font-family: calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: calibri; mso-hansi-theme-font: minor-latin"&gt;&lt;font face="宋体"&gt;的规划的话，那么为了&lt;/font&gt;&lt;/span&gt;&lt;span style="line-height: normal" lang="EN-US"&gt;&lt;font face="Calibri"&gt;PPS&lt;/font&gt;&lt;/span&gt;&lt;span style="line-height: normal; font-family: ; mso-ascii-font-family: calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: calibri; mso-hansi-theme-font: minor-latin"&gt;&lt;font face="宋体"&gt;而去部署一个&lt;/font&gt;&lt;/span&gt;&lt;span style="line-height: normal" lang="EN-US"&gt;&lt;font face="Calibri"&gt;MOSS&lt;/font&gt;&lt;/span&gt;&lt;span style="line-height: normal; font-family: ; mso-ascii-font-family: calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: calibri; mso-hansi-theme-font: minor-latin"&gt;&lt;font face="宋体"&gt;实例明显是不明智的，暂且不说&lt;/font&gt;&lt;/span&gt;&lt;span style="line-height: normal" lang="EN-US"&gt;&lt;font face="Calibri"&gt;MOSS&lt;/font&gt;&lt;/span&gt;&lt;span style="line-height: normal; font-family: ; mso-ascii-font-family: calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: calibri; mso-hansi-theme-font: minor-latin"&gt;&lt;font face="宋体"&gt;的授权费用以及部署开发和维护的难度，毕竟&lt;/font&gt;&lt;/span&gt;&lt;span style="line-height: normal" lang="EN-US"&gt;&lt;font face="Calibri"&gt;BI&lt;/font&gt;&lt;/span&gt;&lt;span style="line-height: normal; font-family: ; mso-ascii-font-family: calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: calibri; mso-hansi-theme-font: minor-latin"&gt;&lt;font face="宋体"&gt;只占&lt;/font&gt;&lt;/span&gt;&lt;span style="line-height: normal" lang="EN-US"&gt;&lt;font face="Calibri"&gt;MOSS&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;span style="line-height: normal; font-family: ; mso-ascii-font-family: calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: calibri; mso-hansi-theme-font: minor-latin"&gt;&lt;font face="宋体"&gt;&lt;font style="font-size: 10.5pt"&gt;里很小的一部分，所以这个时候考虑一些第三方的解决方案也是可取的。&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;span style="line-height: normal" lang="EN-US"&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="text-justify: inter-ideograph; line-height: normal; text-indent: 0pt; margin: 0cm 0cm 0pt; word-break: normal"  align="justify"&gt;&lt;span style="line-height: normal" lang="EN-US"&gt;&lt;font face="Calibri"&gt;&lt;font style="font-size: 10.5pt" color="#000000"&gt;&amp;nbsp;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="text-justify: inter-ideograph; line-height: normal; text-indent: 0pt; margin: 0cm 0cm 0pt; word-break: normal"  align="justify"&gt;&lt;span style="line-height: normal" lang="EN-US"&gt;&lt;font face="Calibri"&gt;&lt;font style="font-size: 10.5pt" color="#000000"&gt;&amp;nbsp;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="text-justify: inter-ideograph; line-height: normal; text-indent: 0pt; margin: 0cm 0cm 0pt; word-break: normal"  align="justify"&gt;&lt;strong style="mso-bidi-font-weight: normal"&gt;&lt;span style="line-height: normal; font-family: ; mso-ascii-font-family: calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: calibri; mso-hansi-theme-font: minor-latin"&gt;&lt;font face="宋体"&gt;&lt;font style="font-size: 10.5pt" color="#000000"&gt;对炫丽程度要求高以及有特殊功能需求的&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;span style="line-height: normal" lang="EN-US"&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p style="text-justify: inter-ideograph; line-height: normal; text-indent: 0pt; margin: 0cm 0cm 0pt; word-break: normal"  align="justify"&gt;&lt;font color="#000000"&gt;&lt;span style="line-height: normal; font-family: ; mso-ascii-font-family: calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: calibri; mso-hansi-theme-font: minor-latin"&gt;&lt;font face="宋体"&gt;&lt;font style="font-size: 10.5pt"&gt;适合的方案：&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;font style="font-size: 10.5pt"&gt;&lt;span style="line-height: normal" lang="EN-US"&gt;&lt;font face="Calibri"&gt;Silverlight&lt;/font&gt;&lt;/span&gt;&lt;span style="line-height: normal; font-family: ; mso-ascii-font-family: calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: calibri; mso-hansi-theme-font: minor-latin"&gt;&lt;font face="宋体"&gt;等其它&lt;/font&gt;&lt;/span&gt;&lt;span style="line-height: normal" lang="EN-US"&gt;&lt;font face="Calibri"&gt;RIA&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;span style="line-height: normal; font-family: ; mso-ascii-font-family: calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: calibri; mso-hansi-theme-font: minor-latin"&gt;&lt;font face="宋体"&gt;&lt;font style="font-size: 10.5pt"&gt;方案。&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;span style="line-height: normal" lang="EN-US"&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="text-justify: inter-ideograph; line-height: normal; text-indent: 0pt; margin: 0cm 0cm 0pt; word-break: normal"  align="justify"&gt;&lt;span style="line-height: normal; font-family: ; mso-ascii-font-family: calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: calibri; mso-hansi-theme-font: minor-latin"&gt;&lt;font face="宋体"&gt;&lt;font style="font-size: 10.5pt" color="#000000"&gt;通常都是用户给领导看的，需要互动性比较强，而且绚丽程度比较高的。&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;span style="line-height: normal" lang="EN-US"&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="line-height: normal; text-indent: 0pt; margin: 0cm 0cm 0pt; word-break: normal; mso-pagination: widow-orphan"  align="left"&gt;&lt;span style="line-height: normal; font-family: ; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-no-proof: yes" lang="EN-US"&gt;&lt;/span&gt;&lt;span style="line-height: normal; font-family: ; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="text-justify: inter-ideograph; line-height: normal; text-indent: 0pt; margin: 0cm 0cm 0pt; word-break: normal"  align="justify"&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/aspnetx/201111/20111130115548435.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" alt="image" src="http://images.cnblogs.com/cnblogs_com/aspnetx/201111/201111301155568987.png" border="0" height="251" width="396" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p style="text-justify: inter-ideograph; line-height: normal; text-indent: 0pt; margin: 0cm 0cm 0pt; word-break: normal"  align="justify"&gt;&lt;font color="#000000"&gt;&lt;span style="line-height: normal; font-family: ; mso-ascii-font-family: calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: calibri; mso-hansi-theme-font: minor-latin"&gt;&lt;font face="宋体"&gt;&lt;font style="font-size: 10.5pt"&gt;还记得&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;font style="font-size: 10.5pt"&gt;&lt;span style="line-height: normal" lang="EN-US"&gt;&lt;font face="Calibri"&gt;07&lt;/font&gt;&lt;/span&gt;&lt;span style="line-height: normal; font-family: ; mso-ascii-font-family: calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: calibri; mso-hansi-theme-font: minor-latin"&gt;&lt;font face="宋体"&gt;年之前，那个时候开发一些特殊的&lt;/font&gt;&lt;/span&gt;&lt;span style="line-height: normal" lang="EN-US"&gt;&lt;font face="Calibri"&gt;BI&lt;/font&gt;&lt;/span&gt;&lt;span style="line-height: normal; font-family: ; mso-ascii-font-family: calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: calibri; mso-hansi-theme-font: minor-latin"&gt;&lt;font face="宋体"&gt;应用，只能硬着头皮用&lt;/font&gt;&lt;/span&gt;&lt;span style="line-height: normal" lang="EN-US"&gt;&lt;font face="Calibri"&gt;asp.net&lt;/font&gt;&lt;/span&gt;&lt;span style="line-height: normal; font-family: ; mso-ascii-font-family: calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: calibri; mso-hansi-theme-font: minor-latin"&gt;&lt;font face="宋体"&gt;去写，而且还要关注麻烦的&lt;/font&gt;&lt;/span&gt;&lt;span style="line-height: normal" lang="EN-US"&gt;&lt;font face="Calibri"&gt;webform&lt;/font&gt;&lt;/span&gt;&lt;span style="line-height: normal; font-family: ; mso-ascii-font-family: calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: calibri; mso-hansi-theme-font: minor-latin"&gt;&lt;font face="宋体"&gt;页面架构的页面周期的各个阶段，那个时候考虑过&lt;/font&gt;&lt;/span&gt;&lt;span style="line-height: normal" lang="EN-US"&gt;&lt;font face="Calibri"&gt;RIA&lt;/font&gt;&lt;/span&gt;&lt;span style="line-height: normal; font-family: ; mso-ascii-font-family: calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: calibri; mso-hansi-theme-font: minor-latin"&gt;&lt;font face="宋体"&gt;的方案，不过苦于&lt;/font&gt;&lt;/span&gt;&lt;span style="line-height: normal" lang="EN-US"&gt;&lt;font face="Calibri"&gt;Flash&lt;/font&gt;&lt;/span&gt;&lt;span style="line-height: normal; font-family: ; mso-ascii-font-family: calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: calibri; mso-hansi-theme-font: minor-latin"&gt;&lt;font face="宋体"&gt;上手实在别扭（不是困难，大家都懂的）。幸运的是微软后来出&lt;/font&gt;&lt;/span&gt;&lt;span style="line-height: normal" lang="EN-US"&gt;&lt;font face="Calibri"&gt;Silverlight&lt;/font&gt;&lt;/span&gt;&lt;span style="line-height: normal; font-family: ; mso-ascii-font-family: calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: calibri; mso-hansi-theme-font: minor-latin"&gt;&lt;font face="宋体"&gt;了，这对于苦苦寻求前端方案的我们来说是一个好消息，而后来在&lt;/font&gt;&lt;/span&gt;&lt;span style="line-height: normal" lang="EN-US"&gt;&lt;font face="Calibri"&gt;BI&lt;/font&gt;&lt;/span&gt;&lt;span style="line-height: normal; font-family: ; mso-ascii-font-family: calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: calibri; mso-hansi-theme-font: minor-latin"&gt;&lt;font face="宋体"&gt;中成功应用&lt;/font&gt;&lt;/span&gt;&lt;span style="line-height: normal" lang="EN-US"&gt;&lt;font face="Calibri"&gt;RIA &lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;span style="line-height: normal; font-family: ; mso-ascii-font-family: calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: calibri; mso-hansi-theme-font: minor-latin"&gt;&lt;font face="宋体"&gt;&lt;font style="font-size: 10.5pt"&gt;方案，确实在用户中（尤其是政务部门）取得了不错的反响。&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;span style="line-height: normal" lang="EN-US"&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="text-justify: inter-ideograph; line-height: normal; text-indent: 0pt; margin: 0cm 0cm 0pt; word-break: normal"  align="justify"&gt;&lt;font color="#000000"&gt;&lt;span style="line-height: normal; font-family: ; mso-ascii-font-family: calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: calibri; mso-hansi-theme-font: minor-latin"&gt;&lt;font face="宋体"&gt;&lt;font style="font-size: 10.5pt"&gt;很多很难的问题，通过&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;font style="font-size: 10.5pt"&gt;&lt;span style="line-height: normal" lang="EN-US"&gt;&lt;font face="Calibri"&gt;.net&lt;/font&gt;&lt;/span&gt;&lt;span style="line-height: normal; font-family: ; mso-ascii-font-family: calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: calibri; mso-hansi-theme-font: minor-latin"&gt;&lt;font face="宋体"&gt;去&lt;/font&gt;&lt;/span&gt;&lt;span style="line-height: normal" lang="EN-US"&gt;&lt;font face="Calibri"&gt;coding&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;span style="line-height: normal; font-family: ; mso-ascii-font-family: calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: calibri; mso-hansi-theme-font: minor-latin"&gt;&lt;font face="宋体"&gt;&lt;font style="font-size: 10.5pt"&gt;都会很好的解决，所以适合开发一些极端特殊的分析方法。&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;span style="line-height: normal" lang="EN-US"&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="text-justify: inter-ideograph; line-height: normal; text-indent: 0pt; margin: 0cm 0cm 0pt; word-break: normal"  align="justify"&gt;&lt;span style="line-height: normal; font-family: ; mso-ascii-font-family: calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: calibri; mso-hansi-theme-font: minor-latin"&gt;&lt;font face="宋体"&gt;&lt;font style="font-size: 10.5pt" color="#000000"&gt;经验：&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;span style="line-height: normal" lang="EN-US"&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="text-justify: inter-ideograph; line-height: normal; text-indent: 0pt; margin: 0cm 0cm 0pt; word-break: normal"  align="justify"&gt;&lt;span style="line-height: normal; font-family: ; mso-ascii-font-family: calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: calibri; mso-hansi-theme-font: minor-latin"&gt;&lt;font face="宋体"&gt;&lt;font style="font-size: 10.5pt" color="#000000"&gt;设计，封装，在这里很重要。对用户需求的理解，以及对这个行业的理解，会直接影响到这两个方面输出的结果。所以这也是对技术点覆盖最广的一个方案。&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;span style="line-height: normal" lang="EN-US"&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="text-justify: inter-ideograph; line-height: normal; text-indent: 0pt; margin: 0cm 0cm 0pt; word-break: normal"  align="justify"&gt;&lt;span style="line-height: normal" lang="EN-US"&gt;&lt;font face="Calibri"&gt;&lt;font style="font-size: 10.5pt" color="#000000"&gt;&amp;nbsp;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="text-justify: inter-ideograph; line-height: normal; text-indent: 0pt; margin: 0cm 0cm 0pt; word-break: normal"  align="justify"&gt;&lt;span style="line-height: normal" lang="EN-US"&gt;&lt;font face="Calibri"&gt;&lt;font style="font-size: 10.5pt" color="#000000"&gt;&amp;nbsp;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="text-justify: inter-ideograph; line-height: normal; text-indent: 0pt; margin: 0cm 0cm 0pt; word-break: normal"  align="justify"&gt;&lt;strong style="mso-bidi-font-weight: normal"&gt;&lt;span style="line-height: normal; font-family: ; mso-ascii-font-family: calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: calibri; mso-hansi-theme-font: minor-latin"&gt;&lt;font face="宋体"&gt;&lt;font style="font-size: 10.5pt" color="#000000"&gt;对预测要求比较高的&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;span style="line-height: normal" lang="EN-US"&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p style="text-justify: inter-ideograph; line-height: normal; text-indent: 0pt; margin: 0cm 0cm 0pt; word-break: normal"  align="justify"&gt;&lt;span style="line-height: normal; font-family: ; mso-ascii-font-family: calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: calibri; mso-hansi-theme-font: minor-latin"&gt;&lt;font face="宋体"&gt;&lt;font style="font-size: 10.5pt" color="#000000"&gt;适合的方案：接口提供&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;span style="line-height: normal" lang="EN-US"&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="text-justify: inter-ideograph; line-height: normal; text-indent: 0pt; margin: 0cm 0cm 0pt; word-break: normal"  align="justify"&gt;&lt;font color="#000000"&gt;&lt;span style="line-height: normal; font-family: ; mso-ascii-font-family: calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: calibri; mso-hansi-theme-font: minor-latin"&gt;&lt;font face="宋体"&gt;&lt;font style="font-size: 10.5pt"&gt;预测和挖掘是&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;font style="font-size: 10.5pt"&gt;&lt;span style="line-height: normal" lang="EN-US"&gt;&lt;font face="Calibri"&gt;BI&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;span style="line-height: normal; font-family: ; mso-ascii-font-family: calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: calibri; mso-hansi-theme-font: minor-latin"&gt;&lt;font face="宋体"&gt;&lt;font style="font-size: 10.5pt"&gt;中最高的一个层次，实现的思路基本就是根据历史的数据，通过一定的数学算法发现一定的规律，然后判断一个位置的数据某属性是什么样的。购物网站上的商品推荐通常都是通过这种方式实现的。&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;span style="line-height: normal" lang="EN-US"&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="text-justify: inter-ideograph; line-height: normal; text-indent: 0pt; margin: 0cm 0cm 0pt; word-break: normal"  align="justify"&gt;&lt;font color="#000000"&gt;&lt;span style="line-height: normal; font-family: ; mso-ascii-font-family: calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: calibri; mso-hansi-theme-font: minor-latin"&gt;&lt;font face="宋体"&gt;&lt;font style="font-size: 10.5pt"&gt;这种比较合适的方案是模块中通过&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;font style="font-size: 10.5pt"&gt;&lt;span style="line-height: normal" lang="EN-US"&gt;&lt;font face="Calibri"&gt;Services&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;span style="line-height: normal; font-family: ; mso-ascii-font-family: calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: calibri; mso-hansi-theme-font: minor-latin"&gt;&lt;font face="宋体"&gt;&lt;font style="font-size: 10.5pt"&gt;的方式暴露给其它系统做访问接口，从而得到预测结果的数据。&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;span style="line-height: normal" lang="EN-US"&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="text-justify: inter-ideograph; line-height: normal; text-indent: 0pt; margin: 0cm 0cm 0pt; word-break: normal"  align="justify"&gt;&lt;span style="line-height: normal; font-family: ; mso-ascii-font-family: calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: calibri; mso-hansi-theme-font: minor-latin"&gt;&lt;font face="宋体"&gt;&lt;font style="font-size: 10.5pt" color="#000000"&gt;经验：&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;span style="line-height: normal" lang="EN-US"&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="text-justify: inter-ideograph; line-height: normal; text-indent: 0pt; margin: 0cm 0cm 0pt; word-break: normal"  align="justify"&gt;&lt;span style="line-height: normal; font-family: ; mso-ascii-font-family: calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: calibri; mso-hansi-theme-font: minor-latin"&gt;&lt;font face="宋体"&gt;&lt;font style="font-size: 10.5pt" color="#000000"&gt;预测的前提是，数据，要大量的数据，而且是真实数据，最关键的是有质量的数据。这些就好比你请律师，那么即使你是原告也要告诉律师最真实的情况，而且不要落下细节，如果碍于面子而隐瞒或者伪造了什么，那么律师再有能力也帮不到你。&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;span style="line-height: normal" lang="EN-US"&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="text-justify: inter-ideograph; line-height: normal; text-indent: 0pt; margin: 0cm 0cm 0pt; word-break: normal"  align="justify"&gt;&lt;span style="line-height: normal" lang="EN-US"&gt;&lt;font face="Calibri"&gt;&lt;font style="font-size: 10.5pt" color="#000000"&gt;&amp;nbsp;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="text-justify: inter-ideograph; line-height: normal; text-indent: 0pt; margin: 0cm 0cm 0pt; word-break: normal"  align="justify"&gt;&lt;span style="line-height: normal" lang="EN-US"&gt;&lt;font face="Calibri"&gt;&lt;font style="font-size: 10.5pt" color="#000000"&gt;&amp;nbsp;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="text-justify: inter-ideograph; line-height: normal; text-indent: 0pt; margin: 0cm 0cm 0pt; word-break: normal"  align="justify"&gt;&lt;strong style="mso-bidi-font-weight: normal"&gt;&lt;span style="line-height: normal; font-family: ; mso-ascii-font-family: calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: calibri; mso-hansi-theme-font: minor-latin"&gt;&lt;font face="宋体"&gt;&lt;font style="font-size: 10.5pt" color="#000000"&gt;总结&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;span style="line-height: normal" lang="EN-US"&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p style="text-justify: inter-ideograph; line-height: normal; text-indent: 0pt; margin: 0cm 0cm 0pt; word-break: normal"  align="justify"&gt;&lt;font color="#000000"&gt;&lt;span style="line-height: normal; font-family: ; mso-ascii-font-family: calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: calibri; mso-hansi-theme-font: minor-latin"&gt;&lt;font face="宋体"&gt;&lt;font style="font-size: 10.5pt"&gt;以上对技术的实现方案做了一个大体的总结，不是很全但应该可以覆盖大多数需求了。其实比较难的还是做&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;font style="font-size: 10.5pt"&gt;&lt;span style="line-height: normal" lang="EN-US"&gt;&lt;font face="Calibri"&gt;Solution&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;span style="line-height: normal; font-family: ; mso-ascii-font-family: calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: calibri; mso-hansi-theme-font: minor-latin"&gt;&lt;font face="宋体"&gt;&lt;font style="font-size: 10.5pt"&gt;，就是跟客户说为什么用微软的产品而不是其它产品，本文涉及技术架构的方面比较多。诚然微软在这方面的各方面资源都要欠缺很多，但这些微软已经在不断的做改善，而且目前的产品已经相对成熟。&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/aspnetx/aggbug/2268886.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/aspnetx/archive/2011/11/30/2268886.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/aspnetx/archive/2011/11/02/2233744.html</id><title type="text">[翻译]WP7 QuickStart-第十一篇-在后台运行程序（墓碑效应）</title><summary type="text">【译者注:这篇文章是翻译自微软官方的WP7 QuickStart的第十一篇，讲述WP下的程序的墓碑效应。部分内容加入了自己的理解和表达习惯。而翻译此系列的主要目的一是为了练习英语，二是让自己作为一个 BI开发者对WP7的开发有一个了解。部分翻译不当的地方望各位高人指出批评指正】</summary><published>2011-11-02T15:26:00Z</published><updated>2011-11-02T15:26:00Z</updated><author><name>哥本哈士奇(aspnetx)</name><uri>http://www.cnblogs.com/aspnetx/</uri></author><link rel="alternate" href="http://www.cnblogs.com/aspnetx/archive/2011/11/02/2233744.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/aspnetx/archive/2011/11/02/2233744.html"/><content type="html">&lt;p&gt;&lt;/p&gt;&lt;p&gt;【译者注:这篇文章是翻译自微软官方的WP7 QuickStart的第十一篇，讲述WP下的程序的墓碑效应。部分内容加入了自己的理解和表达习惯。而翻译此系列的主要目的一是为了练习英语，二是让自己作为一个 BI开发者对WP7的开发有一个了解。部分翻译不当的地方望各位高人指出批评指正】  &lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;【译者注：Tombstoning，早先在电路行业有使用，译为&lt;strong&gt;&lt;u&gt;墓碑效应&lt;/u&gt;&lt;/strong&gt;，即&lt;em&gt;小型片状&lt;/em&gt;&lt;em&gt;(&lt;/em&gt;&lt;em&gt;如电阻器或电容器的)&lt;/em&gt;&lt;em&gt;表面贴装器件，因其两端的金属封头与板面焊盘之间在可焊性或焊锡力量上可能有差异存在，经过红外线或热风熔焊后，偶尔会出现一端焊牢而另一端被拉起的浮开现象，称为墓碑效应或吊桥效应(drawbridging effect) &lt;/em&gt;&lt;em&gt;、曼哈顿效应(Manhattan effect) &lt;/em&gt;&lt;em&gt;等&lt;/em&gt;。 &lt;/p&gt;&lt;p&gt;这里为了避开我们语言中比较忌讳的译法，所以遵从这种翻译方式。】 &lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Windows Phone操作系统一次只允许一个应用程序运行。当用户从一个程序导航到另个一个程序时，操作系统会终止程序。为了提供给用户更好的体验，操作系统提供了当程序被重新激活时帮助你恢复程序到之前的展现状态。此篇将描述墓碑效应的过程，应用程序生命周期以及如何恢复状态。 &lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;其中主要包含以下部分： &lt;/p&gt;&lt;p&gt;墓碑效应概览 &lt;/p&gt;&lt;p&gt;应用程序生命周期 &lt;/p&gt;&lt;p&gt;应用程序状态 &lt;/p&gt;&lt;p&gt;页面状态 &lt;/p&gt;&lt;p&gt;最佳实践 &lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;墓碑效应概览&lt;/strong&gt; &lt;/p&gt;&lt;p&gt;Windows Phone操作系统不允许任何第三方程序在后台运行，也就是说，一次只能运行一个程序。这样做的原因是保持电池的使用时间并且确保用户界面的连贯和快速响应。【译者注：关于这点，你怎么理解都可以，但相信微软下一个版本会解决这个问题】当用户从程序导航到另外一个程序，Windows Phone反激活程序，这就是墓碑效用。它是一个操作系统当用户导航到其它程序时反激活程序的一个过程。在下列情况下程序会被反激活： &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;当墓碑效应中的程序重新激活，它必须看上去跟墓碑效应之前的一模一样，这样会给用户一个比较好的体验。理想状况下，用户不应该感觉到这是一个从墓碑效应中重新被激活的一个全新的过程。比如，设想你打开了一个很长的页面，并且已经向下滚动阅读了很多的内容，然后你导航到了另外一个页面，当你从这个页面返回的时候，先前滚动到的位置消失，而且回到了页面的顶端，这是多么闹心的事。另一方面，当你在填写一个内容很多的表单，你明显不希望看到你遭遇了一个小错误而所有的填写的内容全部丢失。 &lt;/p&gt;&lt;p&gt;为了解决这种情况，当程序被反激活后，操作系统维护了一些关于程序在内存中的状态信息，用这个信息就可以在程序被重新激活的时候被恢复呈现状态。 &lt;/p&gt;&lt;p&gt;Windows Phone提供了一些方法和事件来恢复程序和页面状态信息。此篇主要描述这些方法和事件。 &lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;应用程序生命周期&lt;/strong&gt; &lt;/p&gt;&lt;p&gt;因为Windows Phone程序可以被墓碑效应化，所以你需要理解一下程序的生存周期。操作系统提供了四个事件代表程序在生命周期中的状态。在程序中可以采取适当的操作，这些事件是Launching,Closing,Deactivated和Activated，下图显示这四个事件的发生。 &lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/aspnetx/201111/201111022325158516.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="clip_image001" alt="clip_image001" src="http://images.cnblogs.com/cnblogs_com/aspnetx/201111/201111022325167861.png" border="0" height="244" width="178" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;&lt;u&gt;Launching-&lt;/u&gt;&lt;u&gt;开始运行&lt;/u&gt; &lt;/p&gt;&lt;p&gt;当程序从开始屏幕被启动后，就可以说其被（Launched）执行了。不管用户什么时候运行的程序，一个新的实例都将被创建。当程序被启动之后，Launching事件就被出发了。下面的代码是App.xaml.cs文件的Launching事件部分。 &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;// Code to execute when the application is launching (eg, from Start)&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;// This code will not execute when the application is reactivated&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;private void Application_Launching(object sender, LaunchingEventArgs e)&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;{&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;}&lt;/font&gt; &lt;/p&gt;&lt;p&gt;你可以在这个事件中增量地保存一些设置以及其它持久化的数据来降低当程序的状态更改时需要保存的数据量。这是可选的，假如程序的持久化信息比较少，这个是不必要的。 &lt;/p&gt;&lt;p&gt;&lt;u&gt;Closing-&lt;/u&gt;&lt;u&gt;关闭&lt;/u&gt; &lt;/p&gt;&lt;p&gt;单击设备的后退按钮后，导航模型允许用户返回，或者导航到程序的前一个页面，甚至跨程序回退。然而，一旦用户进入到程序的第一个页面，按后退按钮会触发Closing事件并且终止程序。可以在这个事件里保存持久化数据到独立村粗中。下面是App.xaml.cs中的Closing事件代码部分。 &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;// Code to execute when the application is closing (eg, user hit Back)&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;// This code will not execute when the application is deactivated&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;private void Application_Closing(object sender, ClosingEventArgs e)&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;{&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;}&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;u&gt;反激活&lt;/u&gt; &lt;/p&gt;&lt;p&gt;当另一个程序在前端运行的时候，当前的程序可以被反激活（非关闭），比如有来电呼入，或者用户点击了开始按钮。在这种情况下，Deactivated事件就被触发了。下面的代码是App.xaml.cs文件中Deactivated事件部分。 &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;// Code to execute when the application is deactivated (sent to background)&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;// This code will not execute when the application is closing&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;private void Application_Deactivated(object sender, DeactivatedEventArgs e)&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;{&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;}&lt;/font&gt; &lt;/p&gt;&lt;p&gt;不同于程序的关闭，反激活会使程序进入到墓碑效应阶段。也就是说虽然不在运行了，但是操作系统保留了程序的一个记录，促出程序的一系列状态信息。用户很有可能会返回到墓碑效应阶段的程序，也就是重新激活。所以，你需要存在Deactivated事件处理代码中用PhoneApplicationService.State属性储程序当前的信息。存储的数据是短期的状态数据，也就是说，是会帮助程序重新建立在其被反激活之前的状态。由于墓碑效应化的程序也不一定会被重新激活，所以你应该也将程序的持久信息保存到独立存储中。所有的这些在Deactivated事件中的操作必须在10秒之内完成，否则操作系统会终止程序。所以当你的程序有大量的持久化数据的时候，最好是在程序运行的时候就保存些增量。 &lt;/p&gt;&lt;p&gt;程序不被墓碑效应而反激活也是有可能的，比如用户按开始按钮然后又快速连续地按了后退按钮。因为这个原因，最好不在Deactivated事件处理代码中做任何销毁性的操作。程序会在Deactivated事件处理完毕后，不调用Activated而继续运行。 &lt;/p&gt;&lt;p&gt;&lt;u&gt;Activated&lt;/u&gt; &lt;/p&gt;&lt;p&gt;当程序被反激活和墓碑效应化之后，用户可以通过单击后退按钮返回到程序。当用户回到墓碑效应化的程序后，程序会被重新激活并且触发Activated事件。可以用这个事件从PhoneApplicationService.State属性中读取在反激活时用户界面的值。下面代码是App.xaml.cs中Activated事件部分。 &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;// Code to execute when the application is activated (brought to foreground)&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;// This code will not execute when the application is first launched&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;private void Application_Activated(object sender, ActivatedEventArgs e)&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;{&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;}&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;应用程序状态&lt;/strong&gt; &lt;/p&gt;&lt;p&gt;应用程序状态是程序的状态而不是某个特定页面的状态。如果你用到了全局数据，比如登录信息或者程序的设置信息，是在程序中很多页面中都被用到的。这着被认为是应用程序部分的状态信息。当程序从墓碑效应中被重新激活后，如果你不特意存一下的话，这些数据会丢失。通常使用Launching,Closing,Deactivated和Activated事件来初始化和维护应用程序状态。当程序被墓碑效应化后，操作系统将内容通过PhoneApplicationService.State属性保存。可以存储应用程序级别的状态信息在Deactivated事件的PhoneApplicationService.State属性中，然后在Activated事件中通过PhoneApplicationService.State处理数据。 &lt;/p&gt;&lt;p&gt;如果程序有持久化数据，可以考虑将数据存入到独立存储中。独立存储是一个独立沙箱，位于设备上的文件存储位置，类似于桌面文件系统。数据存储到独立存储中会话费一些时间来读取，所以你应该仅把需要长时间存储到设备中的数据和不可被序列化的对象。此外，需要仔细考虑在哪里使用独立存储代码以最小化延迟的压缩。比如，程序有很多数据需要存储，在程序退出时应该避免一次存入大量数据，而是以增量的方式存入。通常，应该在其可用前尽快或者尽早地将其存入独立存储区域。 &lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;页面状态&lt;/strong&gt; &lt;/p&gt;&lt;p&gt;页面状态是程序中页面的视觉状态。当用户按后退按钮返回到已经被墓碑效应的程序时，Windows Phone操作系统会自动显示程序中用户上次浏览的页面。然而，需要确保页面的状态被保存或恢复到用户导航到其它程序之前的样子。页面状态包括比如文本框的文本以及滚动条的位置。这部分主要描述如何保存和恢复页面状态以提供更好的用户体验。 &lt;/p&gt;&lt;p&gt;保存和恢复页面信息，会用到页面的构造函数，OnVavigatedTo方法和OnVavigatedFrom方法。页面的构造函数当页面第一次被导航到的时候调用。OnNavigatedTo在每次程序或者页面完成加载并且可用时被调用。OnNavigatedFrom在程序和页面还没有被反加载时从当前页面导航到另外的页面的时候被调用。你可以在页面的构造函数里初始化页面级的信息，并且在OnNavigated方法中恢复页面状态，在OnNavigatedFrom中存储页面的状态信息。 &lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/aspnetx/201111/201111022325226187.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="clip_image002" alt="clip_image002" src="http://images.cnblogs.com/cnblogs_com/aspnetx/201111/201111022325238039.png" border="0" height="171" width="244" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;保存和恢复页面信息，通常要遵循如下几步： &lt;/p&gt;&lt;p&gt;1. 填加一个布尔类型的变量到页面（比如newPageInstance），设置成false。这个变量将用来判定UI状态是否需要恢复。 &lt;/p&gt;&lt;p&gt;2. 在页面的构造函数中，设置这个页面级的变量为true。页面的构造函数会在页面在程序实例中第一次被创建或者页面从程序的墓碑效应化中被重新激活时被调用。页面的构造函数不会在同一个程序中点击后退的时候调用，因为这个页已经在内存中存在了。 &lt;/p&gt;&lt;p&gt;3. 重写并且实现OnNavigatedTo方法。在这个方法中，从PhoneApplicationPage.State属性恢复页面级状态数据。 &lt;/p&gt;&lt;p&gt;4. 重写并且实现OnNavigatedFrom方法。在这个方法中，存储恢复页面级状态数据到PhoneApplicationPage.State属性中。 &lt;/p&gt;&lt;p&gt;下面的示例包含两个页面，Home和Second页面。当单击Home页面的Go to the Second Page按钮的时候，程序导航到Second页面。第二个页面有一个文本框，两个单选按钮和一个复选框。如果在Second页面的这些字段中输入一些数据然后按下开始按钮退出程序，程序进入到墓碑效应状态。此时通过后退按钮导航回到Second页面，可以看到先前输入的数据已经恢复到界面上了。 &lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/aspnetx/201111/201111022325284164.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="clip_image003" alt="clip_image003" src="http://images.cnblogs.com/cnblogs_com/aspnetx/201111/201111022325326177.png" border="0" height="101" width="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/aspnetx/201111/201111022325354833.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="clip_image004" alt="clip_image004" src="http://images.cnblogs.com/cnblogs_com/aspnetx/201111/201111022325369402.png" border="0" height="99" width="244" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;在Seond页面中加入下面的代码实现页面状态的保存和恢复。 &lt;/p&gt;&lt;p&gt;C# &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;public partial class SecondPage : PhoneApplicationPage&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;{&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;bool newPageInstance = false;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;public SecondPage()&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;{&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;InitializeComponent();&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;newPageInstance = true;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;}&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;{&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;if (State.ContainsKey("textbox") &amp;amp;&amp;amp; newPageInstance == true)&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;{&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;MyTB.Text = (string)State["textbox"];&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;MyRB1.IsChecked = (bool?)State["radiobutton1"];&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;MyRB2.IsChecked = (bool?)State["radiobutton2"];&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;MyCB.IsChecked = (bool?)State["checkbox"];&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;}&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;base.OnNavigatedTo(e);&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;}&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;protected override void OnNavigatedFrom(System.Windows.Navigation.NavigationEventArgs e)&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;{&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;newPageInstance = false;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;State["textbox"] = MyTB.Text;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;State["radiobutton1"] = MyRB1.IsChecked;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;State["radiobutton2"] = MyRB2.IsChecked;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;State["checkbox"] = MyCB.IsChecked;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;base.OnNavigatedFrom(e);&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;}&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;}&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;最佳实践&lt;/strong&gt; &lt;/p&gt;&lt;p&gt;下面是在开发Windows Phone程序时可以遵循的一些最佳实践： &lt;/p&gt;&lt;p&gt;1. 当程序无论从Tile或者应用程序列表中运行的时候，页面都应该被定位到一直的根体验节点【译者注：初始页？】。应该让用户很明确是在体验一个程序的新实例。 &lt;/p&gt;&lt;p&gt;2. 当用户从墓碑状态中激活时，用户所看到的界面应该和界面被反激活时所看到的界面一致，而不应该使用户明显感觉到程序是被终止并且重新启动的。 &lt;/p&gt;&lt;p&gt;3. 当程序被墓碑化后，用户也许不会直接返回到程序。这样，就需要在Deactivated事件处理和Closing事件处理中将持久化状态存入到独立存储中。为了避免代码重复，可以创建一个单独的方法来保存这些信息到独立存储然后在这两个事件处理代码中对其进行调用。 &lt;/p&gt;&lt;p&gt;4. 在Deactivated事件处理代码中的所有操作应都在10秒内完成。超过10秒的会被操作系统强行终止，并且通过后退按钮也是无法返回的。所以建议在开发程序的时候关注较简洁的窗体。如果程序确实需要超过几秒才能存储完成的信息，那么最好是在程序运行的时候就把他们增量地存入到独立存储区域中。  &lt;/p&gt;&lt;img src="http://www.cnblogs.com/aspnetx/aggbug/2233744.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/aspnetx/archive/2011/11/02/2233744.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/aspnetx/archive/2011/11/01/2232308.html</id><title type="text">[翻译]WP7 QuickStart-第十篇-页面导航</title><summary type="text">【译者注:这篇文章是翻译自微软官方的WP7 QuickStart的第十篇，讲述WP下的页面导航。部分内容加入了自己的理解和表达习惯。而翻译此系列的主要目的一是为了练习英语，二是让自己作为一个 BI开发者对WP7的开发有一个了解。部分翻译不当的地方望各位高人指出批评指正】</summary><published>2011-11-01T15:17:00Z</published><updated>2011-11-01T15:17:00Z</updated><author><name>哥本哈士奇(aspnetx)</name><uri>http://www.cnblogs.com/aspnetx/</uri></author><link rel="alternate" href="http://www.cnblogs.com/aspnetx/archive/2011/11/01/2232308.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/aspnetx/archive/2011/11/01/2232308.html"/><content type="html">&lt;p&gt;&lt;/p&gt;&lt;p&gt;原文地址：&lt;a href="http://create.msdn.com/en-US/education/quickstarts/Navigation"&gt;http://create.msdn.com/en-US/education/quickstarts/Navigation&lt;/a&gt; &lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;【译者注:这篇文章是翻译自微软官方的WP7 QuickStart的第十篇，讲述WP下的页面导航。部分内容加入了自己的理解和表达习惯。而翻译此系列的主要目的一是为了练习英语，二是让自己作为一个 BI开发者对WP7的开发有一个了解。部分翻译不当的地方望各位高人指出批评指正】  &lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Windows Phone下的导航可以定义为是允许用户在不同内容的页面之间的来回移动。这种导航模型使你能创建更符合Windows Phone的基于视图的应用程序。此篇主要描述在程序中如何在不同页面之间导航。 &lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;主要包括以下内容： &lt;/p&gt;&lt;p&gt;框架和页面 &lt;/p&gt;&lt;p&gt;页面导航 &lt;/p&gt;&lt;p&gt;数据的传递 &lt;/p&gt;&lt;p&gt;应用程序栏 &lt;/p&gt;&lt;p&gt;后退按钮 &lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;框架和页面&lt;/strong&gt; &lt;/p&gt;&lt;p&gt;在Windows Phone下的导航和传统中的Silverlight比较相似，但是它已经被扩展成搭载手机特殊功能的方式。这个导航模型基于PhoneApplicationFrame控件。这个控件包含用户可以导航的一个或者多个PhoneApplicationPage控件。 &lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/aspnetx/201111/201111012313336343.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="clip_image001" alt="clip_image001" src="http://images.cnblogs.com/cnblogs_com/aspnetx/201111/201111012313444315.png" border="0" height="244" width="226" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;页面是一个持续状态的集合，它可以视为一个包含内容或者链接到其它页面的链接的Silverlight页面。应用程序中也可以包含弹出页面，消息框，登录页面以及初始屏幕。 &lt;/p&gt;&lt;p&gt;只有两个页面之间的移动才被认为是Windows Phone的导航。从登录界面或者初始屏幕移动到主页面是不被认为是导航，而是转移【译者注：Transition】。 &lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;页面导航&lt;/strong&gt; &lt;/p&gt;&lt;p&gt;页面导航最简单的方式就是通过HyperlinkButton控件，其中的NavigationUri属性用来指定导航到哪个页面。下面的示例演示如何从一个页面导航到另一个叫SecondPage.xaml的页面。 &lt;/p&gt;&lt;p&gt;XAML &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;HyperlinkButton NavigateUri="SecondPage.xaml" /&amp;gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;如果不想使用HyperlinkButton，可以使用NavigationService来实现导航。这个类包含一些属性和方法以及事件来帮助你完成导航。其中的NavigationService.Navigate方法用来导航到一个指定的页面。从一个页面导航到另一个页面，遵循下面的步骤。 &lt;/p&gt;&lt;p&gt;1. 在Visual Studio里创建一个Windows Phone应用程序。 &lt;/p&gt;&lt;p&gt;2. 填加一个Windows Phone纵向页面，名称为SecondPage.xaml，主页面MainPage将导航到这个页面。 &lt;/p&gt;&lt;p&gt;3. 使用NavigationService.Navigate方法导航到SecondPage.xaml。 &lt;/p&gt;&lt;p&gt;4. 使用NavigationService.GoBack方法返回到MainPage.xaml &lt;/p&gt;&lt;p&gt;下面的示例创建两个页面，名称为Home页和Second页。你可以在Home页面单击&amp;#8220;Go to the second page&amp;#8221;按钮跳转到Second页面。这就是用到了在按钮的单击事件处理中调用NavigationService.Navigate方法以及Second页面的URL信息实现的。在Second页面中也可以单击&amp;#8220;Go back to Main Page&amp;#8221;按钮返回到Home页面，这里调用的是NavigationService.GoBack方法。这个方法将后退到最近的一个页面，在这个示例里就是Home页面。在这个方法被调用之前，需要通过NavigationService.CanGoBack属性判定下是否存在回退到的页面。 &lt;/p&gt;&lt;p&gt;提示： &lt;/p&gt;&lt;p&gt;尽管这个示例中用到的是NavigationService.GoBack方法，点击设备上的后退按钮一样也是可以导航到前一个页面的。 &lt;/p&gt;&lt;p&gt;MainPage.xaml &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;Grid x:Name="LayoutRoot" Background="Transparent"&amp;gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;Grid.RowDefinitions&amp;gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;RowDefinition Height="Auto"/&amp;gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;RowDefinition Height="*"/&amp;gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;/Grid.RowDefinitions&amp;gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;!--TitlePanel contains the name of the application and page title--&amp;gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;StackPanel x:Name="TitlePanel" Grid.Row="0"&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;Margin="12,17,0,28"&amp;gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;TextBlock x:Name="ApplicationTitle" Text="Navigation"&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;Style="{StaticResource PhoneTextNormalStyle}"/&amp;gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;TextBlock x:Name="PageTitle" Text="home page"&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;Margin="9,-7,0,0" Style="{StaticResource PhoneTextTitle1Style}"/&amp;gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;/StackPanel&amp;gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;!--ContentPanel - place additional content here--&amp;gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0"&amp;gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;Button x:Name="MyButton" Height="100" Width="350"&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;Click="MyButton_Click" Content="Go to Second Page"/&amp;gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;/Grid&amp;gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;/Grid&amp;gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;MainPage.xaml.cs &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;private void MyButton_Click(object sender, RoutedEventArgs e)&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;{&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;NavigationService.Navigate(new Uri("/SecondPage.xaml",&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;UriKind.RelativeOrAbsolute));&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;}&lt;/font&gt; &lt;/p&gt;&lt;p&gt;SecondPage.xaml &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;Grid x:Name="LayoutRoot" Background="Transparent"&amp;gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;Grid.RowDefinitions&amp;gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;RowDefinition Height="Auto"/&amp;gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;RowDefinition Height="*"/&amp;gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;/Grid.RowDefinitions&amp;gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;!--TitlePanel contains the name of the application and page title--&amp;gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;StackPanel x:Name="TitlePanel" Grid.Row="0"&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;Margin="12,17,0,28"&amp;gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;TextBlock x:Name="ApplicationTitle" Text="Navigation"&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;Style="{StaticResource PhoneTextNormalStyle}"/&amp;gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;TextBlock x:Name="PageTitle" Text="second page"&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;Margin="9,-7,0,0" Style="{StaticResource PhoneTextTitle1Style}"/&amp;gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;/StackPanel&amp;gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;!--ContentPanel - place additional content here--&amp;gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0"&amp;gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;Button x:Name="BtnBack" Content="Go Back to Home Page"&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;Click="BtnBack_Click" Height="100" Width="350"/&amp;gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;/Grid&amp;gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;/Grid&amp;gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;SecondPage.xaml.cs &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;private void BtnBack_Click(object sender, RoutedEventArgs e)&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;{&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;if (NavigationService.CanGoBack)&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;NavigationService.GoBack();&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;}&lt;/font&gt; &lt;/p&gt;&lt;p&gt;下图显示了Home页和Second页的效果。它们之间的导航就是通过NavigationServie.Navigate和NavigationService.GoBack方法实现的。 &lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/aspnetx/201111/201111012313549388.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="clip_image002" alt="clip_image002" src="http://images.cnblogs.com/cnblogs_com/aspnetx/201111/201111012314042791.png" border="0" height="219" width="244" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;数据的传递&lt;/strong&gt; &lt;/p&gt;&lt;p&gt;通常，你会希望从一个页面到另一个页面导航的过程中传递一些参数。比如，在Home页中输入一些文本，然后显示在Second页上。这就可以通过NavigationService.Navigate方法，把参数放到被导航页面的后面。也可以重写SecondPage.xaml.cs的Page.OnNavigatedTo方法检查页面的导航请求以及传递的参数。下面具体演示下如何用VavigationService.Navigate和Page.OnNavigatedTo方法在页面之间传递参数。 &lt;/p&gt;&lt;p&gt;MainPage.xaml &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;Grid x:Name="LayoutRoot" Background="Transparent"&amp;gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;Grid.RowDefinitions&amp;gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;RowDefinition Height="Auto"/&amp;gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;RowDefinition Height="*"/&amp;gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;/Grid.RowDefinitions&amp;gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;!--TitlePanel contains the name of the application and page title--&amp;gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;StackPanel x:Name="TitlePanel" Grid.Row="0"&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;Margin="12,17,0,28"&amp;gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;TextBlock x:Name="ApplicationTitle" Text="Navigation"&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;Style="{StaticResource PhoneTextNormalStyle}"/&amp;gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;TextBlock x:Name="PageTitle" Text="home page"&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;Margin="9,-7,0,0" Style="{StaticResource PhoneTextTitle1Style}"/&amp;gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;/StackPanel&amp;gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;!--ContentPanel - place additional content here--&amp;gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;StackPanel x:Name="ContentPanel" Grid.Row="1"&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;Margin="12,0,12,0"&amp;gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;TextBox x:Name="MyTB" Height="80"&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;Width="350" /&amp;gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;Button x:Name="MyButton" Content="Go to Second Page"&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;Height="80" Width="350" Click="MyButton_Click"/&amp;gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;/StackPanel&amp;gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;/Grid&amp;gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;MainPage.xaml.cs &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;private void MyButton_Click(object sender, RoutedEventArgs e)&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;{&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;NavigationService.Navigate(new Uri("/SecondPage.xaml?msg=" +&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;MyTB.Text, UriKind.RelativeOrAbsolute));&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;}&lt;/font&gt; &lt;/p&gt;&lt;p&gt;SecondPage.xaml &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;Grid x:Name="LayoutRoot" Background="Transparent"&amp;gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;Grid.RowDefinitions&amp;gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;RowDefinition Height="Auto"/&amp;gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;RowDefinition Height="*"/&amp;gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;/Grid.RowDefinitions&amp;gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;!--TitlePanel contains the name of the application and page title--&amp;gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;StackPanel x:Name="TitlePanel" Grid.Row="0"&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;Margin="12,17,0,28"&amp;gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;TextBlock x:Name="ApplicationTitle" Text="Navigation"&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;Style="{StaticResource PhoneTextNormalStyle}"/&amp;gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;TextBlock x:Name="PageTitle" Text="second page"&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;Margin="9,-7,0,0" Style="{StaticResource PhoneTextTitle1Style}"/&amp;gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;/StackPanel&amp;gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;!--ContentPanel - place additional content here--&amp;gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0"&amp;gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;TextBlock x:Name="MyTBl" FontSize="25"/&amp;gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;/Grid&amp;gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;/Grid&amp;gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;SecondPage.xaml.cs &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;protected override void OnNavigatedTo&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;(System.Windows.Navigation.NavigationEventArgs e)&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;{&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;base.OnNavigatedTo(e);&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;string msg = "";&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;if (NavigationContext.QueryString.TryGetValue("msg", out msg))&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;MyTBl.Text = msg;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;}&lt;/font&gt; &lt;/p&gt;&lt;p&gt;运行的效果如下图，在Home页面输入的文本会显示在Second页面。 &lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/aspnetx/201111/201111012314275364.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="clip_image003" alt="clip_image003" src="http://images.cnblogs.com/cnblogs_com/aspnetx/201111/201111012314292101.png" border="0" height="219" width="244" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;应用程序栏&lt;/strong&gt; &lt;/p&gt;&lt;p&gt;应用程序栏是一组单个或者四个的按钮，它们在竖屏模式中显示在屏幕的底端，在横屏模式中显示在屏幕的边缘。这就是Windows Phone 下的菜单系统，在应用程序栏下的按钮为用户提供经常被使用到的一些功能。 &lt;/p&gt;&lt;p&gt;下图演示的是Windows Phone 应用程序栏的展开模式。 &lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/aspnetx/201111/201111012314325883.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="clip_image004" alt="clip_image004" src="http://images.cnblogs.com/cnblogs_com/aspnetx/201111/201111012314537574.png" border="0" height="194" width="244" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;这些带图标的按钮最多只能有四个，超过四个的话在程序启动的时候会抛异常。在应用程序栏右上角的省略号用来展开或者关闭应用程序栏，图标按钮的文本只有当其展开的时候才会显示出来。可以用Click事件来处理这些图标按钮的单击事件。 &lt;/p&gt;&lt;p&gt;在这些按钮的下面，应用程序栏还可以包含一个或多个基于文本的菜单。这些菜单以列表的方式显示，当用户单击应用程序栏右上角的省略号或者图标按钮空白处的时候从屏幕的底部滑入。在上一个图中，About和Settings就是菜单项。菜单项不是横向排列的，所以其不是任何图标按钮的子菜单，相反，这里的菜单项应该是在应用程序中不太被用到的操作或者是那种用图标很难表示的功能必须需要文本描述的操作。 &lt;/p&gt;&lt;p&gt;下图是应用程序栏的展开和关闭的模式，以及有菜单项和没有菜单项的形式。 &lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/aspnetx/201111/20111101231525269.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="clip_image005" alt="clip_image005" src="http://images.cnblogs.com/cnblogs_com/aspnetx/201111/201111012315262122.png" border="0" height="135" width="244" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;在Windows Phone中可以通过ApplicationBar这个类以编程的方式填加应用程序栏，包括在XAML和代码中。如果以XAML的方式，在Windows Phone开发工具里的Windows Phone项目模版会在MainPage.xaml中包含一个应用程序栏的实现，你需要做的就是取消掉应用程序栏的注释然后根据你的需要去使用你自己的图标和菜单。 &lt;/p&gt;&lt;p&gt;下面演示用模版默认创建的修改过后的应用程序栏，其中有三个图标按钮，new,folder和sync以及两个菜单项setting和add email accound。 &lt;/p&gt;&lt;p&gt;XAML &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;phone:PhoneApplicationPage.ApplicationBar&amp;gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;shell:ApplicationBar IsVisible="True" IsMenuEnabled="True"&amp;gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;shell:ApplicationBarIconButton x:Name="newButton"&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;IconUri="/Images/appbar.new.rest.png" Text="new"&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;Click="newButton_Click"/&amp;gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;shell:ApplicationBarIconButton x:Name="folderButton"&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;IconUri="/Images/appbar.folder.rest.png" Text="folders"&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;Click="folderButton_Click"/&amp;gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;shell:ApplicationBarIconButton x:Name="syncButton"&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;IconUri="/Images/appbar.refresh.rest.png" Text="sync"&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;Click="syncButton_Click"/&amp;gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;shell:ApplicationBar.MenuItems&amp;gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;shell:ApplicationBarMenuItem Text="settings"/&amp;gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;shell:ApplicationBarMenuItem Text="add email account"/&amp;gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;/shell:ApplicationBar.MenuItems&amp;gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;/shell:ApplicationBar&amp;gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;/phone:PhoneApplicationPage.ApplicationBar&amp;gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;效果如下图： &lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/aspnetx/201111/20111101231531165.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="clip_image006" alt="clip_image006" src="http://images.cnblogs.com/cnblogs_com/aspnetx/201111/201111012315347360.png" border="0" height="244" width="136" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;注意这个示例里用到了图标按钮的图片。关于设计和创建应用程序栏的图片，以及如何定位到准备好的图片，参考&lt;a href="http://msdn.microsoft.com/en-us/library/ff431806%28VS.92%29.aspx"&gt;这里&lt;/a&gt;。 &lt;/p&gt;&lt;p&gt;应用程序栏不是Silverlight控件所以不支持数据邦定。这也就是说在XAML中的按钮标签必须手动去写并且不能被国际化。如果想实现国际化功能，可以在代码里创建应用程序栏，或者在运行时里用c#去更改标签值。 &lt;/p&gt;&lt;p&gt;下面的示例演示如何在代码中创建应用程序栏。首先用ApplicationBar类创建一个应用程序栏，然后通过ApplicationBarIconButton类创建图标按钮并且通过ApplicationBar.Buttons.Add方法加入到应用程序栏中。同时使用ApplicationBarMenuItem创建菜单项并且用ApplicationBar.MenuItems.Add方法填加到应用程序栏中。 &lt;/p&gt;&lt;p&gt;C# &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;public MainPage()&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;{&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;InitializeComponent();&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;//Create the ApplicationBar&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;ApplicationBar = new ApplicationBar();&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;ApplicationBar.IsVisible = true;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;ApplicationBar.IsMenuEnabled = true;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;//Create the icon buttons and setting its properties&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;ApplicationBarIconButton newButton = new ApplicationBarIconButton(new Uri&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;("/Images/appbar.add.rest.png", UriKind.Relative));&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;newButton.Text = "new";&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;newButton.Click += new EventHandler(newButton_Click);&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;ApplicationBarIconButton folderButton = new ApplicationBarIconButton(new Uri&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;("/Images/appbar.folder.rest.png", UriKind.Relative));&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;folderButton.Text = "folders";&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;folderButton.Click += new EventHandler(folderButton_Click);&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;ApplicationBarIconButton syncButton = new ApplicationBarIconButton(new Uri&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;("/Images/appbar.sync.rest.png", UriKind.Relative));&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;syncButton.Text = "sync";&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;syncButton.Click += new EventHandler(syncButton_Click);&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;//Add the icon buttons to the Application Bar&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;ApplicationBar.Buttons.Add(newButton);&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;ApplicationBar.Buttons.Add(folderButton);&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;ApplicationBar.Buttons.Add(syncButton);&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;//Create menu items&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;ApplicationBarMenuItem settingsMenuItem = new ApplicationBarMenuItem&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;("settings");&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;settingsMenuItem.Click += new EventHandler(settingsMenuItem_Click);&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;ApplicationBarMenuItem addaccountMenuItem = new ApplicationBarMenuItem&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;("add email account");&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;addaccountMenuItem.Click += new EventHandler(addaccountMenuItem_Click);&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;//Add the menu items to the Application Bar&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;ApplicationBar.MenuItems.Add(settingsMenuItem);&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;ApplicationBar.MenuItems.Add(addaccountMenuItem);&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;}&lt;/font&gt; &lt;/p&gt;&lt;p&gt;应用程序栏可以定义成本地的或者全局的。本地的应用程序栏只能在定义它的页面中使用。这对程序中不同的页面需要不同的应用程序栏来说是很有用的。比如，在程序中创建Email，主页面可能会有create new email和sync，撰写邮件页面可能会有send和delete。所以对两个页面定义不同的应用程序栏是很有必要的。 &lt;/p&gt;&lt;p&gt;全局的应用程序栏是一种可以被程序中的所有页面使用的。它定义在程序资源中的App.xaml文件中。创建全局的应用程序栏基本上按照以下步骤。 &lt;/p&gt;&lt;p&gt;1. 填加应用程序栏的XAML定义到App.xaml文件的&amp;lt;Application.Resources&amp;gt;节中。 &lt;/p&gt;&lt;p&gt;2. 填加下列属性到你需要使用此应用程序栏的每个页面中的&amp;lt;phone:PhoneApplicationPage&amp;gt;节点中： &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;ApplicationBar="{StaticResource GlobalAppMenuBar}"&lt;/font&gt; &lt;/p&gt;&lt;p&gt;应用程序栏的更多信息参考&lt;a href="http://msdn.microsoft.com/en-us/library/ff431801%28VS.92%29.aspx"&gt;这里&lt;/a&gt;。 &lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;后退按钮&lt;/strong&gt; &lt;/p&gt;&lt;p&gt;所有的Windows Phone都包含一个硬后退按钮。这个按钮允许用户导航到应用程序里的上一页面或者跨不同的应用程序。比如，可以在电子邮件程序里单击一个超链接来打开网页浏览器，然后点击了设备的后退按钮返回到邮件界面。这就是典型的不同程序切换的用户体验，不管是第三方应用还是Windows Phone内置的程序。Windows Phone就是通过这种日志维护的方式记录导航操作来支持后退按钮功能。 &lt;/p&gt;&lt;p&gt;下图显示的是设备上的后退按钮，开始按钮和搜索按钮。 &lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/aspnetx/201111/201111012315448812.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="clip_image007" alt="clip_image007" src="http://images.cnblogs.com/cnblogs_com/aspnetx/201111/201111012315456171.png" border="0" height="158" width="244" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;后退按钮可以被重写以自定义一些你想要的功能。然后，当你进行这个操作的时候，应该明确用户是如何理解这个后退的。比如，如果你在程序里显示了一个弹出消息，你也许在后退按钮中实现的是退出程序的方法，但用户想要的也许是关闭弹出消息框。 &lt;/p&gt;&lt;p&gt;重写后退按钮行为的是PhoneApplicationPage.OnBackKeyPress方法。 &lt;/p&gt;&lt;p&gt;下面的示例包含了一个文本框，如果你在文本框输入了内容并且点击设备上的后退按钮，一个消息会提示，&amp;#8220;You are about to discard your changes. Continue&amp;#8221;。这个行为就是通过重写PhoneAplicationPage.OnBackKeyPress方法实现的。 &lt;/p&gt;&lt;p&gt;C# &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;protected override void OnBackKeyPress(System.ComponentModel.CancelEventArgs e)&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;{&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;base.OnBackKeyPress(e);&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;if(MyTB.Text != string.Empty)&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;{&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;var result = MessageBox.Show("You are about to discard your changes. Continue?",&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;"Warning", MessageBoxButton.OKCancel);&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;if (result != MessageBoxResult.OK)&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;{&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;e.Cancel = true;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;}&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;}&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;}&lt;/font&gt; &lt;/p&gt;&lt;p&gt;运行结果如下图。当用户单击后退按钮时会有消息框显示。 &lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/aspnetx/201111/201111012315552639.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="clip_image008" alt="clip_image008" src="http://images.cnblogs.com/cnblogs_com/aspnetx/201111/201111012316275335.png" border="0" height="244" width="137" /&gt;&lt;/a&gt; &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. 对于一些使用时间比较短的界面，比如登录界面，尽量使用Silverlight的Popup控件显示内容，它只占屏幕的一部分而不是全部。可以在代码中填加PhoneApplicationPage.OnBackKeyPress方法并且设置e.Cancel为true，这样当popup显示的时候就可以通过后退按钮来关闭它。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/aspnetx/aggbug/2232308.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/aspnetx/archive/2011/11/01/2232308.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/aspnetx/archive/2011/10/31/2230861.html</id><title type="text">[翻译]WP7 QuickStart-第九篇-触控输入</title><summary type="text">【译者注:这篇文章是翻译自微软官方的WP7 QuickStart的第九篇，讲述WP下的触控输入。部分内容加入了自己的理解和表达习惯。而翻译此系列的主要目的一是为了练习英语，二是让自己作为一个 BI开发者对WP7的开发有一个了解。部分翻译不当的地方望各位高人指出批评指正】</summary><published>2011-10-31T15:08:00Z</published><updated>2011-10-31T15:08:00Z</updated><author><name>哥本哈士奇(aspnetx)</name><uri>http://www.cnblogs.com/aspnetx/</uri></author><link rel="alternate" href="http://www.cnblogs.com/aspnetx/archive/2011/10/31/2230861.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/aspnetx/archive/2011/10/31/2230861.html"/><content type="html">&lt;p&gt;&lt;/p&gt;&lt;p&gt;原文地址：&lt;a title="http://create.msdn.com/en-US/education/quickstarts/Touch_Input" href="http://create.msdn.com/en-US/education/quickstarts/Touch_Input"&gt;http://create.msdn.com/en-US/education/quickstarts/Touch_Input&lt;/a&gt;  &lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;【译者注:这篇文章是翻译自微软官方的WP7 QuickStart的第九篇，讲述WP下的触控输入。部分内容加入了自己的理解和表达习惯。而翻译此系列的主要目的一是为了练习英语，二是让自己作为一个 BI开发者对WP7的开发有一个了解。部分翻译不当的地方望各位高人指出批评指正】  &lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Windows Phone设备的屏幕都是支持多点触控的，允许用户多指同时操作实现不同的手势功能，比如单击，滑动和放大缩小。Windows Phone下的Silverlight有很多种不同的处理触控输入的方法。此篇描述触控输入的基础内容。  &lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;主要包含一下部分:  &lt;/p&gt;&lt;p&gt;触控输入介绍  &lt;/p&gt;&lt;p&gt;手势功能  &lt;/p&gt;&lt;p&gt;鼠标事件  &lt;/p&gt;&lt;p&gt;Manipulation（操纵）事件  &lt;/p&gt;&lt;p&gt;Windows Phone的Silverlight工具包  &lt;/p&gt;&lt;p&gt;UI设计与触控输入  &lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;留意：  &lt;/p&gt;&lt;p&gt;此篇包含一些实时演示，是通过浏览器中的Silverlight来模拟Windows Phone下Silverlight的效果。实际的操作可能会和模拟器中或者实际设备中的效果略有不同。  &lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;触控输入介绍&lt;/strong&gt;  &lt;/p&gt;&lt;p&gt;Windows Phone使用触控的方式完成大多数的输入操作，它支持多点触控让用户以手势操作的方式跟设备交互。填加触控和手势功能将会使程序的用户体验大大提高。在Windows Phone下的Silverlight 可以以很多种方式来处理触控操作。  &lt;/p&gt;&lt;p&gt;Silverlight下的鼠标事件可以用来检测一些简单的，单指点击或者双击。鼠标事件在代码中使用很方便和快捷，也是一种实现基本触控功能比较简单的方法。  &lt;/p&gt;&lt;p&gt;Manipulation事件，比如ManipulationStarted和ManipulationDelta，用来处理更加复杂的手势功能，比如多点触控时的手势功能和用到惯性和速度的手势功能。  &lt;/p&gt;&lt;p&gt;TouchPoint类是另外一种处理触控输入的方法。TouchPoint是一个低级别触控系统，此篇暂不对其进行描述。  &lt;/p&gt;&lt;p&gt;第四种方法就是使用Windows Phone下的Silverlight工具包的GestureService和GestureListner类。这个工具包是开源项目，不输入Windows Phone下Silverlight核心的一部分，但是有一些早期版本的控件已经加入到了后续版本的Silverlight中。  &lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;手势功能&lt;/strong&gt;  &lt;/p&gt;&lt;p&gt;手势功能是一种高级别的方式来把触控数据解释成一些基本的动作，比如点击，滑动和放大缩小。在Windows Phone通用的手势如下：  &lt;/p&gt;&lt;p&gt;Tab  &lt;/p&gt;&lt;p&gt;手指按下屏幕并抬起  &lt;/p&gt;&lt;p&gt;Double Tab  &lt;/p&gt;&lt;p&gt;手指敲击屏幕两次  &lt;/p&gt;&lt;p&gt;Hold  &lt;/p&gt;&lt;p&gt;手指在一个地方短时间的持续点击  &lt;/p&gt;&lt;p&gt;Drag  &lt;/p&gt;&lt;p&gt;手指按住屏幕并且向一个方向移动  &lt;/p&gt;&lt;p&gt;Flick  &lt;/p&gt;&lt;p&gt;手指的滑动操作  &lt;/p&gt;&lt;p&gt;Pinch  &lt;/p&gt;&lt;p&gt;两指在屏幕上的移动  &lt;/p&gt;&lt;p&gt;Windows Phone下的Silverlight鼠标事件，比如MouseLeftButtonUp和MouseMove可以用来支持一些最基本的单指操作，比如单击。  &lt;/p&gt;&lt;p&gt;对于一些多点触控的手势操作比如放大缩小，还有用到惯性和速度数据的手势比如滑动，就需要用到Manipulation事件，这个事件里提供的信息不是手势的相关信息，而是一些触控的数据，比如位置，和translation delta【译者注：位移增量？】以及速度。这些触控数据可以用来判定手势动作的种类。而开发人员需要做的就是将这些信息转换成等价手势功能。另外，Windows Phone的Silverlight工具包也通过GestureService和GestureListner两个类提供了对手势功能的支持。  &lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;鼠标事件&lt;/strong&gt;  &lt;/p&gt;&lt;p&gt;使用鼠标事件是实现Windows Phone下Silverlight触控功能最简单的一种方法。鼠标事件仅限于实现单指的手势操作比如单击和双击，但是不支持基于速度的手势功能。单指接触屏幕的时候被转换成了Silverlight的鼠标事件，比如当触控屏幕的时候是MouseLeftButtonDown，手指抬起的时候是MouseLeftButtonUp，手指在屏幕上移动是MouseMove。此外还有MouseLeave和MouseEnter。这些事件的参数是MouseButtonEventArgs。  &lt;/p&gt;&lt;p&gt;下面的示例演示如何使用MouseLeftButtonDown，MouseLeftButtonUp和MouseLeave事件处理矩形对象的单击操作。  &lt;/p&gt;&lt;p&gt;首先，在XAML中定义一个名称为TestRectangle的Rectangle矩形，以及MouseLeftButtonDown,MouseLeftButtonUp和MouseLeave的事件处理。  &lt;/p&gt;&lt;p&gt;XAML  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;Rectangle Name="TestRectangle"&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;Height="100"&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;Width="200"&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;Fill="Blue"&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;MouseLeftButtonDown="Tap_LeftButtonDown"&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;MouseLeftButtonUp="Tap_LeftButtonUp"&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;MouseLeave="Tap_MouseLeave" /&amp;gt;&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;下一步，事件处理代码被生成了。MouseLeftButtonDown里增加Rectangle的高度和宽度，MouseLeftButtonUp里恢复其高度和宽度到原先的值。最后，MouseLeave里也设置成对这两个属性值的恢复。  &lt;/p&gt;&lt;p&gt;C#  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;private void Tap_LeftButtonDown(object sender, MouseButtonEventArgs e)&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;{&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;Rectangle rect = sender as Rectangle;&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;// Change the size of the Rectangle.&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;if (null != rect)&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;{&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;rect.Width = 250;&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;rect.Height = 150;&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;}&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;}&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;private void Tap_LeftButtonUp(object sender, MouseButtonEventArgs e)&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;{&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;Rectangle rect = sender as Rectangle;&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;// Reset the dimensions on the Rectangle.&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;if (null != rect)&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;{&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;rect.Width = 200;&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;rect.Height = 100;&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;}&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;}&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;private void Tap_MouseLeave(object sender, MouseEventArgs e)&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;{&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;Rectangle rect = sender as Rectangle;&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;// Finger moved out of Rectangle before the mouse up event.&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;// Reset the dimensions on the Rectangle.&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;if (null != rect)&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;{&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;rect.Width = 200;&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;rect.Height = 100;&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;}&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;}&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;下面是实例效果。点击矩形区域看看运行的效果。  &lt;/p&gt;&lt;p&gt;&lt;object id="Object1" data="data:application/x-silverlight-2," type="application/x-silverlight-2" height="520" width="600"&gt; &lt;param name="source" value="http://create.msdn.com/assets/cms/docs/QuickstartsXAP/QuickStartsPhone_Input1.xap" /&gt;&lt;param name="onerror" value="onSilverlightError" /&gt;&lt;param name="background" value="Transparent" /&gt;&lt;param name="windowless" value="true" /&gt;&lt;a href="http://go.microsoft.com/fwlink/?LinkID=115261" style="text-decoration: none;"&gt; &lt;img src="http://go.microsoft.com/fwlink/?LinkId=108181" alt="Get Microsoft Silverlight" style="border-style: none" /&gt; &lt;/a&gt; &lt;/object&gt; &lt;/p&gt;&lt;p&gt;下面的示例演示如何用按钮的Click事件处理点击操作。  &lt;/p&gt;&lt;p&gt;首先，在XAML中创建一个按钮，以及其Click单击事件的处理方法。  &lt;/p&gt;&lt;p&gt;XAML  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;Button Name="TestButton"&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;Content="Tap"&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;Height="100" Width="200"&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;Click="TestButton_Click" /&amp;gt;&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;在Click事件处理代码中，内容在&amp;#8220;Tap&amp;#8221;和&amp;#8220;Tap Again!&amp;#8221;之间来回切换。文本在每次点击的时候都会变化。  &lt;/p&gt;&lt;p&gt;C#  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;private void TestButton_Click(object sender, RoutedEventArgs e)&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;{&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;Button button = sender as Button;&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;if (null != button)&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;{&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;// Toggle Button.Conten between "Tap" and "Tap Again!"&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;if (button.Content as string == "Tap")&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;{&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;button.Content = "Tap Again!";&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;}&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;else&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;{&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;button.Content = "Tap";&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;}&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;}&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;}&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;下面是实例效果。点击矩形区域看看运行的效果。  &lt;/p&gt;&lt;p&gt;&lt;object id="Object2" data="data:application/x-silverlight-2," type="application/x-silverlight-2" height="520" width="600"&gt; &lt;param name="source" value="http://create.msdn.com/assets/cms/docs/QuickstartsXAP/QuickStartsPhone_Input3.xap" /&gt;&lt;param name="onerror" value="onSilverlightError" /&gt;&lt;param name="background" value="Transparent" /&gt;&lt;param name="windowless" value="true" /&gt;&lt;a href="http://go.microsoft.com/fwlink/?LinkID=115261" style="text-decoration: none;"&gt; &lt;img src="http://go.microsoft.com/fwlink/?LinkId=108181" alt="Get Microsoft Silverlight" style="border-style: none" /&gt; &lt;/a&gt; &lt;/object&gt; &lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Manipulation事件&lt;/strong&gt;  &lt;/p&gt;&lt;p&gt;如果需要在程序中支持多指手势，或者包含速度数据的手势操作，那么就需要用到Manipulation事件。可以用Manipulation事件来捕获像滑动，拖拽，放大缩小以及按住屏幕的操作。下表列出了Manipulation事件类。  &lt;/p&gt;&lt;p&gt;ManipulationStarted Event  &lt;/p&gt;&lt;p&gt;在UIElement的操作开始的时候发生  &lt;/p&gt;&lt;p&gt;ManipulationDelta Event  &lt;/p&gt;&lt;p&gt;在操作的过程中位置发生变化的时候发生  &lt;/p&gt;&lt;p&gt;ManipulationCompleted Event  &lt;/p&gt;&lt;p&gt;当操作和加速度完成的时候发生  &lt;/p&gt;&lt;p&gt;ManipulationStartedEventArgs  &lt;/p&gt;&lt;p&gt;为ManipulationStarted事件提供数据  &lt;/p&gt;&lt;p&gt;ManipulationDeltaEventArgs  &lt;/p&gt;&lt;p&gt;为ManipulationDelta事件提供数据  &lt;/p&gt;&lt;p&gt;ManipulationVelocities  &lt;/p&gt;&lt;p&gt;在操作发生的时候描述速度数据  &lt;/p&gt;&lt;p&gt;ManipulationCompleteEventArgs  &lt;/p&gt;&lt;p&gt;为ManipulationCompleted事件提供数据  &lt;/p&gt;&lt;p&gt;在Windows Phone的Silverlight下手势事件是由一系列的Manipulation事件组成。每个手势均由ManipulationStarted事件开始，包括用户开始触摸屏幕，然后，一个或更多的ManipulationDelta事件被触发。比如，当你触摸屏幕并且在屏幕上来回移动的时候，若干ManipulationDelta事件就被触发了。最终，手势操作以ManipulationCompleted事件的触发结束。  &lt;/p&gt;&lt;p&gt;如果你使用Windows Phone模拟器来测试Manipulation事件代码并且没有触摸屏的话，测试将要受到限制。模拟器是不支持鼠标的多点触控的。不过可以对偏移进行测试，下面是该实例的演示。  &lt;/p&gt;&lt;p&gt;首先，在XAML中创建一个高度和宽度全部为200，名称为TestRectangle的Rectangle。  &lt;/p&gt;&lt;p&gt;XAML  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;Rectangle Name="TestRectangle"&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;Width="200"&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;Height="200"&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;Fill="Blue" /&amp;gt;&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;然后，为Rectangle创建一个全局的TranslateTransform，名称为dragTranslation，并且为其填加ManipulationDelta事件的处理代码。dragTranslation被填加到了Rectangle的RenderTransform的部分。最后，在ManipulationDelta的事件处理代码中，Rectangle的位置是通过DeltaManipulation属性的TranslateTransform实时更新的。  &lt;/p&gt;&lt;p&gt;C#  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;// Global Transform used to change the position of the Rectangle.&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;private TranslateTransform dragTranslation;&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;// Constructor&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;public MainPage()&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;{&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;InitializeComponent();&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;// Add handler for the ManipulationDelta event&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;TestRectangle.ManipulationDelta +=&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;new EventHandler&amp;lt;ManipulationDeltaEventArgs&amp;gt;(Drag_ManipulationDelta);&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;dragTranslation = new TranslateTransform();&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;TestRectangle.RenderTransform = this.dragTranslation;&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;}&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;void Drag_ManipulationDelta(object sender, ManipulationDeltaEventArgs e)&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;{&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;// Move the rectangle.&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;dragTranslation.X += e.DeltaManipulation.Translation.X;&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;dragTranslation.Y += e.DeltaManipulation.Translation.Y;&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;}&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;下图是运行效果，注，不是在线示例。  &lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/aspnetx/201110/201110312307589549.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="clip_image001" alt="clip_image001" src="http://images.cnblogs.com/cnblogs_com/aspnetx/201110/201110312308033166.png" border="0" height="244" width="136" /&gt;&lt;/a&gt;  &lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Windows Phone下的Silverlight工具包&lt;/strong&gt;  &lt;/p&gt;&lt;p&gt;Windows Phone下的Silverlight工具包是一个开源的项目，微软的Silverlight团队分享了新的组件和方法在里面。这个工具包里包含了大量的手势功能框架，他们主要是通过GestureService和GestureListener两个类来捕捉特定的手势。这些类可以大大的简化Silverlight程序中手势的使用。  &lt;/p&gt;&lt;p&gt;要用到这些接口，需要在&lt;a href="http://silverlight.codeplex.com/"&gt;这里&lt;/a&gt;下载并安装。其中&lt;a href="http://silverlight.codeplex.com/releases"&gt;这个页面&lt;/a&gt;里有对当前发布版本的描述。  &lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;UI设计和触控输入&lt;/strong&gt;  &lt;/p&gt;&lt;p&gt;如何设计用户界面可以影响到在程序中使用触控功能的容易程度。&lt;a href="http://msdn.microsoft.com/en-us/library/hh202915%28VS.92%29.aspx"&gt;这里&lt;/a&gt;有一些在程序中使用触控输入的最佳实践，非常值得阅读，不过这里也要强调一些触控和UI设计：  &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. 触控目标不应该小于9毫米或者34像素。  &lt;/p&gt;&lt;p&gt;6. 在可触控的控件之间应该保留2毫米或者8像素的间距。  &lt;/p&gt;&lt;p&gt;7. 在极少数需要控件很小的情况下，也不要创建小玉7毫米或者26像素的控件。  &lt;/p&gt;&lt;p&gt;8. 经常需要被用到的控件，需要考虑将其设计成大于9毫米。  &lt;/p&gt;&lt;p&gt;9. 触控的目标区域应该比控件本身大，不应该比其更小。  &lt;/p&gt;&lt;p&gt;10. 控件不应该小于其触控区域的60%。  &lt;/p&gt;&lt;p&gt;11. 纵向排列的矩形或者原型元素更容易被点击到。   &lt;/p&gt;&lt;img src="http://www.cnblogs.com/aspnetx/aggbug/2230861.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/aspnetx/archive/2011/10/31/2230861.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/aspnetx/archive/2011/10/30/2229519.html</id><title type="text">[翻译]WP7 QuickStart-第八篇-屏幕方向</title><summary type="text">【译者注:这篇文章是翻译自微软官方的WP7 QuickStart的第八篇，讲述WP下的处理横屏和纵屏切换的技巧。部分内容加入了自己的理解和表达习惯。而翻译此系列的主要目的一是为了练习英语，二是让自己作为一个 BI开发者对WP7的开发有一个了解。部分翻译不当的地方望各位高人指出批评指正】</summary><published>2011-10-30T12:45:00Z</published><updated>2011-10-30T12:45:00Z</updated><author><name>哥本哈士奇(aspnetx)</name><uri>http://www.cnblogs.com/aspnetx/</uri></author><link rel="alternate" href="http://www.cnblogs.com/aspnetx/archive/2011/10/30/2229519.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/aspnetx/archive/2011/10/30/2229519.html"/><content type="html">&lt;p&gt;&lt;/p&gt;&lt;p&gt;原文地址：&lt;a href="http://create.msdn.com/en-US/education/quickstarts/Screen_Orientations"&gt;http://create.msdn.com/en-US/education/quickstarts/Screen_Orientations&lt;/a&gt; &lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;【译者注:这篇文章是翻译自微软官方的WP7 QuickStart的第八篇，讲述WP下的处理横屏和纵屏切换的技巧。部分内容加入了自己的理解和表达习惯。而翻译此系列的主要目的一是为了练习英语，二是让自己作为一个 BI开发者对WP7的开发有一个了解。部分翻译不当的地方望各位高人指出批评指正】  &lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;此篇主要描述Windows Phone的Silverlight对横屏和竖屏的支持技巧。 &lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;其中主要阐述以下内容： &lt;/p&gt;&lt;p&gt;屏幕方向 &lt;/p&gt;&lt;p&gt;滚动技巧 &lt;/p&gt;&lt;p&gt;Grid布局技巧 &lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;屏幕方向&lt;/strong&gt; &lt;/p&gt;&lt;p&gt;Windows Phone支持下面几种方式： &lt;/p&gt;&lt;p&gt;纵向 &lt;/p&gt;&lt;p&gt;左向水平 &lt;/p&gt;&lt;p&gt;右向水平 &lt;/p&gt;&lt;p&gt;用户可以很简单的更改设备的方向。当在模拟器中测试你的应用的时候，可以通过单击模拟器工具栏的方向切换按钮实现。方向按钮是一个带箭头的矩形来显示屏幕的方向。 &lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/aspnetx/201110/201110302038281643.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" alt="image" src="http://images.cnblogs.com/cnblogs_com/aspnetx/201110/201110302038345683.png" border="0" height="200" width="155" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;在屏幕纵向的时候，页面的方向是纵向的所以页面的高度要大于宽度。 &lt;/p&gt;&lt;p&gt;无论是左向横向和右向横向，状态栏和应用程序栏仍然是在屏幕的边缘的。左向横向，状态栏在左面，右向横向的时候，状态栏在右侧。【译者注：关于应用程序栏和状态栏参考本文末尾的译注。】 &lt;/p&gt;&lt;p&gt;屏幕纵向是默认支持的，所以当屏幕横向的时候需要额外写些代码。不能只指定左向或者右向的横向，如果需要支持屏幕横向，那么就需要对这两种横向都支持。如果需要程序支持横向或者纵向，需要设置SupportedOrientations属性为PortraitOrLandscape，在XAML里和代码里设置都可以。 &lt;/p&gt;&lt;p&gt;显示横屏和纵屏的内容有很多方式。其中的两个技巧就是通过滚动和Grid布局。 &lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;滚动技巧&lt;/strong&gt; &lt;/p&gt;&lt;p&gt;这个技巧需要在ScrollViewer控件中使用StackPanel，适用于需要显示列表数据或者一个控件接着一个控件显示的情况。StackPanel允许将其内部的控件一个接一个地显示，ScrollViewer控件允许转屏的过程中当控件超出屏幕的时候在StackPanel中显示滚动条。 &lt;/p&gt;&lt;p&gt;这个技巧按如下方式操作。 &lt;/p&gt;&lt;p&gt;1.更改SupportedOrientations属性为PortraitOrLandscape。 &lt;/p&gt;&lt;p&gt;2.替换Grid为ScrollViewer和StackPanel。 &lt;/p&gt;&lt;p&gt;代码演示： &lt;/p&gt;&lt;p&gt;XAML &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;ScrollViewer x:Name="ContentGrid" Grid.Row="1" VerticalScrollBarVisibility="Auto"&amp;gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;!--You must apply a background to the StackPanel control or you&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;will be unable to pan the contents.--&amp;gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;StackPanel Background="Transparent" &amp;gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;!--Adding various controls and UI elements.--&amp;gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;Button Content="This is a Button" /&amp;gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;Rectangle Width="100" Height="100" Margin="12,0"&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;HorizontalAlignment="Left" Fill="{StaticResource PhoneAccentBrush}"/&amp;gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;Rectangle Width="100" Height="100" HorizontalAlignment="Center"&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;Fill="{StaticResource PhoneAccentBrush}"/&amp;gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;Rectangle Width="100" Height="100" Margin="12,0"&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;HorizontalAlignment="Right" Fill="{StaticResource PhoneAccentBrush}"/&amp;gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;TextBlock Text="This is a line of text that will wrap in portrait&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;orientation but not landscape orientation." TextWrapping="Wrap" /&amp;gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;CheckBox Content="A CheckBox"/&amp;gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;RadioButton Content="A RadioButton" /&amp;gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;/StackPanel&amp;gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;/ScrollViewer&amp;gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;下图是运行效果。在纵屏中是不需要滚屏的，但是在横屏中就需要滚屏。 &lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/aspnetx/201110/201110302038392057.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" alt="image" src="http://images.cnblogs.com/cnblogs_com/aspnetx/201110/201110302038465824.png" border="0" height="480" width="266" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/aspnetx/201110/201110302038496540.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" alt="image" src="http://images.cnblogs.com/cnblogs_com/aspnetx/201110/20111030203856274.png" border="0" height="266" width="480" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Grid布局技巧&lt;/strong&gt; &lt;/p&gt;&lt;p&gt;这个技巧的元素布局在Grid中。当方向改变的时候，通过编程的方式对元素的在Grid中的行和列重新定位。 &lt;/p&gt;&lt;p&gt;这个技巧按如下方式操作： &lt;/p&gt;&lt;p&gt;1. 更改SupportedOrientations属性为PortraitOrLandscape。 &lt;/p&gt;&lt;p&gt;2. 使用Grid作为内容面板 &lt;/p&gt;&lt;p&gt;3. 为OrientationChanged事件定义事件处理程序来重新定位Grid中的元素。 &lt;/p&gt;&lt;p&gt;下面的示例是两行两列的Grid中定位一个图片和一些按钮。OrientationChanged事件处理代码在屏幕方向改变的时候对Grid内的元素进行重新定位。【译者注：也就是更改子元素的Grid.Row和Grid.Column属性】 &lt;/p&gt;&lt;p&gt;XAML &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0"&amp;gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;!--Create a 2 x 2 grid to store an image and button layout.--&amp;gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;Grid.RowDefinitions&amp;gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;RowDefinition Height="Auto"/&amp;gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;RowDefinition Height="*"/&amp;gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;/Grid.RowDefinitions&amp;gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;Grid.ColumnDefinitions&amp;gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;ColumnDefinition Width="Auto"/&amp;gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;ColumnDefinition Width="*"/&amp;gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;/Grid.ColumnDefinitions&amp;gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;!--Add an image to the grid. Ensure the image height and width&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;are set to 300 and 500 respectively for this example.--&amp;gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;Image x:Name="Image1" Grid.Row="0" Grid.Column="0"&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;Stretch="Fill" HorizontalAlignment="Center" Source="licorice.jpg"&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;Height="300" Width="500"/&amp;gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;!--Add a StackPanel with buttons to the row beneath the image.--&amp;gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;StackPanel x:Name="buttonList" Grid.Row="1" Grid.Column="0"&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;HorizontalAlignment="Center" &amp;gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;Button Content="Action 1" /&amp;gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;Button Content="Action 2" /&amp;gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;Button Content="Action 3" /&amp;gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;Button Content="Action 4" /&amp;gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;/StackPanel&amp;gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;/Grid&amp;gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;C# &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;private void PhoneApplicationPage_OrientationChanged(&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;object sender, OrientationChangedEventArgs e)&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;{&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;// Switch the placement of the buttons based on an orientation change.&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;if ((e.Orientation &amp;amp; PageOrientation.Portrait) == (PageOrientation.Portrait))&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;{&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;Grid.SetRow(buttonList, 1);&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;Grid.SetColumn(buttonList, 0);&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;}&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;// If not in portrait, move buttonList content to visible row and column.&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;else&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;{&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;Grid.SetRow(buttonList, 0);&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;Grid.SetColumn(buttonList, 1);&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;}&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;}&lt;/font&gt; &lt;/p&gt;&lt;p&gt;效果如下图。在纵向屏幕中，按钮定位在底端。在横向屏幕中，按钮定位在右端。 &lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/aspnetx/201110/201110302039016747.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" alt="image" src="http://images.cnblogs.com/cnblogs_com/aspnetx/201110/201110302039058411.png" border="0" height="480" width="266" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/aspnetx/201110/201110302039102343.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" alt="image" src="http://images.cnblogs.com/cnblogs_com/aspnetx/201110/201110302039174681.png" border="0" height="266" width="480" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;【译者注：这部分的技巧是Windows Phone下的Silverlight特有的，开发的时候为了使用户界面更友好一些，就需要支持屏幕的不同方向。另这里有两个概念被提到，原文是Application Bar和Status Bar，直译就是应用程序栏和状态栏，具体它们都是什么请参考下面的图片： &lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/aspnetx/201110/201110302045186403.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" alt="image" src="http://images.cnblogs.com/cnblogs_com/aspnetx/201110/201110302045227610.png" border="0" height="423" width="534" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;】       &lt;/p&gt;&lt;img src="http://www.cnblogs.com/aspnetx/aggbug/2229519.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/aspnetx/archive/2011/10/30/2229519.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/aspnetx/archive/2011/10/29/2228963.html</id><title type="text">[翻译]WP7 QuickStart-第七篇-布局</title><summary type="text">【译者注:这篇文章是翻译自微软官方的WP7 QuickStart的第七篇，讲述WP下的布局。部分内容加入了自己的理解和表达习惯。而翻译此系列的主要目的一是为了练习英语，二是让自己作为一个BI开发者对WP7的开发有一个了解。部分翻译不当的地方望各位高人指出批评指正】</summary><published>2011-10-29T15:48:00Z</published><updated>2011-10-29T15:48:00Z</updated><author><name>哥本哈士奇(aspnetx)</name><uri>http://www.cnblogs.com/aspnetx/</uri></author><link rel="alternate" href="http://www.cnblogs.com/aspnetx/archive/2011/10/29/2228963.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/aspnetx/archive/2011/10/29/2228963.html"/><content type="html">&lt;p&gt;&lt;/p&gt;&lt;p&gt;原文地址：&lt;a href="http://create.msdn.com/zh-CN/education/quickstarts/Layout_on_the_Screen"&gt;http://create.msdn.com/zh-CN/education/quickstarts/Layout_on_the_Screen&lt;/a&gt; &lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;【译者注:这篇文章是翻译自微软官方的WP7 QuickStart的第七篇，讲述WP下的布局。部分内容加入了自己的理解和表达习惯。而翻译此系列的主要目的一是为了练习英语，二是让自己作为一个BI开发者对WP7的开发有一个了解。部分翻译不当的地方望各位高人指出批评指正】  &lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Windows Phone下的Silverlight提供了一种灵活的布局方式来指定控件在屏幕上的位置。此篇主要描述如何设计根据不同屏幕分辨率自动大小的用户界面。 &lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;主要包含以下内容 &lt;/p&gt;&lt;p&gt;布局总览 &lt;/p&gt;&lt;p&gt;绝对布局 &lt;/p&gt;&lt;p&gt;动态布局 &lt;/p&gt;&lt;p&gt;Panel控件 &lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;布局总览&lt;/strong&gt; &lt;/p&gt;&lt;p&gt;Windows Phone下Silverlight的布局，是处理对象大小和位置的过程。给一个视觉元素布局，需要将其放入Panel控件或者其它容器控件中。Silverlight提供了一些Panel控件，比如Canvas，StackPanel和Grid，作为容器来定位和布置控件。 &lt;/p&gt;&lt;p&gt;Windows Phone的Silverlight布局系统支持绝对和动态的布局。在绝对布局方式中，控件的定义通过类似x/y的坐标方式，比如Canvas。在动态布局方式中，用户界面根据屏幕的分辨率自动调整大小。 &lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;绝对布局&lt;/strong&gt; &lt;/p&gt;&lt;p&gt;在绝对布局方式中，在布局面板中子元素通过指定其父元素中的位置坐标的形式来实现布局。绝对布局的方式并没有考虑到屏幕的大小。如果为了照顾到不同的屏幕分辨率，可以为其不同的屏幕分辨率单独的去设计不同的页面。 &lt;/p&gt;&lt;p&gt;Windows Phone的Silverlight提供了Canvas来支持绝对方式的布局。默认情况下创建新Windows Phone程序项目的时候，根布局元素为Grid。如果要用绝对方式的布局，需要把Grid替换成Canvas。 &lt;/p&gt;&lt;p&gt;在Canvas中布局，需要设置下面两个属性。在Visual Studio的设计视图中，当把控件拖拽到页面上的时候这两个属性就被更新了。 &lt;/p&gt;&lt;p&gt;Canvas.Left &lt;/p&gt;&lt;p&gt;Canvas.Top &lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;动态布局&lt;/strong&gt; &lt;/p&gt;&lt;p&gt;在动态布局中，用户界面会根据屏幕分辨率的不同呈现不同的效果。子元素在父元素中通过指定如何布置和如何自动换行。比如，可以在面板中布置控件并且指定他们如何自定横向自动切换。要用到自动的或者根据比例的大小，需要设置其Height和Width属性。 &lt;/p&gt;&lt;p&gt;设置Height和Width属性为Auto。当在Grid布局中使用这些值的时候，控件会填充满其容器。Auto属性在Grid和StackPanel中都是支持的。 &lt;/p&gt;&lt;p&gt;对于包含文本的控件，不要设置其Height和Width属性，设置MinWidth和MinHeight属性。这样会避免出现文本内容由于容器大小问题而显示不全的情况。 &lt;/p&gt;&lt;p&gt;如果要在Grid中按比例设置RowDefinition和ColumnDefinition，可以使用比例方式的Height和Width值。比如，如果要设置一个列是另一个列的五倍宽，可以分别对两列的ColumnDefinition属性的Width设置成*和5*。 &lt;/p&gt;&lt;p&gt;Auto和星形符号调整大小 &lt;/p&gt;&lt;p&gt;Auto用来让其填充满容器，即使内容的大小是可变的。星型模式用来根据比例分配Grid里的行和列。比如，如果有四个列，按照下面的设置其中的值。 &lt;/p&gt;&lt;p&gt;Column_1 &lt;/p&gt;&lt;p&gt;Auto-列会自动填满区域。 &lt;/p&gt;&lt;p&gt;Column_2 &lt;/p&gt;&lt;p&gt;*-列被分配完之后，这个列的宽度就是Column_4的一半。 &lt;/p&gt;&lt;p&gt;Column_3 &lt;/p&gt;&lt;p&gt;Auto-同Column_1 &lt;/p&gt;&lt;p&gt;Column_4 &lt;/p&gt;&lt;p&gt;2*-这个列的宽度会是列Column_2的一倍。 &lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;面板控件&lt;/strong&gt; &lt;/p&gt;&lt;p&gt;Windows Phone的Silverlight下内置的面板有Canvas，StackPanel和Grid。 &lt;/p&gt;&lt;p&gt;Canvas &lt;/p&gt;&lt;p&gt;Canvas使其内部的元素通过类似坐标的方式定位。Canvas适合用在包含的UI元素不需要移动或者改变的情况。 &lt;/p&gt;&lt;p&gt;可以通过Canvas里控件的坐标来实现定位。这个坐标就是通过Canvas.Left和Canvas.Top来实现的。Canvas.Left通过设置对象距离Canvas容器左面边界的距离，Canvas.Top指定距离Canvas顶部边界的距离。 &lt;/p&gt;&lt;p&gt;下面代码演示的是一个距离屏幕左端30像素，顶端200像素的矩形。 &lt;/p&gt;&lt;p&gt;XAML &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;Canvas Background="Transparent"&amp;gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;Rectangle Canvas.Left="30" Canvas.Top="200"&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;Fill="red" Width="200" Height="200" /&amp;gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;/Canvas&amp;gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;效果如下图： &lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/aspnetx/201110/201110292347516036.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="clip_image001" alt="clip_image001" src="http://images.cnblogs.com/cnblogs_com/aspnetx/201110/201110292347526201.png" border="0" height="244" width="136" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;StackPanel &lt;/p&gt;&lt;p&gt;StackPanel控件可以将其内部的元素以线性的方式横向或者纵向排布。通过Orientation属性指定子元素是以横向还是纵向排列，默认的属性为Vertical。 &lt;/p&gt;&lt;p&gt;下面演示XAML的StackPanel子元素的纵向排列。 &lt;/p&gt;&lt;p&gt;XAML &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;StackPanel Margin="20"&amp;gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;Rectangle Fill="Red" Width="50" Height="50" Margin="5" /&amp;gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;Rectangle Fill="Blue" Width="50" Height="50" Margin="5" /&amp;gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;Rectangle Fill="Green" Width="50" Height="50" Margin="5" /&amp;gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;Rectangle Fill="Purple" Width="50" Height="50" Margin="5" /&amp;gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;/StackPanel&amp;gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;运行效果如下图： &lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/aspnetx/201110/201110292347567087.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="clip_image002" alt="clip_image002" src="http://images.cnblogs.com/cnblogs_com/aspnetx/201110/20111029234800581.png" border="0" height="244" width="136" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;Grid &lt;/p&gt;&lt;p&gt;Grid是最灵活的布局面板，支持多行和多列的方式布局。可以通过Grid.RowDefinitions和Grid.ColumnDefinitions属性来设置Grid里的行列信息。其内部的元素可以通过Grid.Column和Grid.Row属性定义定位到Grid的哪一行哪一列。内容也可以通过RowSpan和ColumnSpan的方式定义跨行和跨列。 &lt;/p&gt;&lt;p&gt;Grid里的子元素根据XAML和代码的顺序依次显示在界面上，这样子元素就可以使用相同的坐标系统。可以参考ZIndex属性。 &lt;/p&gt;&lt;p&gt;下面的XAML代码创建了一个三行两列的Grid。第一行和第三行的高度以撑满布局的方式填充，第二行的高度则分配成了剩余可用的高度。列的宽度是均分的。 &lt;/p&gt;&lt;p&gt;XAML &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;Grid ShowGridLines="True" Margin="12,0,12,0"&amp;gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;Grid.RowDefinitions&amp;gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;RowDefinition Height="auto" /&amp;gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;RowDefinition /&amp;gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;RowDefinition Height="auto" /&amp;gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;/Grid.RowDefinitions&amp;gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;Grid.ColumnDefinitions&amp;gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;ColumnDefinition Width="*" /&amp;gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;ColumnDefinition Width="*" /&amp;gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;/Grid.ColumnDefinitions&amp;gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;TextBox Text="1st row 1st column" TextWrapping="Wrap" Grid.Column="0" Grid.Row="0" /&amp;gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;TextBox Text="3rd row 1st column" TextWrapping="Wrap" Grid.Column="0" Grid.Row="2" /&amp;gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;Button Content="1st row 3rd column" FontSize="17" Grid.Column="1" Grid.Row="0" /&amp;gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;Button Content="3rd row 2nd column" FontSize="17" Grid.Column="1" Grid.Row="2" /&amp;gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;/Grid&amp;gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;效果如下图所示： &lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/aspnetx/201110/201110292348074688.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="clip_image003" alt="clip_image003" src="http://images.cnblogs.com/cnblogs_com/aspnetx/201110/201110292348086489.png" border="0" height="244" width="136" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;如果对布局的需求比较复杂，并且Canvas， StackPanel和Grid都不能满足要求，可以尝试创建一个自定义的面板来实现子面板里的元素布局行为。具体的实现方法是继承Panel类并且重写其中的MeasureOverride和ArrangeOverride方法。 &lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;【译者注：这部分跟传统的Silverlight是完全相同的了。】  &lt;/p&gt;&lt;img src="http://www.cnblogs.com/aspnetx/aggbug/2228963.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/aspnetx/archive/2011/10/29/2228963.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/aspnetx/archive/2011/10/28/2228255.html</id><title type="text">[翻译]WP7 QuickStart-第六篇-Windows Phone下文本的使用</title><summary type="text">【译者注:这篇文章是翻译自微软官方的WP7 QuickStart的第六篇，讲述WP下的文本的使用。部分内容加入了自己的理解和表达习惯。而翻译此系列的主要目的一是为了练习英语，二是让自己作为一个BI开发者对WP7的开发有一个了解。部分翻译不当的地方望各位高人指出批评指正】</summary><published>2011-10-28T15:49:00Z</published><updated>2011-10-28T15:49:00Z</updated><author><name>哥本哈士奇(aspnetx)</name><uri>http://www.cnblogs.com/aspnetx/</uri></author><link rel="alternate" href="http://www.cnblogs.com/aspnetx/archive/2011/10/28/2228255.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/aspnetx/archive/2011/10/28/2228255.html"/><content type="html">&lt;p&gt;&lt;/p&gt;&lt;p&gt;原文地址：&lt;a href="http://create.msdn.com/en-US/education/quickstarts/Working_with_Text_on_the_Windows_Phone"&gt;http://create.msdn.com/en-US/education/quickstarts/Working_with_Text_on_the_Windows_Phone&lt;/a&gt;  &lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;【译者注:这篇文章是翻译自微软官方的WP7 QuickStart的第六篇，讲述WP下的文本的使用。部分内容加入了自己的理解和表达习惯。而翻译此系列的主要目的一是为了练习英语，二是让自己作为一个BI开发者对WP7的开发有一个了解。部分翻译不当的地方望各位高人指出批评指正】  &lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Windows Phone下的Silverlight提供了一些控件用来显示文本，其中带有一些属性来对文本进行格式化。在Silverlight下基于文本的控件有TextBlock，TextBox和PasswordBox。此篇主要介绍这些控件如何显示和输入文本。  &lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;其中包含下面的内容  &lt;/p&gt;&lt;p&gt;TextBlock  &lt;/p&gt;&lt;p&gt;TextBox  &lt;/p&gt;&lt;p&gt;TextBox下的软键盘  &lt;/p&gt;&lt;p&gt;PasswordBox  &lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;TextBlock&lt;/strong&gt;  &lt;/p&gt;&lt;p&gt;TextBlock在Windows Phone下主要显示只读的文本信息。可以通过它的Text属性来指定显示的文本。  &lt;/p&gt;&lt;p&gt;下面的XAML 演示如何定义一个TextBlock控件并且设置其Text属性。  &lt;/p&gt;&lt;p&gt;XAML  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;TextBlock Text="Hello, world!" /&amp;gt;&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;效果如下图。  &lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/aspnetx/201110/201110282349207636.jpg"&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="clip_image001" alt="clip_image001" src="http://images.cnblogs.com/cnblogs_com/aspnetx/201110/201110282349216797.jpg" border="0" height="244" width="136" /&gt;&lt;/a&gt;  &lt;/p&gt;&lt;p&gt;也可以在TextBlock里显示更多的字符串，并且每个字符串都可以有不同的格式。通过Run元素就可以定义每个字符串的格式，并且通过LineBreak将其分隔。  &lt;/p&gt;&lt;p&gt;下面的XAML演示在TextBlock中的文本用Run定义不同的格式，并且使用LineBreak将其分隔开。  &lt;/p&gt;&lt;p&gt;XAML  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;Grid&amp;gt;&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;TextBlock FontFamily="Arial" Width="400" &amp;gt;&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;LineBreak/&amp;gt;&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;Run Foreground="Maroon" FontFamily="Courier New" FontSize="40"&amp;gt;&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;Courier New 24&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;/Run&amp;gt;&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;LineBreak/&amp;gt;&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;Run Foreground="Teal" FontFamily="Times New Roman" FontSize="30" FontStyle="Italic"&amp;gt;&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;Times New Roman Italic 18&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;/Run&amp;gt;&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;LineBreak/&amp;gt;&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;Run Foreground="SteelBlue" FontFamily="Verdana" FontSize="20" FontWeight="Bold"&amp;gt;&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;Verdana Bold 14&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;/Run&amp;gt;&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;/TextBlock&amp;gt;&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;/Grid&amp;gt;&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;结果如下图。  &lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/aspnetx/201110/201110282349213242.jpg"&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="clip_image002" alt="clip_image002" src="http://images.cnblogs.com/cnblogs_com/aspnetx/201110/201110282349213275.jpg" border="0" height="244" width="136" /&gt;&lt;/a&gt;  &lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;TextBox&lt;/strong&gt;  &lt;/p&gt;&lt;p&gt;TextBox用来输入单行或者多行文本，其中的Text属性是其中的文本内容。在下面的实例中，有三个文本输入区域。当在第一个TextBox中输入，相同的文本就会出现在第二个TextBox中。这里是用到了TextChanged事件。第三个TextBox显示水印。实现水印效果可以通过字体的属性，比如Foreground和FontSize，还有一些事件，比如GotFocus和LostFocus。  &lt;/p&gt;&lt;p&gt;在下面的在线实例中，单击第一个文本框然后输入一些内容可以看到运行的效果。  &lt;/p&gt;&lt;p&gt;笔记：这个在线实例是用传统的Silverlight模拟的Windows Phone下的Silverlight效果。实际运行的效果跟在Windows Phone模拟器以及物理设备中的略有不同。  &lt;/p&gt;&lt;p&gt;&lt;object id="Object2" data="data:application/x-silverlight-2," type="application/x-silverlight-2" height="530" width="400"&gt; &lt;param name="source" value="http://create.msdn.com/assets/cms/docs/QuickstartsXAP/TextBoxDesktop.xap" /&gt;&lt;param name="onerror" value="onSilverlightError" /&gt;&lt;param name="background" value="Transparent" /&gt;&lt;param name="windowless" value="true" /&gt;&lt;a href="http://go.microsoft.com/fwlink/?LinkID=115261" style="text-decoration: none;"&gt; &lt;img src="http://go.microsoft.com/fwlink/?LinkId=108181" alt="Get Microsoft Silverlight" style="border-style: none" /&gt; &lt;/a&gt; &lt;/object&gt; &lt;/p&gt;&lt;p&gt;XAML  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;StackPanel Background="Transparent"&amp;gt;&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;TextBlock Text="Type Text Here" /&amp;gt;&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;TextBox x:Name="ReadWriteTB" TextChanged="ReadWriteTB_TextChanged"&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;IsReadOnly="False" /&amp;gt;&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;TextBlock Text="Read Only TextBox" /&amp;gt;&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;TextBox x:Name="ReadOnlyTB" IsReadOnly="True" /&amp;gt;&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;TextBlock Text="Search Type TextBox" /&amp;gt;&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;TextBlock FontSize="17" TextWrapping="Wrap"&amp;gt;&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;When you click inside the text box the watermark text is removed and the&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;cursor appears ready for input.&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;/TextBlock&amp;gt;&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;TextBox x:Name="WatermarkTB" Text="Search"&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;Foreground="Gray" GotFocus="WatermarkTB_GotFocus"&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;LostFocus="WatermarkTB_LostFocus" /&amp;gt;&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;/StackPanel&amp;gt;&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;C#  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;//The following method displays the text entered in ReadWriteTB in ReadOnlyTB.&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;private void ReadWriteTB_TextChanged(object sender, RoutedEventArgs e)&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;{&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;ReadOnlyTB.Text = ReadWriteTB.Text;&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;}&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;//The foreground color of the text in WatermarkTB is set to Magenta when WatermarkTB&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;//gets focus.&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;private void WatermarkTB _GotFocus(object sender, RoutedEventArgs e)&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;{&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;if (WatermarkTB.Text == "Search")&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;{&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;WatermarkTB.Text = "";&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;SolidColorBrush Brush1 = new SolidColorBrush();&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;Brush1.Color = Colors.Magenta;&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;WatermarkTB.Foreground = Brush1;&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;}&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;}&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;//The foreground color of the text in WatermarkTB is set to Blue when WatermarkTB&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;//loses focus. Also, if SearchTB loses focus and no text is entered, the&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;//text "Search" is displayed.&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;private void WatermarkTB _LostFocus(object sender, RoutedEventArgs e)&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;{&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;if (WatermarkTB .Text == String.Empty)&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;{&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;WatermarkTB.Text = "Search";&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;SolidColorBrush Brush2 = new SolidColorBrush();&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;Brush2.Color = Colors.Blue;&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;WatermarkTB.Foreground = Brush2;&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;}&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;}&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;TextBox下的软键盘&lt;/strong&gt;  &lt;/p&gt;&lt;p&gt;在Windows Phone下输入文本的主要方式就是通过在屏幕上的小键盘，也就是软键盘。当TextBox这样的可编辑内容的控件被激活的时候，软键盘就会从屏幕的下方滑入。当用户点击了编辑区域之外，滑动条或者返回按钮，它就会从屏幕底端滑出。假如设备有物理键盘的话，软键盘就会自动关闭。可以设置软键盘的外观，可以根据程序的上下文更容易的输入字符。比如，在输入邮政编码的时候，你只想看到数字键盘，这个时候就可以通过InputScope属性设置它。  &lt;/p&gt;&lt;p&gt;下面列出了常用的软键盘，以及可以在XAML和代码中指定的InputScopeNameValue属性。  &lt;/p&gt;&lt;p&gt;Default  &lt;/p&gt;&lt;p&gt;默认的样式，输入句子的时候首字母会自动大写。  &lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/aspnetx/201110/201110282349222436.jpg"&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="clip_image003" alt="clip_image003" src="http://images.cnblogs.com/cnblogs_com/aspnetx/201110/201110282349222785.jpg" border="0" height="160" width="225" /&gt;&lt;/a&gt;  &lt;/p&gt;&lt;p&gt;Text  &lt;/p&gt;&lt;p&gt;适合用在文档或者电子邮件中。  &lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/aspnetx/201110/201110282349226406.jpg"&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="clip_image004" alt="clip_image004" src="http://images.cnblogs.com/cnblogs_com/aspnetx/201110/201110282349221979.jpg" border="0" height="191" width="226" /&gt;&lt;/a&gt;  &lt;/p&gt;&lt;p&gt;Chat  &lt;/p&gt;&lt;p&gt;适合用在短信，聊天界面以及各种社区客户端。  &lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/aspnetx/201110/201110282349232012.jpg"&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="clip_image005" alt="clip_image005" src="http://images.cnblogs.com/cnblogs_com/aspnetx/201110/201110282349239536.jpg" border="0" height="189" width="226" /&gt;&lt;/a&gt;  &lt;/p&gt;&lt;p&gt;URL  &lt;/p&gt;&lt;p&gt;适合输入网页地址。  &lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/aspnetx/201110/201110282349239569.jpg"&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="clip_image006" alt="clip_image006" src="http://images.cnblogs.com/cnblogs_com/aspnetx/201110/201110282349245142.jpg" border="0" height="161" width="225" /&gt;&lt;/a&gt;  &lt;/p&gt;&lt;p&gt;TelephoneNumber  &lt;/p&gt;&lt;p&gt;12键，适合输入电话号码。  &lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/aspnetx/201110/201110282349249079.jpg"&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="clip_image007" alt="clip_image007" src="http://images.cnblogs.com/cnblogs_com/aspnetx/201110/201110282349246604.jpg" border="0" height="161" width="222" /&gt;&lt;/a&gt;  &lt;/p&gt;&lt;p&gt;EmailSmtpAddress  &lt;/p&gt;&lt;p&gt;适合输入电子右键地址，自带@和.com键。  &lt;/p&gt;&lt;p&gt;CurrencyAmount  &lt;/p&gt;&lt;p&gt;适合货币输入。  &lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/aspnetx/201110/201110282349244129.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="clip_image008" alt="clip_image008" src="http://images.cnblogs.com/cnblogs_com/aspnetx/201110/201110282349256113.jpg" border="0" height="160" width="226" /&gt;&lt;/a&gt;  &lt;/p&gt;&lt;p&gt;除此之外还有更多60种模式，这里不做一一介绍。  &lt;/p&gt;&lt;p&gt;下面的示例演示如何用XAML和C#给TextBox设置设置输入模式。  &lt;/p&gt;&lt;p&gt;XAML  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;TextBox Text="HelloWorld"&amp;gt;&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;TextBox.InputScope&amp;gt;&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;InputScope&amp;gt;&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;InputScopeName NameValue="Chat" /&amp;gt;&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;/InputScope&amp;gt;&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;/TextBox.InputScope&amp;gt;&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;&amp;lt;/TextBox&amp;gt;&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;C#  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;InputScope IPChat = new InputScope();&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;InputScopeName IPNChat = new InputScopeName();&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;IPNChat .NameValue= InputScopeNameValue.Chat;&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;IPChat.Names.Add(IPNChat);&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font style="background-color: #cccccc"&gt;TBChatWindow.InputScope = IPChat;&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;PasswordBox&lt;/strong&gt;  &lt;/p&gt;&lt;p&gt;用来输入密码，用户输入的密码显示为*所以是无法被看到的。通过Password属性就可以取出输入的密码，并且使用PasswordChar属性来指定替换密码的字符。  &lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;【译者注：此部分的内容基本上和传统Silverlight差不多，密码框有些不同，另对于软键盘的支持也是WP下特有的。】   &lt;/p&gt;&lt;img src="http://www.cnblogs.com/aspnetx/aggbug/2228255.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/aspnetx/archive/2011/10/28/2228255.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/aspnetx/archive/2011/10/27/2227162.html</id><title type="text">[翻译]WP7 QuickStart-第五篇-Panorama和Pivot控件</title><summary type="text">【译者注:这篇文章是翻译自微软官方的WP7 QuickStart的第五篇，讲述WP下的Panorama和Pivot控件，这两个控件是Silverlight里WP中特有的。部分内容加入了自己的理解和表达习惯。而翻译此系列的主要目的一是为了练习英语，二是让自己作为一个BI开发者对WP7的开发有一个了解。部分翻译不当的地方望各位高人指出批评指正】</summary><published>2011-10-27T15:56:00Z</published><updated>2011-10-27T15:56:00Z</updated><author><name>哥本哈士奇(aspnetx)</name><uri>http://www.cnblogs.com/aspnetx/</uri></author><link rel="alternate" href="http://www.cnblogs.com/aspnetx/archive/2011/10/27/2227162.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/aspnetx/archive/2011/10/27/2227162.html"/><content type="html">&lt;p&gt;&lt;/p&gt;&lt;p&gt;原文地址：&lt;a href="http://create.msdn.com/en-US/education/quickstarts/Panorama_and_Pivot_Controls"&gt;http://create.msdn.com/en-US/education/quickstarts/Panorama_and_Pivot_Controls&lt;/a&gt; &lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;【译者注:这篇文章是翻译自微软官方的WP7 QuickStart的第五篇，讲述WP下的Panorama和Pivot控件，这两个控件是Silverlight里WP中特有的。部分内容加入了自己的理解和表达习惯。而翻译此系列的主要目的一是为了练习英语，二是让自己作为一个BI开发者对WP7的开发有一个了解。部分翻译不当的地方望各位高人指出批评指正】 &lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Windows Phone提供了Panorama和Pivot这两种控件供用户横向切换导航的方式来显示具有内容比较相关的页面。本文主要对这两个控件进行描述，包括如何使用，以及一些最佳实践。 &lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;其中包括如下部分： &lt;/p&gt;&lt;p&gt;Panorama控件 &lt;/p&gt;&lt;p&gt;Pivot控件 &lt;/p&gt;&lt;p&gt;如何在二者之间选择 &lt;/p&gt;&lt;p&gt;在项目中填加它们 &lt;/p&gt;&lt;p&gt;Panorama控件示例 &lt;/p&gt;&lt;p&gt;Pivot控件示例 &lt;/p&gt;&lt;p&gt;最佳实践 &lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Panorama控件&lt;/strong&gt; &lt;/p&gt;&lt;p&gt;Panorama控件用来在一个很长的横向面板上显示相关的内容，屏幕之外的内容可以依次切入到屏幕中，可以通过左右滑动的方式来切换它们。当看到其中的一个元素的时候，可以在屏幕右边显示出了一点下一屏的内容，这样你就可以知道在当前屏幕的下一屏还是有内容的。当浏览到内容的最后一屏再继续切换的话，则会回到第一屏。另外Panorama控件自身内置了触控和导航，通常来说这些已经够用，基本上不需要再为其实现特殊的手势功能。 &lt;/p&gt;&lt;p&gt;在Windows Phone系统下，内置的People和Music+Videos界面就是一个典型的案例。下图就是在People界面下的Panorama界面效果。 &lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/aspnetx/201110/201110272355119665.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="clip_image001" alt="clip_image001" src="http://images.cnblogs.com/cnblogs_com/aspnetx/201110/201110272355155111.jpg" border="0" height="382" width="601" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Pivot控件&lt;/strong&gt; &lt;/p&gt;&lt;p&gt;Pivot控件用来过滤大量的数据集，在不同的视图中查看它们，或者针对同一个数据切换不同的视图。Pivot控件跟Tab控件很像，但它是专门为Windows Phone和触控界面设计的。它通过视图间的横向互相切换，这样就可以让用户 用内置的触控功能来回导航。 &lt;/p&gt;&lt;p&gt;在Windows Phone内置的功能中，E-Mail和Calendar功能就是Pivot的一个应用。下面是E-Mail界面的效果。 &lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/aspnetx/201110/201110272355174196.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="clip_image002" alt="clip_image002" src="http://images.cnblogs.com/cnblogs_com/aspnetx/201110/201110272355234856.jpg" border="0" height="358" width="509" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;如何在二者之间选择&lt;/strong&gt; &lt;/p&gt;&lt;p&gt;虽然Panorama和Pivot都比较像，但是在决定具体使用哪一个的时候还需要注意一些。 &lt;/p&gt;&lt;p&gt;使用Panorama的话可以让用户浏览内容并且提供了一个更多操作的入口点。它比较适合用来显示从多钟媒体源聚合过来的信息。它不应该在程序中只提供单一独立的操作，它应该实现那种对更多内容的一个引导，通过具有目标导向性的功能来完成用户体验。 &lt;/p&gt;&lt;p&gt;Pivot控件使用户可以过滤，排序或者在程序中对内容进行组织。它最好是只显示相同类型的元素或者数据。其中的各个标题应用自然语言去描述。这种左右切换导航方式的模型会使用户更有效率地找到他们需要的信息。 &lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;在项目中填加它们&lt;/strong&gt; &lt;/p&gt;&lt;p&gt;可以通过三种方式填加它们。 &lt;/p&gt;&lt;p&gt;工具栏 &lt;/p&gt;&lt;p&gt;直接从工具栏拖拽的方式在现有页面中填加它们，但默认这两个控件是不在工具栏中的，要让他们出现在这里，需要右键工具栏然后选择Choose Items。 &lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/aspnetx/201110/201110272355286431.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="clip_image003" alt="clip_image003" src="http://images.cnblogs.com/cnblogs_com/aspnetx/201110/201110272355378228.png" border="0" height="374" width="519" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;使用页面模版 &lt;/p&gt;&lt;p&gt;在解决方案管理器中右键项目，点Add-&amp;gt;New Item。在新建项目对框框中，选择Windows Phone Panorama Page或者Windows Phone Pivot Page。 &lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/aspnetx/201110/201110272355407229.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="clip_image004" alt="clip_image004" src="http://images.cnblogs.com/cnblogs_com/aspnetx/201110/201110272355545584.png" border="0" height="384" width="554" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;通过项目模版 &lt;/p&gt;&lt;p&gt;新建一个项目，项目类型选择Windows Phone Panorama Application或者Windows Phone Pivot Application。 &lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/aspnetx/201110/201110272355599144.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="clip_image005" alt="clip_image005" src="http://images.cnblogs.com/cnblogs_com/aspnetx/201110/201110272356053185.png" border="0" height="409" width="589" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;无论以这三种方式的哪种方式使用这两个控件，下面的程序集都会被自动填加。 &lt;/p&gt;&lt;p&gt;Microsoft.Phone.Controls.dll &lt;/p&gt;&lt;p&gt;同样如下的XML命名空间也会被填加到页面。 &lt;/p&gt;&lt;p&gt;xmlns:controls="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone.Controls" &lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Panorama控件示例&lt;/strong&gt; &lt;/p&gt;&lt;p&gt;下面的示例创建了一个带背景图片的Panorama控件，其中有三个PanoramaItem控件。背景图片建议的大小是2000*800。PanoramaItem是Panorama控件的子元素。一个Panorama控件可以有多个PanoramaItem，用户可以通过内置的触控功能来进行动态的切换。 &lt;/p&gt;&lt;p&gt;XAML &lt;/p&gt;&lt;p&gt;&amp;lt;Grid x:Name="LayoutRoot" Background="Transparent"&amp;gt; &lt;/p&gt;&lt;p&gt;&amp;lt;!--Panorama Control--&amp;gt; &lt;/p&gt;&lt;p&gt;&amp;lt;controls:Panorama Title="my pictures"&amp;gt; &lt;/p&gt;&lt;p&gt;&amp;lt;controls:Panorama.Background&amp;gt; &lt;/p&gt;&lt;p&gt;&amp;lt;ImageBrush ImageSource="PanoramaBackground.png" /&amp;gt; &lt;/p&gt;&lt;p&gt;&amp;lt;/controls:Panorama.Background&amp;gt; &lt;/p&gt;&lt;p&gt;&amp;lt;!--Panorama item one--&amp;gt; &lt;/p&gt;&lt;p&gt;&amp;lt;controls:PanoramaItem&amp;gt; &lt;/p&gt;&lt;p&gt;&amp;lt;TextBlock FontSize="30" Text="This example demonstrates &lt;/p&gt;&lt;p&gt;the Panorama control in a Windows Phone application." TextWrapping="Wrap" /&amp;gt; &lt;/p&gt;&lt;p&gt;&amp;lt;/controls:PanoramaItem&amp;gt; &lt;/p&gt;&lt;p&gt;&amp;lt;!--Panorama item two--&amp;gt; &lt;/p&gt;&lt;p&gt;&amp;lt;controls:PanoramaItem&amp;gt; &lt;/p&gt;&lt;p&gt;&amp;lt;ListBox FontSize="35"&amp;gt; &lt;/p&gt;&lt;p&gt;&amp;lt;ListBoxItem Content="all" /&amp;gt; &lt;/p&gt;&lt;p&gt;&amp;lt;ListBoxItem Content="recent" /&amp;gt; &lt;/p&gt;&lt;p&gt;&amp;lt;ListBoxItem Content="favorites" /&amp;gt; &lt;/p&gt;&lt;p&gt;&amp;lt;/ListBox&amp;gt; &lt;/p&gt;&lt;p&gt;&amp;lt;/controls:PanoramaItem&amp;gt; &lt;/p&gt;&lt;p&gt;&amp;lt;!--Panorama item three--&amp;gt; &lt;/p&gt;&lt;p&gt;&amp;lt;controls:PanoramaItem Orientation="Horizontal"&amp;gt; &lt;/p&gt;&lt;p&gt;&amp;lt;Grid&amp;gt; &lt;/p&gt;&lt;p&gt;&amp;lt;Grid HorizontalAlignment="Center" VerticalAlignment="Center"&amp;gt; &lt;/p&gt;&lt;p&gt;&amp;lt;Grid.RowDefinitions&amp;gt; &lt;/p&gt;&lt;p&gt;... &lt;/p&gt;&lt;p&gt;&amp;lt;/Grid.RowDefinitions&amp;gt; &lt;/p&gt;&lt;p&gt;&amp;lt;Grid.ColumnDefinitions&amp;gt; &lt;/p&gt;&lt;p&gt;... &lt;/p&gt;&lt;p&gt;&amp;lt;/Grid.ColumnDefinitions&amp;gt; &lt;/p&gt;&lt;p&gt;&amp;lt;Image Source="Creek.jpg" Grid.Row="0" Grid.Column="0" &lt;/p&gt;&lt;p&gt;Margin="10"/&amp;gt; &lt;/p&gt;&lt;p&gt;&amp;lt;Image Source="Desert.jpg" Grid.Row="0" Grid.Column="1" &lt;/p&gt;&lt;p&gt;Margin="10"/&amp;gt; &lt;/p&gt;&lt;p&gt;... &lt;/p&gt;&lt;p&gt;&amp;lt;/Grid&amp;gt; &lt;/p&gt;&lt;p&gt;&amp;lt;/Grid&amp;gt; &lt;/p&gt;&lt;p&gt;&amp;lt;/controls:PanoramaItem&amp;gt; &lt;/p&gt;&lt;p&gt;&amp;lt;/controls:Panorama&amp;gt; &lt;/p&gt;&lt;p&gt;&amp;lt;/Grid&amp;gt; &lt;/p&gt;&lt;p&gt;第一个PanoramaItem有一个TextBlock控件里面包含一段文本。 &lt;/p&gt;&lt;p&gt;第二个PanoramaItem有一个ListBox控件，其中有三个元素。 &lt;/p&gt;&lt;p&gt;第三个PanoramaItem的Orientation属性设置成了横向，这样就可以看到所有的图片缩略图。Panorama控件允许你显示比屏幕更宽的内容。通过把PanoramaItem的Orentation属性设置成横向，这样内容宽于屏幕的部分就不会被截断并且可以横向滑动浏览。 &lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/aspnetx/201110/201110272356136485.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="clip_image006" alt="clip_image006" src="http://images.cnblogs.com/cnblogs_com/aspnetx/201110/201110272356209470.png" border="0" height="370" width="580" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Pivot控件示例&lt;/strong&gt; &lt;/p&gt;&lt;p&gt;下面示例创建一个Pivot控件显示用户任务中的不同视图。其中有三个PivotItem控件，每个部分根据全部任务，今日任务和明日任务来过滤数据。 &lt;/p&gt;&lt;p&gt;XAML &lt;/p&gt;&lt;p&gt;&amp;lt;!--LayoutRoot is the root grid where all page content is placed--&amp;gt; &lt;/p&gt;&lt;p&gt;&amp;lt;Grid x:Name="LayoutRoot" Background="Transparent"&amp;gt; &lt;/p&gt;&lt;p&gt;&amp;lt;controls:Pivot Title="my tasks"&amp;gt; &lt;/p&gt;&lt;p&gt;&amp;lt;!--Pivot item one--&amp;gt; &lt;/p&gt;&lt;p&gt;&amp;lt;controls:PivotItem Header="all"&amp;gt; &lt;/p&gt;&lt;p&gt;&amp;lt;ListBox FontSize="30"&amp;gt; &lt;/p&gt;&lt;p&gt;&amp;lt;ListBoxItem Content="Dentist appointment" /&amp;gt; &lt;/p&gt;&lt;p&gt;&amp;lt;ListBoxItem Content="Pickup laundry" /&amp;gt; &lt;/p&gt;&lt;p&gt;&amp;lt;ListBoxItem Content="Service car" /&amp;gt; &lt;/p&gt;&lt;p&gt;&amp;lt;ListBoxItem Content="Send birthday gift to mom" /&amp;gt; &lt;/p&gt;&lt;p&gt;&amp;lt;ListBoxItem Content="Grocery" /&amp;gt; &lt;/p&gt;&lt;p&gt;&amp;lt;/ListBox&amp;gt; &lt;/p&gt;&lt;p&gt;&amp;lt;/controls:PivotItem&amp;gt; &lt;/p&gt;&lt;p&gt;&amp;lt;!--Pivot item two--&amp;gt; &lt;/p&gt;&lt;p&gt;&amp;lt;controls:PivotItem Header="today"&amp;gt; &lt;/p&gt;&lt;p&gt;&amp;lt;ListBox FontSize="30"&amp;gt; &lt;/p&gt;&lt;p&gt;&amp;lt;ListBoxItem Content="Dentist appointment" /&amp;gt; &lt;/p&gt;&lt;p&gt;&amp;lt;ListBoxItem Content="Pickup laundry" /&amp;gt; &lt;/p&gt;&lt;p&gt;&amp;lt;/ListBox&amp;gt; &lt;/p&gt;&lt;p&gt;&amp;lt;/controls:PivotItem&amp;gt; &lt;/p&gt;&lt;p&gt;&amp;lt;!--Pivot item three--&amp;gt; &lt;/p&gt;&lt;p&gt;&amp;lt;controls:PivotItem Header="tomorrow"&amp;gt; &lt;/p&gt;&lt;p&gt;&amp;lt;ListBox FontSize="30"&amp;gt; &lt;/p&gt;&lt;p&gt;&amp;lt;ListBoxItem Content="Service car" /&amp;gt; &lt;/p&gt;&lt;p&gt;&amp;lt;ListBoxItem Content="Send birthday gift to mom" /&amp;gt; &lt;/p&gt;&lt;p&gt;&amp;lt;ListBoxItem Content="Grocery" /&amp;gt; &lt;/p&gt;&lt;p&gt;&amp;lt;/ListBox&amp;gt; &lt;/p&gt;&lt;p&gt;&amp;lt;/controls:PivotItem&amp;gt; &lt;/p&gt;&lt;p&gt;&amp;lt;/controls:Pivot&amp;gt; &lt;/p&gt;&lt;p&gt;&amp;lt;/Grid&amp;gt; &lt;/p&gt;&lt;p&gt;下图是运行结果。 &lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/aspnetx/201110/201110272356234576.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="clip_image007" alt="clip_image007" src="http://images.cnblogs.com/cnblogs_com/aspnetx/201110/201110272356272988.png" border="0" height="379" width="535" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;提示： &lt;/p&gt;&lt;p&gt;如果要在这两个控件中实现纵向浏览，可以在其中填加滚动控件，比如ListBox，或者填加一个ScrollViewer。ScrllViewer可以确保元素尺寸始终都是跟容器搭配的。 &lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;最佳实践&lt;/strong&gt; &lt;/p&gt;&lt;p&gt;以下是关于Panorama控件的建议： &lt;/p&gt;&lt;p&gt;尽量控制PanoramaItems的个数最大不超过四个。 &lt;/p&gt;&lt;p&gt;除非PanoramaItems有内容显示，否则最好是把Visibility属性设置成Collapsed以隐藏。 &lt;/p&gt;&lt;p&gt;通过设置Orientation属性为Horizontal使PanoramaItems可以显示比屏幕边界更宽的内容。 &lt;/p&gt;&lt;p&gt;使用合适的背景图片大小，建议为高度800像素，宽度在2000像素以内。 &lt;/p&gt;&lt;p&gt;尽量设置Panorama的Title属性为应用程序在开始界面的名称。 &lt;/p&gt;&lt;p&gt;尽量避免为Panorama的Title填加动画或者动态更改其大小。 &lt;/p&gt;&lt;p&gt;以下是关于Pivot控件的建议： &lt;/p&gt;&lt;p&gt;考虑到性能，尽量降低PivotItem的个数。 &lt;/p&gt;&lt;p&gt;尽量实时加载里面的内容，而不是在程序开始的时候就全部加载。 &lt;/p&gt;&lt;p&gt;尽量用Pivot控件显示相同类型的元素或者数据。 &lt;/p&gt;&lt;p&gt;不要用Pivot控件实现类似导航工具的功能。 &lt;/p&gt;&lt;p&gt;不要使用Application Bar提供导航。如果用Pivot是为了导航效果，那就相当于滥用了。  &lt;/p&gt;&lt;img src="http://www.cnblogs.com/aspnetx/aggbug/2227162.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/aspnetx/archive/2011/10/27/2227162.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/aspnetx/archive/2011/10/26/2225882.html</id><title type="text">[翻译]WP7 QuickStart-第四篇-控件的不同类型</title><summary type="text">【译者注:这篇文章是翻译自微软官方的WP7 QuickStart的第四篇，讲述WP下控件的不同的类型。部分内容加入了自己的理解和表达习惯。而翻译此系列的主要目的一是为了练习英语，二是让自己作为一个BI开发者对WP7的开发有一个了解。部分翻译不当的地方望各位高人指出批评指正】</summary><published>2011-10-26T15:32:00Z</published><updated>2011-10-26T15:32:00Z</updated><author><name>哥本哈士奇(aspnetx)</name><uri>http://www.cnblogs.com/aspnetx/</uri></author><link rel="alternate" href="http://www.cnblogs.com/aspnetx/archive/2011/10/26/2225882.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/aspnetx/archive/2011/10/26/2225882.html"/><content type="html">&lt;p&gt;&lt;/p&gt;&lt;p&gt;原文地址：&lt;a href="http://create.msdn.com/en-US/education/quickstarts/Types_of_Controls"&gt;http://create.msdn.com/en-US/education/quickstarts/Types_of_Controls&lt;/a&gt; &lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;【译者注:这篇文章是翻译自微软官方的WP7 QuickStart的第四篇，讲述WP下控件的不同的类型。部分内容加入了自己的理解和表达习惯。而翻译此系列的主要目的一是为了练习英语，二是让自己作为一个BI开发者对WP7的开发有一个了解。部分翻译不当的地方望各位高人指出批评指正】 &lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Windows Phone的Silverlight程序中控件分为不同的种类。有些控件也会出现在传统的Silverlight中，但是有一些却是Windows Phone特有的。此篇描述这些不同类型的控件，以及如何使用它们。 &lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;此部分包含下面几部分： &lt;/p&gt;&lt;p&gt;导航控件 &lt;/p&gt;&lt;p&gt;布局和分组控件 &lt;/p&gt;&lt;p&gt;文本控件 &lt;/p&gt;&lt;p&gt;按钮和选择控件 &lt;/p&gt;&lt;p&gt;列表控件 &lt;/p&gt;&lt;p&gt;图像，地图和媒体控件 &lt;/p&gt;&lt;p&gt;HTML控件 &lt;/p&gt;&lt;p&gt;进度和消息控件 &lt;/p&gt;&lt;p&gt;Toolkit控件 &lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;导航控件&lt;/strong&gt; &lt;/p&gt;&lt;p&gt;Silverlight的Windows Phone应用程序是基于一种可以让用户在不同页面内容间来回导航的页面模型。这个模型是基于其中的frame控件，而页面间的导航就是靠它。 &lt;/p&gt;&lt;p&gt;下面的表格列出了Windows Phone程序的用来支持导航的控件。 &lt;/p&gt;&lt;p&gt;PhoneApplicationFrame &lt;/p&gt;&lt;p&gt;Windows Phone的Silverlight程序主控件。用来支持页面的导航。 &lt;/p&gt;&lt;p&gt;PhoneApplicationPage &lt;/p&gt;&lt;p&gt;可以被PhoneApplicationFrame导航的控件。 &lt;/p&gt;&lt;p&gt;下图显示了frame和页面模型。 &lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/aspnetx/201110/201110262331233390.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="clip_image001" alt="clip_image001" src="http://images.cnblogs.com/cnblogs_com/aspnetx/201110/201110262331233423.png" border="0" height="382" width="222" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;布局和分组控件&lt;/strong&gt; &lt;/p&gt;&lt;p&gt;布局控件通常指可以包含其它控件的控件，它包含其它控件和一些视觉元素。就像其名字一样，它用来定位其内部控件的位置。布局控件通常用在程序中一个页面的根布局。其它所有的控件都包含在这个根控件下面。当然如果需要，根布局控件也可以放入其它的布局控件。当新建一个Windows Phone程序的时候，一个Grid就作为布局的根元素被创建了。这个控件包含了其它的布局控件用来显示标题和内容。在内容部分也可以再填加布局控件。然而在选择具体用哪种布局控件，还要考虑程序是否要支持横屏切换。 &lt;/p&gt;&lt;p&gt;大多数布局控件都是继承自Panel类，比如StackPanel，Canvas和Grid。其它还有两个控件是Panorama和Pivot，这两个控件是继承自ItemsControl的，在Windows Phone程序里有特殊的用途，跟其它的列表控件有很大的不同，相比传统的列表控件可以包含大量的元素进来，而它们应尽量包含比较小数量的元素，他们主要是用来实现在不同的列表元素之间来回切换。 &lt;/p&gt;&lt;p&gt;下面列出在Windows Phone程序中的布局和分组控件。 &lt;/p&gt;&lt;p&gt;Border &lt;/p&gt;&lt;p&gt;用于在另一元素周围绘制边框或背景色。 &lt;/p&gt;&lt;p&gt;Canvas &lt;/p&gt;&lt;p&gt;里面的控件以坐标的方式显示 &lt;/p&gt;&lt;p&gt;ContentControl &lt;/p&gt;&lt;p&gt;单个元素的呈现容器。由于这个元素可以是一个类，所以这个元素也可以包含其它的子元素在里面。 &lt;/p&gt;&lt;p&gt;Grid &lt;/p&gt;&lt;p&gt;靠行列信息定位其中的元素。在Grid里可以定义若干行和列，然后指定元素放在哪一行哪一列。 &lt;/p&gt;&lt;p&gt;Panorama &lt;/p&gt;&lt;p&gt;全景视图，内部的元素可以一屏一屏地切换 &lt;/p&gt;&lt;p&gt;Pivot &lt;/p&gt;&lt;p&gt;这个控件可以用来作为在不同视图中切换或者过滤数据的导航接口，提供了一种方便的分组数据管理方式。 &lt;/p&gt;&lt;p&gt;StackPanel &lt;/p&gt;&lt;p&gt;以线性的方式呈现元素，支持横向和纵向。 &lt;/p&gt;&lt;p&gt;VirtualizingStackPanel &lt;/p&gt;&lt;p&gt;相比StackPanel，它对大量元素数据的处理性能要比较好。 &lt;/p&gt;&lt;p&gt;ScrollViewer &lt;/p&gt;&lt;p&gt;提供滚动条的方式显示内部的元素。 &lt;/p&gt;&lt;p&gt;下图显示控件在横屏和竖屏不同的显示形式，用到了StackPanel，Canvas和Grid。 &lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/aspnetx/201110/201110262331247982.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="clip_image002" alt="clip_image002" src="http://images.cnblogs.com/cnblogs_com/aspnetx/201110/20111026233126656.png" border="0" height="360" width="573" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;下图显示Panorama控件如何显示横向切换的内容。 &lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/aspnetx/201110/201110262331279741.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="clip_image003" alt="clip_image003" src="http://images.cnblogs.com/cnblogs_com/aspnetx/201110/201110262331297049.png" border="0" height="437" width="489" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;文本控件&lt;/strong&gt; &lt;/p&gt;&lt;p&gt;文本控件通常用来显示字符串的内容。根据不同的方式文本控件也有不同的种类。下表列出了Windows Phone程序中的文本控件。 &lt;/p&gt;&lt;p&gt;TextBlock &lt;/p&gt;&lt;p&gt;用来显示简单的只读方式的文本。 &lt;/p&gt;&lt;p&gt;TextBox &lt;/p&gt;&lt;p&gt;用来进行短文本的的录入。也可以进行大文本，多行的输入。 &lt;/p&gt;&lt;p&gt;PasswordBox &lt;/p&gt;&lt;p&gt;用来输入密码，输入的输入的密码会替换成*符号。 &lt;/p&gt;&lt;p&gt;下图演示基本的文本控件。 &lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/aspnetx/201110/201110262331294640.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="clip_image004" alt="clip_image004" src="http://images.cnblogs.com/cnblogs_com/aspnetx/201110/201110262331309199.png" border="0" height="444" width="241" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;按钮和选择控件&lt;/strong&gt; &lt;/p&gt;&lt;p&gt;按钮和选择控件使用户在程序中很方便地进行选取和导航。大多数按钮和选择控件都继承自ContentControl，也就是说其内容都是Content属性。这个属性的类型是Object，所以它们的内容受到的限制就要少很多，因为很多控件都是继承自Object类型的，这样就可以在ContentControl中以嵌套的方式创建控件。比如，按钮的Content属性内容可以设置成一个StackPanel控件，然后让它里面包含一张图片和文本。下图列出所有按钮控件。 &lt;/p&gt;&lt;p&gt;Button &lt;/p&gt;&lt;p&gt;通过Click事件响应按钮被按下按钮的事件。 &lt;/p&gt;&lt;p&gt;HyperlinkButton &lt;/p&gt;&lt;p&gt;按钮的形式以超链接的形式呈现。当被点击后，可以导航到用户指定的页面。 &lt;/p&gt;&lt;p&gt;下面的列表是选择控件 &lt;/p&gt;&lt;p&gt;CheckBox &lt;/p&gt;&lt;p&gt;复选框，可以标记用户的选取和取消选取的状态。 &lt;/p&gt;&lt;p&gt;RadioButton &lt;/p&gt;&lt;p&gt;单选框，允许用户在一堆选项中选取一个，通常是一组RadioButton组合在一起。 &lt;/p&gt;&lt;p&gt;Slider &lt;/p&gt;&lt;p&gt;让用户通过滑块的方式在一个范围内选取一个值。 &lt;/p&gt;&lt;p&gt;下图是按钮和选取控件的示例。 &lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/aspnetx/201110/201110262331325220.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="clip_image005" alt="clip_image005" src="http://images.cnblogs.com/cnblogs_com/aspnetx/201110/201110262331335319.png" border="0" height="443" width="245" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;列表控件&lt;/strong&gt; &lt;/p&gt;&lt;p&gt;元素以列表的形式呈现，主要有： &lt;/p&gt;&lt;p&gt;ListBox &lt;/p&gt;&lt;p&gt;用户可以以单击的方式选取列表中的元素。其内容是Items和ItemsSource。其中每一个元素都是可以通过DataTemplate自定义的。 &lt;/p&gt;&lt;p&gt;下图是列表控件的演示。 &lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/aspnetx/201110/201110262331348450.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="clip_image006" alt="clip_image006" src="http://images.cnblogs.com/cnblogs_com/aspnetx/201110/201110262331356663.png" border="0" height="448" width="246" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;图像，地图和媒体控件 &lt;/p&gt;&lt;p&gt;作为Windows Phone客户端富有表现力的展现方式，图片，地图和媒体是十分重要的方式。 &lt;/p&gt;&lt;p&gt;Image &lt;/p&gt;&lt;p&gt;显示图片。通过Source指定图片，Windows Phone支持PNG和JPG格式的图片。 &lt;/p&gt;&lt;p&gt;Map &lt;/p&gt;&lt;p&gt;显示Bing地图。可以在工具栏中直接使用。使用Bing地图你需要为你的程序获取一个Bing地图的Key。通过Mode指定地图的显示类型，ZoomLevel属性进行缩放。 &lt;/p&gt;&lt;p&gt;MediaElement &lt;/p&gt;&lt;p&gt;用来播放音频和视频。通过Source属性指定内容。然而由于性能原因，最好还是使用XNA框架的SoundEffect类。 &lt;/p&gt;&lt;p&gt;下图演示图片，地图和媒体控件. &lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/aspnetx/201110/20111026233136350.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="clip_image007" alt="clip_image007" src="http://images.cnblogs.com/cnblogs_com/aspnetx/201110/201110262331386404.png" border="0" height="451" width="245" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;HTML&lt;/strong&gt;&lt;strong&gt;控件&lt;/strong&gt; &lt;/p&gt;&lt;p&gt;用来在程序中显示HTML内容。主要通过WebBrowser。 &lt;/p&gt;&lt;p&gt;下图演示WebBrowser控件显示网页。 &lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/aspnetx/201110/20111026233139996.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="clip_image008" alt="clip_image008" src="http://images.cnblogs.com/cnblogs_com/aspnetx/201110/201110262331415272.png" border="0" height="445" width="243" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;进度和消息控件&lt;/strong&gt; &lt;/p&gt;&lt;p&gt;好的程序都会提供给用户比较好的反馈信息，比如对于长时间的操作提供一个进度显示条，通过消息框来显示发生的错误信息。下表列出支持的进度和消息组件。 &lt;/p&gt;&lt;p&gt;ProgressBar &lt;/p&gt;&lt;p&gt;显示当前操作的进度信息，用来报告一个操作的进度，或者指定进度条为不确定的模式，这种模式会降低程序的性能。 &lt;/p&gt;&lt;p&gt;Popup &lt;/p&gt;&lt;p&gt;在界面顶层弹出消息框。用于临时显示或者提示一些信息。通常的用法就是把一个用户空间作为Popup的Child属性。通过设置Popup属性的IsOpen属性指定其是否显示。 &lt;/p&gt;&lt;p&gt;下面演示Popup，其中包括TextBlock，Button和ProcessBar。 &lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/aspnetx/201110/201110262331414259.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="clip_image009" alt="clip_image009" src="http://images.cnblogs.com/cnblogs_com/aspnetx/201110/201110262331434947.png" border="0" height="443" width="236" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;ToolKit&lt;/strong&gt;&lt;strong&gt;控件&lt;/strong&gt; &lt;/p&gt;&lt;p&gt;在Codeplex的&lt;a href="http://silverlight.codeplex.com/"&gt;Silverlight for Windows Phone Toolkit&lt;/a&gt;中提供了更多的组件。里面包含了控件的源代码和示例。下表列出了目前所包含的控件。Toolkit中也包含了很多组件，比如页面的过度和手势识别。 &lt;/p&gt;&lt;p&gt;AutoCompleteBox &lt;/p&gt;&lt;p&gt;当用户输入文本信息的时候，一个下拉列表组件会根据当前输入的内容提示可能匹配的项目。 &lt;/p&gt;&lt;p&gt;ListPicker &lt;/p&gt;&lt;p&gt;当前选中的会以一个文本框的方式显示，选取的时候是通过下拉列表的形式。 &lt;/p&gt;&lt;p&gt;LongListSelector &lt;/p&gt;&lt;p&gt;以分组的方式显示大列表信息。 &lt;/p&gt;&lt;p&gt;ContextMenu &lt;/p&gt;&lt;p&gt;上下文菜单，用户长事件按住一个控件的时候出现。 &lt;/p&gt;&lt;p&gt;DatePicker &lt;/p&gt;&lt;p&gt;日期选取控件 &lt;/p&gt;&lt;p&gt;TimePicker &lt;/p&gt;&lt;p&gt;事件选取控件 &lt;/p&gt;&lt;p&gt;ToggleSwitch &lt;/p&gt;&lt;p&gt;开关控件 &lt;/p&gt;&lt;p&gt;WrapPanel &lt;/p&gt;&lt;p&gt;会根据内部的元素以行列的方式动态排布。当元素在当前行显示不下的时候，会自动在下一行显示。  &lt;/p&gt;&lt;img src="http://www.cnblogs.com/aspnetx/aggbug/2225882.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/aspnetx/archive/2011/10/26/2225882.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/aspnetx/archive/2011/10/24/2223180.html</id><title type="text">[翻译]WP7 QuickStart-第三篇-控件的基本使用</title><summary type="text">【译者注:这篇文章是翻译自微软官方的WP7 QuickStart的第三篇，讲述WP下控件的基本使用方法。部分内容加入了自己的理解和表达习惯。而翻译此系列的主要目的一是为了练习英语，二是让自己作为一个BI开发者对WP7的开发有一个了解。部分翻译不当的地方望各位高人指出批评指正】</summary><published>2011-10-24T14:27:00Z</published><updated>2011-10-24T14:27:00Z</updated><author><name>哥本哈士奇(aspnetx)</name><uri>http://www.cnblogs.com/aspnetx/</uri></author><link rel="alternate" href="http://www.cnblogs.com/aspnetx/archive/2011/10/24/2223180.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/aspnetx/archive/2011/10/24/2223180.html"/><content type="html">&lt;p&gt;&lt;/p&gt;&lt;p&gt;原文地址：&lt;a href="http://create.msdn.com/en-US/education/quickstarts/Using_Controls"&gt;http://create.msdn.com/en-US/education/quickstarts/Using_Controls&lt;/a&gt;  &lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;【译者注:这篇文章是翻译自微软官方的WP7 QuickStart的第三篇，讲述WP下控件的基本使用方法。部分内容加入了自己的理解和表达习惯。而翻译此系列的主要目的一是为了练习英语，二是让自己作为一个BI开发者对WP7的开发有一个了解。部分翻译不当的地方望各位高人指出批评指正】  &lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;控件，比如按钮，文本框和下拉列表等，是构成Windows Phone的Silverlight程序创建用户界面的基本元素。创建控件大致如下几个步骤：  &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;p&gt;此部分主要描述以下内容：  &lt;/p&gt;&lt;p&gt;控件示例  &lt;/p&gt;&lt;p&gt;填加控件  &lt;/p&gt;&lt;p&gt;给控件命名  &lt;/p&gt;&lt;p&gt;设置控件的属性  &lt;/p&gt;&lt;p&gt;创建事件处理代码  &lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;控件示例&lt;/strong&gt;  &lt;/p&gt;&lt;p&gt;下面的示例展示TextBox控件以及跟它关联的TextChanged事件的事件处理代码。你可以更改TextBox的文本信息看看示例的运行效果。  &lt;/p&gt;&lt;p&gt;&lt;object id="Controls1" data="data:application/x-silverlight-2," type="application/x-silverlight-2" height="550" width="400"&gt; &lt;param name="source" value="http://create.msdn.com/assets/cms/docs/QuickstartsXAP/UsingControls.xap" /&gt;&lt;param name="onerror" value="onSilverlightError" /&gt;&lt;param name="background" value="Transparent" /&gt;&lt;param name="windowless" value="true" /&gt;&lt;a href="http://go.microsoft.com/fwlink/?LinkID=115261" style="text-decoration: none;"&gt; &lt;img src="http://go.microsoft.com/fwlink/?LinkId=108181" alt="Get Microsoft Silverlight" style="border-style: none" /&gt; &lt;/a&gt; &lt;/object&gt; &lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;填加控件&lt;/strong&gt;  &lt;/p&gt;&lt;p&gt;填加Windows Phone控件有很多种方法：  &lt;/p&gt;&lt;p&gt;1. 从工具栏填加  &lt;/p&gt;&lt;p&gt;2. 在XAML视图中填加  &lt;/p&gt;&lt;p&gt;3. 通过后台代码填加  &lt;/p&gt;&lt;p&gt;下图是用Visual Studio开发Windows Phone的Silverlight应用程序界面。在Visual Studio中，当你填加和操作控件的时候，会用到很多编程时常用的功能，比如工具栏，设计视图，XAML视图以及属性窗体。  &lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/aspnetx/201110/201110242227049206.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="clip_image001" alt="clip_image001" src="http://images.cnblogs.com/cnblogs_com/aspnetx/201110/201110242227058499.png" border="0" height="204" width="244" /&gt;&lt;/a&gt;  &lt;/p&gt;&lt;p&gt;Visual Studio的工具栏显示在程序中你可以用的控件。下图列出了Windows Phone的一些控件。  &lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/aspnetx/201110/201110242227076746.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="clip_image002" alt="clip_image002" src="http://images.cnblogs.com/cnblogs_com/aspnetx/201110/201110242227084370.png" border="0" height="244" width="106" /&gt;&lt;/a&gt;  &lt;/p&gt;&lt;p&gt;提示：  &lt;/p&gt;&lt;p&gt;在Windows Phone Toolkit中还包括更多的控件。这个工具包中包含了大量在开发中用到的控件。随着这些控件的不断改进，有些已经被加入到运行时中，而有些控件直接被舍弃掉了。  &lt;/p&gt;&lt;p&gt;在工具栏中双击一个控件就可以填加到程序中。也可以通过拖拽的方式。当你在工具栏中双击TextBox控件的时候，下面的代码就被填加到了XAML视图中。  &lt;/p&gt;&lt;p&gt;XAML  &lt;/p&gt;&lt;p&gt;&amp;lt;TextBox Height="72" HorizontalAlignment="Left" Margin="10,10,0,0" Name="textBox1"  &lt;/p&gt;&lt;p&gt;Text="TextBox" VerticalAlignment="Top" Width="460" /&amp;gt;  &lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;给控件命名&lt;/strong&gt;  &lt;/p&gt;&lt;p&gt;每个控件都要有个名字，这样在后台代码才可以访问到。可以用过控件的Name属性给控件命名， 在Visual Studio的属性面板以及XAML视图中设置都可以。下图演示如何给当前选中的控件命名。  &lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/aspnetx/201110/201110242227092243.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="clip_image003" alt="clip_image003" src="http://images.cnblogs.com/cnblogs_com/aspnetx/201110/201110242227103455.png" border="0" height="150" width="244" /&gt;&lt;/a&gt;  &lt;/p&gt;&lt;p&gt;更改名称后可以看到XAML代码如下：  &lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/aspnetx/201110/201110242227109028.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="clip_image004" alt="clip_image004" src="http://images.cnblogs.com/cnblogs_com/aspnetx/201110/201110242227112964.png" border="0" height="37" width="244" /&gt;&lt;/a&gt;  &lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;设置控件的属性&lt;/strong&gt;  &lt;/p&gt;&lt;p&gt;可以通过设置控件的属性来更改控件的外观，内容以及其它的属性。即可以在属性窗体里设置，也可以在XAML视图中，以及在代码中。比如更改TextBox的前景色，可以通过设置Foreground属性。下图演示如何更改这个属性。  &lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/aspnetx/201110/201110242227113554.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="clip_image005" alt="clip_image005" src="http://images.cnblogs.com/cnblogs_com/aspnetx/201110/201110242227128636.png" border="0" height="244" width="190" /&gt;&lt;/a&gt;  &lt;/p&gt;&lt;p&gt;下图演示如何在XAML视图中更改这个属性。Visual Studio下是支持XAML代码的智能感知的。  &lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/aspnetx/201110/201110242227122573.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="clip_image006" alt="clip_image006" src="http://images.cnblogs.com/cnblogs_com/aspnetx/201110/201110242227124242.png" border="0" height="168" width="244" /&gt;&lt;/a&gt;  &lt;/p&gt;&lt;p&gt;更改后的代码如下所示。  &lt;/p&gt;&lt;p&gt;XAML  &lt;/p&gt;&lt;p&gt;&amp;lt;TextBox Height="72" HorizontalAlignment="Left" Margin="10,10,0,0"  &lt;/p&gt;&lt;p&gt;Name="MyTB" Text="TextBox" VerticalAlignment="Top" Width="460"  &lt;/p&gt;&lt;p&gt;Foreground="Red" /&amp;gt;  &lt;/p&gt;&lt;p&gt;下面的代码演示如何在后台代码中更改这个属性。  &lt;/p&gt;&lt;p&gt;SolidColorBrush scb = new SolidColorBrush(Colors.Red);  &lt;/p&gt;&lt;p&gt;MyTB.Foreground = scb;  &lt;/p&gt;&lt;p&gt;有些像Width，Height和Margin这样的属性，在设计视图里，可以通过选中然后利用鼠标操作来设定。下图演示了在设计视图中支持的调整功能。  &lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/aspnetx/201110/201110242227145836.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="clip_image007" alt="clip_image007" src="http://images.cnblogs.com/cnblogs_com/aspnetx/201110/201110242227151998.png" border="0" height="113" width="244" /&gt;&lt;/a&gt;  &lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;创建事件处理器&lt;/strong&gt;  &lt;/p&gt;&lt;p&gt;每个控件都有响应用户操作的事件。比如，按钮有单击事件。可以创建一个叫做事件处理器的方法来响应事件。创建事件即可以通过在属性窗体里设置，也可以通过代码来设置。  &lt;/p&gt;&lt;p&gt;在属性窗体创建事件处理代码的方法是点击事件标签。首先选中控件，然后单击属性窗体的事件标签，下面会列出这个控件支持的所有事件。下图就显示了其中的一些方法。  &lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/aspnetx/201110/20111024222715395.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="clip_image008" alt="clip_image008" src="http://images.cnblogs.com/cnblogs_com/aspnetx/201110/201110242227166557.png" border="0" height="244" width="190" /&gt;&lt;/a&gt;  &lt;/p&gt;&lt;p&gt;在属性窗体的事件名称里双击事件名称就可以创建一个事件处理代码，这时代码后置文件会在代码编辑器中打开。下面的代码就是为TextBox的TextChanged事件填加的事件处理代码。当TextBox内的文本变化的时候，下面的TextBlock的文本的内容就变成了：You entered text!  &lt;/p&gt;&lt;p&gt;C#  &lt;/p&gt;&lt;p&gt;private void MyTB_TextChanged(object sender, TextChangedEventArgs e)  &lt;/p&gt;&lt;p&gt;{  &lt;/p&gt;&lt;p&gt;MyBlock.Text = "You entered text!";  &lt;/p&gt;&lt;p&gt;}  &lt;/p&gt;&lt;p&gt;也可以在XAML视图中填加事件处理代码，当在相应位置输入事件名称的时候，XAML的智能感知会帮助你完成。  &lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/aspnetx/201110/201110242227168542.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="clip_image009" alt="clip_image009" src="http://images.cnblogs.com/cnblogs_com/aspnetx/201110/201110242227168575.png" border="0" height="177" width="244" /&gt;&lt;/a&gt;  &lt;/p&gt;&lt;p&gt;当敲玩事件名称后，在智能感知界面中双击&amp;lt;New Event Handler&amp;gt;就可以创建事件处理代码。  &lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/aspnetx/201110/201110242227179688.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="clip_image010" alt="clip_image010" src="http://images.cnblogs.com/cnblogs_com/aspnetx/201110/201110242227177213.png" border="0" height="32" width="244" /&gt;&lt;/a&gt;  &lt;/p&gt;&lt;p&gt;完成后的XAML代码。  &lt;/p&gt;&lt;p&gt;&amp;lt;TextBox Height="72" HorizontalAlignment="Left" Margin="10,10,0,0"  &lt;/p&gt;&lt;p&gt;Name="MyTB" Text="TextBox" VerticalAlignment="Top" Width="260"  &lt;/p&gt;&lt;p&gt;Foreground"Red"  &lt;/p&gt;&lt;p&gt;&lt;strong&gt;TextChanged="MyTB_TextChanged"&lt;/strong&gt; /&amp;gt;  &lt;/p&gt;&lt;p&gt;同样也可以在代码后置文件中来关联事件处理方法。  &lt;/p&gt;&lt;p&gt;C#  &lt;/p&gt;&lt;p&gt;MyTB.TextChanged +=new TextChangedEventHandler(MyTB_TextChanged);  &lt;/p&gt;&lt;p&gt;【译者注：这篇主要讲述了如何使用控件，并且控件的基本操作，以及如何相应控件的各个事件，总体来看跟通常的Silverlight是没有什么区别的。】   &lt;/p&gt;&lt;img src="http://www.cnblogs.com/aspnetx/aggbug/2223180.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/aspnetx/archive/2011/10/24/2223180.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry></feed>
