<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_Jake Lin</title><subtitle type="text">Windows Phone 7, Silverlight, WPF, Surface2</subtitle><id>http://feed.cnblogs.com/blog/u/26932/rss</id><updated>2012-01-06T07:21:21Z</updated><author><name>Jake Lin</name><uri>http://www.cnblogs.com/procoder/</uri></author><generator>CNBlogs BlogServer</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/procoder/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/26932/rss"/><entry><id>http://www.cnblogs.com/procoder/archive/2012/01/06/Windows-Phone-Databinding.html</id><title type="text">《Windows Phone 7程序设计》样章-《数据绑定》</title><summary type="text">在我看来数据绑定是XAML类程序（WPF，Silverlight，WP7，Windows8）最最关键的概念，也是MVVM模式的基础，如果一位开发者在开发XAML类程序时并没有用上数据绑定，那么我觉得他/她还没有掌握开发XAML类程序的能力。数据绑定可以说每个XAML类程序开发者必须掌握的基本技能之一。下面是《数据绑定》样章的一部分，如果觉得翻译的不错而且条件许可，请购买正版书，谢谢您为中国文化事业的贡献。如果觉得有问题请指出，我们会总结堪错列表，谢谢！</summary><published>2012-01-06T07:21:00Z</published><updated>2012-01-06T07:21:00Z</updated><author><name>Jake Lin</name><uri>http://www.cnblogs.com/procoder/</uri></author><link rel="alternate" href="http://www.cnblogs.com/procoder/archive/2012/01/06/Windows-Phone-Databinding.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/procoder/archive/2012/01/06/Windows-Phone-Databinding.html"/><content type="html">&lt;p&gt;在我看来数据绑定是XAML类程序（WPF，Silverlight，WP7，Windows8）最最关键的概念，也是MVVM模式的基础，如果一位开发者在开发XAML类程序时并没有用上数据绑定，那么我觉得他/她还没有掌握开发XAML类程序的能力。数据绑定可以说每个XAML类程序开发者必须掌握的基本技能之一。下面是《数据绑定》样章的一部分，如果觉得翻译的不错而且条件许可，请购买正版书，谢谢您为中国文化事业的贡献。如果觉得有问题请指出，我们会总结堪错列表，谢谢！&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;---------------------------------------------------------------以下是《数据绑定》样章的一部分-------------------------------------------------------------&lt;/p&gt; &lt;p&gt;假设你想让用户与Slider控件进行交互，而且你也想与ColorScroll程序一样，通过TextBlock显示Slider当前的值。其实很简单。只要为Slider控件的ValueChanged事件创建一个处理程序就可以了，当调用处理程序的时候，从Slider取出Value属性的值并将其转换成字符串，然后把该字符串设置给TextBlock的Text属性。 &lt;br /&gt;像这样的任务非常普遍，因此Silverlight提供了一种简便的机制来实现这些任务。这种机制称为数据绑定（data binding），或者就简称为绑定（binding）。数据绑定是一个对象的一个属性与另外一个对象的一个属性之间的一条链接（link），因此在绑定的情况下当一个属性发生改变时，另一个属性也随之更新。绑定可以是双向的（bidirectional），在这种情况下，其中一个属性发生的变化会引起另一个属性也随之发生变化。&lt;/p&gt; &lt;p&gt;从本质上说，数据绑定可能像你所期望的那样：由于注册了一个事件处理程序，使得一个属性从另外一个属性中获取更新，期间可能进行了一些数据转换。通常你可以完全通过XAML来定义数据绑定，这意味着你不必编写任何代码。从语法上看，这好像不需要移动任何部件就能传输数据了。&lt;/p&gt; &lt;p&gt;演示数据绑定最简单的方法是使用两个可视化元素，例如Slider和TextBlock元素，我也从这两个元素开始。但是，如果把可视化元素和基础数据源进行绑定的话，更能体现出数据绑定的强大威力。&lt;/p&gt; &lt;p&gt;本章的目标是避免在代码隐藏文件中显式地使用事件处理程序，但是在本章的结束部分我不得不使用几个事件处理程序。当然，我们还是需要一些其他代码来支持XAML中的数据绑定，但这些代码中的大部分可以恰当地归类为业务对象（business object），而不是用户界面元素。&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;绑定源与目标&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;在典型的数据绑定中，一个对象的属性发生变化时，另一个对象的属性也随之自动更新。提供数据的对象，例如Slider，被认为是数据绑定的源（source）；接收数据的对象（如TextBlock）是绑定的目标（target）。 &lt;br /&gt;通常给数据绑定源指定一个名字：&lt;/p&gt;&lt;pre &gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Slider &lt;/span&gt;&lt;span style="color: red"&gt;Name&lt;/span&gt;&lt;span style="color: blue"&gt;="slider"  .../&amp;gt;&#xD;
&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;style type="text/css"&gt;&#xD;
.csharpcode, .csharpcode pre&#xD;
{&#xD;
	font-size: small;&#xD;
	color: black;&#xD;
	font-family: consolas, "Courier New", courier, monospace;&#xD;
	background-color: #ffffff;&#xD;
	/*white-space: pre;*/&#xD;
}&#xD;
.csharpcode pre { margin: 0em; }&#xD;
.csharpcode .rem { color: #008000; }&#xD;
.csharpcode .kwrd { color: #0000ff; }&#xD;
.csharpcode .str { color: #006080; }&#xD;
.csharpcode .op { color: #0000c0; }&#xD;
.csharpcode .preproc { color: #cc6633; }&#xD;
.csharpcode .asp { background-color: #ffff00; }&#xD;
.csharpcode .html { color: #800000; }&#xD;
.csharpcode .attr { color: #ff0000; }&#xD;
.csharpcode .alt &#xD;
{&#xD;
	background-color: #f4f4f4;&#xD;
	width: 100%;&#xD;
	margin: 0em;&#xD;
}&#xD;
.csharpcode .lnum { color: #606060; }&lt;/style&gt;&#xD;
&#xD;
&lt;p&gt;你可以把目标属性作为一个属性元素 并赋值给类型为Binding的对象：&lt;/p&gt;&lt;pre &gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;TextBlock &lt;/span&gt;&lt;span style="color: blue"&gt;...&amp;gt; &#xD;
            &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;TextBlock.Text&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt; &#xD;
                &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Binding &lt;/span&gt;&lt;span style="color: red"&gt;ElementName&lt;/span&gt;&lt;span style="color: blue"&gt;="slider" &lt;/span&gt;&lt;span style="color: red"&gt;Path&lt;/span&gt;&lt;span style="color: blue"&gt;="Value" /&amp;gt; &#xD;
            &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;TextBlock.Text&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
        &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;TextBlock&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;style type="text/css"&gt;&#xD;
.csharpcode, .csharpcode pre&#xD;
{&#xD;
	font-size: small;&#xD;
	color: black;&#xD;
	font-family: consolas, "Courier New", courier, monospace;&#xD;
	background-color: #ffffff;&#xD;
	/*white-space: pre;*/&#xD;
}&#xD;
.csharpcode pre { margin: 0em; }&#xD;
.csharpcode .rem { color: #008000; }&#xD;
.csharpcode .kwrd { color: #0000ff; }&#xD;
.csharpcode .str { color: #006080; }&#xD;
.csharpcode .op { color: #0000c0; }&#xD;
.csharpcode .preproc { color: #cc6633; }&#xD;
.csharpcode .asp { background-color: #ffff00; }&#xD;
.csharpcode .html { color: #800000; }&#xD;
.csharpcode .attr { color: #ff0000; }&#xD;
.csharpcode .alt &#xD;
{&#xD;
	background-color: #f4f4f4;&#xD;
	width: 100%;&#xD;
	margin: 0em;&#xD;
}&#xD;
.csharpcode .lnum { color: #606060; }&lt;/style&gt;&#xD;
&#xD;
&lt;p&gt;使用ElementName属性指定源元素的名称；使用Path属性指定源属性的名称，在这个例子中Path是Slider的Value属性。有时候把这种类型的绑定称为元素名称绑定，因为绑定源是一个可视化元素，并通过名称来引用。&lt;/p&gt;&#xD;
&lt;p&gt;为了使语法变得更加友好，Silverlight为Binding提供了一个标记扩展（markup extension），在此，所有的东西都定义在一对花括号里面。（这是Silverlight for Windows Phone的几个标记扩展中的一个。第7章介绍过StaticResource，第16章将介绍TemplateBinding。）这里是更精简的语法：&lt;/p&gt;&lt;pre &gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;TextBlock &lt;/span&gt;&lt;span style="color: blue"&gt;... &lt;/span&gt;&lt;span style="color: red"&gt;Text&lt;/span&gt;&lt;span style="color: blue"&gt;="{&lt;/span&gt;&lt;span style="color: #a31515"&gt;Binding &lt;/span&gt;&lt;span style="color: red"&gt;ElementName&lt;/span&gt;&lt;span style="color: blue"&gt;=slider, &lt;/span&gt;&lt;span style="color: red"&gt;Path&lt;/span&gt;&lt;span style="color: blue"&gt;=Value}" ... /&amp;gt;&#xD;
&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;p&gt;请注意，ElementName和Path的设置用一个逗号分隔，而slider和Value名称的引号已经去掉了。引号永远都不会出现在标记扩展的大括号中。 &lt;br /&gt;SliderBindings程序使用了这样的绑定方式，你可以试验一下，尝试做一些修改。这一切都在XAML文件里面：&lt;/p&gt;&lt;pre &gt;&lt;span style="color: #a31515"&gt;Silverlight项目：SliderBindings　　文件：MainPage.xaml（节选）&#xD;
        &lt;/span&gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Grid &lt;/span&gt;&lt;span style="color: red"&gt;x&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: red"&gt;Name&lt;/span&gt;&lt;span style="color: blue"&gt;="ContentPanel" &lt;/span&gt;&lt;span style="color: red"&gt;Grid.Row&lt;/span&gt;&lt;span style="color: blue"&gt;="1" &lt;/span&gt;&lt;span style="color: red"&gt;Margin&lt;/span&gt;&lt;span style="color: blue"&gt;="12,0,12,0"&amp;gt;&#xD;
            &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Grid.RowDefinitions&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
                &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;RowDefinition &lt;/span&gt;&lt;span style="color: red"&gt;Height&lt;/span&gt;&lt;span style="color: blue"&gt;="*" /&amp;gt;&#xD;
                &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;RowDefinition &lt;/span&gt;&lt;span style="color: red"&gt;Height&lt;/span&gt;&lt;span style="color: blue"&gt;="*" /&amp;gt;&#xD;
                &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;RowDefinition &lt;/span&gt;&lt;span style="color: red"&gt;Height&lt;/span&gt;&lt;span style="color: blue"&gt;="*" /&amp;gt;&#xD;
            &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Grid.RowDefinitions&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
&#xD;
            &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Slider &lt;/span&gt;&lt;span style="color: red"&gt;Name&lt;/span&gt;&lt;span style="color: blue"&gt;="slider" &#xD;
            &lt;/span&gt;&lt;span style="color: red"&gt;Value&lt;/span&gt;&lt;span style="color: blue"&gt;="90"&#xD;
            &lt;/span&gt;&lt;span style="color: red"&gt;Grid.Row&lt;/span&gt;&lt;span style="color: blue"&gt;="0"&#xD;
            &lt;/span&gt;&lt;span style="color: red"&gt;Maximum&lt;/span&gt;&lt;span style="color: blue"&gt;="180"&#xD;
            &lt;/span&gt;&lt;span style="color: red"&gt;Margin&lt;/span&gt;&lt;span style="color: blue"&gt;="24" /&amp;gt;&#xD;
&#xD;
            &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;TextBlock &lt;/span&gt;&lt;span style="color: red"&gt;Name&lt;/span&gt;&lt;span style="color: blue"&gt;="txtblk" &#xD;
               &lt;/span&gt;&lt;span style="color: red"&gt;Text&lt;/span&gt;&lt;span style="color: blue"&gt;="{&lt;/span&gt;&lt;span style="color: #a31515"&gt;Binding &lt;/span&gt;&lt;span style="color: red"&gt;ElementName&lt;/span&gt;&lt;span style="color: blue"&gt;=slider, &lt;/span&gt;&lt;span style="color: red"&gt;Path&lt;/span&gt;&lt;span style="color: blue"&gt;=Value}" &#xD;
               &lt;/span&gt;&lt;span style="color: red"&gt;Grid.Row&lt;/span&gt;&lt;span style="color: blue"&gt;="1"&#xD;
               &lt;/span&gt;&lt;span style="color: red"&gt;FontSize&lt;/span&gt;&lt;span style="color: blue"&gt;="48"&#xD;
               &lt;/span&gt;&lt;span style="color: red"&gt;HorizontalAlignment&lt;/span&gt;&lt;span style="color: blue"&gt;="Center"&#xD;
               &lt;/span&gt;&lt;span style="color: red"&gt;VerticalAlignment&lt;/span&gt;&lt;span style="color: blue"&gt;="Center" /&amp;gt;&#xD;
&#xD;
            &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Rectangle &lt;/span&gt;&lt;span style="color: red"&gt;Grid.Row&lt;/span&gt;&lt;span style="color: blue"&gt;="2"&#xD;
&#xD;
&#xD;
               &lt;/span&gt;&lt;span style="color: red"&gt;Width&lt;/span&gt;&lt;span style="color: blue"&gt;="{&lt;/span&gt;&lt;span style="color: #a31515"&gt;Binding &lt;/span&gt;&lt;span style="color: red"&gt;ElementName&lt;/span&gt;&lt;span style="color: blue"&gt;=slider, &lt;/span&gt;&lt;span style="color: red"&gt;Path&lt;/span&gt;&lt;span style="color: blue"&gt;=Value}"&#xD;
               &lt;/span&gt;&lt;span style="color: red"&gt;RenderTransformOrigin&lt;/span&gt;&lt;span style="color: blue"&gt;="0.5 0.5"&#xD;
               &lt;/span&gt;&lt;span style="color: red"&gt;Fill&lt;/span&gt;&lt;span style="color: blue"&gt;="Blue"&amp;gt;&#xD;
                &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Rectangle.RenderTransform&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
                    &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;RotateTransform &lt;/span&gt;&lt;span style="color: red"&gt;x&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: red"&gt;Name&lt;/span&gt;&lt;span style="color: blue"&gt;="rotate" &#xD;
                             &lt;/span&gt;&lt;span style="color: red"&gt;Angle&lt;/span&gt;&lt;span style="color: blue"&gt;="90" /&amp;gt;&#xD;
                &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Rectangle.RenderTransform&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
            &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Rectangle&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
        &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Grid&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;p&gt;这个页面包含了一个范围从0到180的Slider，以及一个TextBlock，TextBlock的Text属性绑定到Slider的Value属性上，另外还有一个Rectangle，它的Width属性也绑定到Slider相同的Value属性上。Rectangle还有一个RotateTransform属性，这个属性使得Rectangle元素旋转了90&amp;#176;。&lt;/p&gt;&#xD;
&lt;p&gt;操作Slider时，TextBlock显示Slider的值，而Rectangle的高度也随之变大或者变小。（Binding的目标是Rectangle的Width属性，而Rectangle的转角是90&amp;#176;。）&lt;/p&gt;&#xD;
&lt;p&gt;在Binding扩展标记中，属性的顺序无关紧要。你可以把Path属性放在前面：&lt;/p&gt;&lt;pre &gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;TextBlock &lt;/span&gt;&lt;span style="color: blue"&gt;... &lt;/span&gt;&lt;span style="color: red"&gt;Text&lt;/span&gt;&lt;span style="color: blue"&gt;="{&lt;/span&gt;&lt;span style="color: #a31515"&gt;Binding &lt;/span&gt;&lt;span style="color: red"&gt;Path&lt;/span&gt;&lt;span style="color: blue"&gt;=Value, &lt;/span&gt;&lt;span style="color: red"&gt;ElementName&lt;/span&gt;&lt;span style="color: blue"&gt;=slider}"&#xD;
&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;p&gt;事实上，如果路径出现第一个位置上，可以删除&amp;#8220;Path=&amp;#8221;部分，只是使用属性名：&lt;/p&gt;&lt;pre &gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;TextBlock &lt;/span&gt;&lt;span style="color: blue"&gt;... &lt;/span&gt;&lt;span style="color: red"&gt;Text&lt;/span&gt;&lt;span style="color: blue"&gt;="{&lt;/span&gt;&lt;span style="color: #a31515"&gt;Binding &lt;/span&gt;&lt;span style="color: red"&gt;Value&lt;/span&gt;&lt;span style="color: blue"&gt;, &lt;/span&gt;&lt;span style="color: red"&gt;ElementName&lt;/span&gt;&lt;span style="color: blue"&gt;=slider}"&#xD;
&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;p&gt;在本章的后面以及随后的章节中，我将使用这种缩略形式的语法，但对于元素名称绑定，我却不喜欢这样做，因为这样做我就无法知道绑定底层的工作原理。Binding类首先需要在可视化树中找到一个名为slider的元素，然后它需要使用反射来找到该元素的Value属性。我偏向于下面这样的语法，这种语法按照内部操作的过程来排列属性的顺序：&lt;/p&gt;&lt;pre &gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;TextBlock &lt;/span&gt;&lt;span style="color: blue"&gt;... &lt;/span&gt;&lt;span style="color: red"&gt;Text&lt;/span&gt;&lt;span style="color: blue"&gt;="{&lt;/span&gt;&lt;span style="color: #a31515"&gt;Binding &lt;/span&gt;&lt;span style="color: red"&gt;ElementName&lt;/span&gt;&lt;span style="color: blue"&gt;=slider, &lt;/span&gt;&lt;span style="color: red"&gt;Path&lt;/span&gt;&lt;span style="color: blue"&gt;=Value}"&#xD;
&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;p&gt;为什么Binding的这个属性叫做Path而不是Property呢？毕竟，Style类就有一个叫做Property的属性。为什么Binding却没有呢？&lt;/p&gt;&#xD;
&lt;p&gt;简单的答案是Path能把多个属性名组合在一起使用。例如，假设Slider没有名称。如果你知道该Slider是ContentPanel元素的Children集合的第一个子元素，你可以间接地引用Slider：&lt;/p&gt;&lt;pre &gt;&lt;span style="color: #a31515"&gt;Text="{Binding ElementName=ContentPanel, Path=Children[0].Value}"&#xD;
&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;p&gt;或者，使用可视化树更上一层的元素：&lt;/p&gt;&lt;pre &gt;&lt;span style="color: #a31515"&gt;Text="{Binding ElementName=LayoutRoot, Path=Children[1].Children[0].Value}"&#xD;
&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;p&gt;Path的组成部件必须是通过点号连接的属性或者索引器（indexer）。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;Target和Mode&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;绑定包含一个源和一个目标。绑定目标被认为是绑定要设置的属性，该属性必须始终都是一个依赖属性，永远都是。当你在代码中创建绑定的时候，这一限制非常明显。&lt;/p&gt;&#xD;
&lt;p&gt;修改一下SliderBindings程序，删除TextBlock的Text属性上的绑定。在MainPage.xaml.cs文件中，你需要添加using指令来引用System.Windows.Data命名空间，这个命名空间包含了Binding类。在构造函数里面，调用完InitializeComponent函数之后，生成一个类型为Binding的对象，并设置它的属性：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&lt;pre &gt;&lt;span style="color: #2b91af"&gt;Binding &lt;/span&gt;binding = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Binding&lt;/span&gt;();&#xD;
binding.ElementName = &lt;span style="color: #a31515"&gt;"slider"&lt;/span&gt;;&#xD;
binding.Path = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;PropertyPath&lt;/span&gt;(&lt;span style="color: #a31515"&gt;"Value"&lt;/span&gt;);&#xD;
&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;ElementName和Path属性是绑定源。下面看看将TextBlock的Text属性作为绑定目标的代码：&lt;/p&gt;&lt;pre &gt;&lt;span style="color: red"&gt;txtblk&lt;/span&gt;.SetBinding(&lt;span style="color: #2b91af"&gt;TextBlock&lt;/span&gt;.TextProperty, &lt;span style="color: red"&gt;binding&lt;/span&gt;);&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;SetBinding方法定义在FrameworkElement里面，第一个参数是依赖属性，也就是目标属性。该目标也是调用SetBinding方法的元素。你也可以使用其他替代方案，使用静态方法BindingOperations.SetBinding来绑定目标：&lt;/p&gt;&lt;pre &gt;&lt;span style="color: #2b91af"&gt;BindingOperations&lt;/span&gt;.SetBinding(&lt;span style="color: red"&gt;txtblk&lt;/span&gt;, &lt;span style="color: #2b91af"&gt;TextBlock&lt;/span&gt;.TextProperty, &lt;span style="color: red"&gt;binding&lt;/span&gt;);&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;但你仍然需要依赖属性。因此，这就是可视化对象的属性应该是依赖属性的另一个原因。你不仅可以为这些属性定制样式，而且可以把它们制作成动画，但所有这些数据绑定的目标必须是依赖属性。&lt;/p&gt;&#xD;
&lt;p&gt;就依赖属性的优先级而论，数据绑定与本地设置的级别相同。&lt;/p&gt;&#xD;
&lt;p&gt;使用BindingOperations.SetBinding方法意味着你可以在任何依赖属性上设置绑定。对于Silverlight for Windows Phone来说，事实并非如此。在Windows Phone中绑定的目标必须是FrameworkElement的属性。&lt;/p&gt;&#xD;
&lt;p&gt;例如，你会发现在MainPage.xaml中的Rectangle元素包含了RotateTransform属性，该属性设置为一个RotateTransform对象。尝试把TextBlock的Text属性和Rectangle的Width属性上的绑定也应用到Angle属性上：&lt;/p&gt;&lt;pre &gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;RotateTransform &lt;/span&gt;&lt;span style="color: red"&gt;x&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: red"&gt;Name&lt;/span&gt;&lt;span style="color: blue"&gt;="rotate"  &#xD;
                 &lt;/span&gt;&lt;span style="color: red"&gt;Angle&lt;/span&gt;&lt;span style="color: blue"&gt;="{&lt;/span&gt;&lt;span style="color: #a31515"&gt;Binding &lt;/span&gt;&lt;span style="color: red"&gt;ElementName&lt;/span&gt;&lt;span style="color: blue"&gt;=slider, &lt;/span&gt;&lt;span style="color: red"&gt;Path&lt;/span&gt;&lt;span style="color: blue"&gt;=Value}" /&amp;gt;&#xD;
&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;p&gt;这看起来好像没问题，但却不能正常工作。你会在运行时得到一个XamlParseException异常。Angle本身是依赖属性，不是条件充足了吗？但是RotateTransform并不是派生自FrameworkElement，所以它不可以作为绑定的目标。（在Silverlight 4中，应用于RotateTransform的Angle属性的绑定可以正常工作。但是Silverlight for Windows Phone大体上还是Silverlight 3 。）&lt;/p&gt;&#xD;
&lt;p&gt;如果想要这么做，你需要删除RotateTransform的Angle属性上的绑定，以及已添加到MainPage.xaml.cs的所有代码。把Slider的Value属性的值初始化为90：&lt;/p&gt;&lt;pre &gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Slider &lt;/span&gt;&lt;span style="color: red"&gt;Name&lt;/span&gt;&lt;span style="color: blue"&gt;="slider" &#xD;
        &lt;/span&gt;&lt;span style="color: red"&gt;Value&lt;/span&gt;&lt;span style="color: blue"&gt;="90" ... /&amp;gt;&#xD;
&#xD;
&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;p&gt;绑定的目标是TextBlock的Text属性：&lt;/p&gt;&lt;pre &gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;TextBlock &lt;/span&gt;&lt;span style="color: red"&gt;Name&lt;/span&gt;&lt;span style="color: blue"&gt;="txtblk" &#xD;
           &lt;/span&gt;&lt;span style="color: red"&gt;Text&lt;/span&gt;&lt;span style="color: blue"&gt;="{&lt;/span&gt;&lt;span style="color: #a31515"&gt;Binding &lt;/span&gt;&lt;span style="color: red"&gt;ElementName&lt;/span&gt;&lt;span style="color: blue"&gt;=slider, &lt;/span&gt;&lt;span style="color: red"&gt;Path&lt;/span&gt;&lt;span style="color: blue"&gt;=Value}" ... /&amp;gt;&#xD;
&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;p&gt;让我们切换一下，把TextBlock的Text属性初始化为90：&lt;/p&gt;&lt;pre &gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;TextBlock &lt;/span&gt;&lt;span style="color: red"&gt;Name&lt;/span&gt;&lt;span style="color: blue"&gt;="txtblk"  &#xD;
           &lt;/span&gt;&lt;span style="color: red"&gt;Text&lt;/span&gt;&lt;span style="color: blue"&gt;="90"  .../&amp;gt;&#xD;
&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;p&gt;然后把Slider的Value属性作为绑定目标：&lt;/p&gt;&lt;pre &gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Slider &lt;/span&gt;&lt;span style="color: red"&gt;Name&lt;/span&gt;&lt;span style="color: blue"&gt;="slider"  &#xD;
        &lt;/span&gt;&lt;span style="color: red"&gt;Value&lt;/span&gt;&lt;span style="color: blue"&gt;="{&lt;/span&gt;&lt;span style="color: #a31515"&gt;Binding &lt;/span&gt;&lt;span style="color: red"&gt;ElementName&lt;/span&gt;&lt;span style="color: blue"&gt;=txtblk, &lt;/span&gt;&lt;span style="color: red"&gt;Path&lt;/span&gt;&lt;span style="color: blue"&gt;=Text}" .../&amp;gt;&#xD;
&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;p&gt;乍一看这似乎能正常地工作。Slider的滚动块最初放在中间，这表示Slider的值为90，该值从TextBlock获取，而Rectangle的大小仍然与Slider绑定。然而，当你滑动Slider时，Rectangle的高度改变了，但TextBlock却没有发生任何变化。Slider上的Binding对象正等待着TextBlock的Text属性发生变化，但Text属性没有任何的改变。&lt;/p&gt;&#xD;
&lt;p&gt;现在为Slider上的绑定添加Mode设置，下面的代码表示这个数据绑定是双向（two-way）的。&lt;/p&gt;&lt;pre &gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Slider &lt;/span&gt;&lt;span style="color: red"&gt;Name&lt;/span&gt;&lt;span style="color: blue"&gt;="slider"  &#xD;
        &lt;/span&gt;&lt;span style="color: red"&gt;Value&lt;/span&gt;&lt;span style="color: blue"&gt;="{&lt;/span&gt;&lt;span style="color: #a31515"&gt;Binding &lt;/span&gt;&lt;span style="color: red"&gt;ElementName&lt;/span&gt;&lt;span style="color: blue"&gt;=txtblk, &lt;/span&gt;&lt;span style="color: red"&gt;Path&lt;/span&gt;&lt;span style="color: blue"&gt;=Text, &lt;/span&gt;&lt;span style="color: red"&gt;Mode&lt;/span&gt;&lt;span style="color: blue"&gt;=TwoWay}" .../&amp;gt;&#xD;
&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;p&gt;现在能正常工作了！绑定的目标仍然是Slider的Value属性。TextBlock的Text属性变化时会影响Slider的Value属性，同样，现在Slider的Value属性变化时也反过来影响到TextBlock。&lt;/p&gt;&#xD;
&lt;p&gt;Mode属性的值为BindingMode枚举类型的成员。Mode属性的默认值是BindingMode. OneWay，除此之外还有BindingMode.TwoWay和BindingMode.OneTime，BindingMode. OneTime表示源只传输一次数据到目标。&lt;/p&gt;&#xD;
&lt;p&gt;使用同样的技巧，可以为RotateTransform的Angle属性建立起绑定关系。首先，把TextBlock上的绑定还原到原始状态：&lt;/p&gt;&lt;pre &gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;TextBlock &lt;/span&gt;&lt;span style="color: red"&gt;Name&lt;/span&gt;&lt;span style="color: blue"&gt;="txtblk"  &#xD;
           &lt;/span&gt;&lt;span style="color: red"&gt;Text&lt;/span&gt;&lt;span style="color: blue"&gt;="{&lt;/span&gt;&lt;span style="color: #a31515"&gt;Binding &lt;/span&gt;&lt;span style="color: red"&gt;ElementName&lt;/span&gt;&lt;span style="color: blue"&gt;=slider, &lt;/span&gt;&lt;span style="color: red"&gt;Path&lt;/span&gt;&lt;span style="color: blue"&gt;=Value}" .../&amp;gt;&#xD;
&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;p&gt;现在为Slider设置双向绑定，指向RotateTransform的Angle属性：&lt;/p&gt;&lt;pre &gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Slider &lt;/span&gt;&lt;span style="color: red"&gt;Name&lt;/span&gt;&lt;span style="color: blue"&gt;="slider"  &#xD;
        &lt;/span&gt;&lt;span style="color: red"&gt;Value&lt;/span&gt;&lt;span style="color: blue"&gt;="{&lt;/span&gt;&lt;span style="color: #a31515"&gt;Binding &lt;/span&gt;&lt;span style="color: red"&gt;ElementName&lt;/span&gt;&lt;span style="color: blue"&gt;=rotate, &lt;/span&gt;&lt;span style="color: red"&gt;Path&lt;/span&gt;&lt;span style="color: blue"&gt;=Angle, &lt;/span&gt;&lt;span style="color: red"&gt;Mode&lt;/span&gt;&lt;span style="color: blue"&gt;=TwoWay}" .../&amp;gt;&#xD;
&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;p&gt;运行得很好！当滑动Slider时，Rectangle元素也相应地旋转，如图12-1所示。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img alt="enter image description here" src="http://www.ituring.com.cn/download/01QipGyV9T4I" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;绑定转换器&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;当你运行SliderBindings程序时（或者当你看到该截图的时候会感到惊讶），开始的时候你可能看到TextBlock显示Slider的值有时是整数，有时是包含一或两个小数位的浮点数，但更多的时候看到的是15位的双精度浮点数。&lt;/p&gt;&#xD;
&lt;p&gt;有办法解决这个问题吗？&lt;/p&gt;&#xD;
&lt;p&gt;有，Binding类的其中一个叫做Converter的属性，这个属性的作用是引用一个可以在从源到目标的过程中进行数据转换的类，（如果有需要）也可以从目标转换回源。显然，我们已经使用了一些隐式的数据转换，例如数字转换为字符串，或者字符串转换为数字。但是，我们可以提供一些更明确的手段来协助转换的过程。 &lt;br /&gt;Binding类Converter属性是IValueConverter类型，IValueConverter是一个接口，它包含了两个方法：Convert和ConvertBack。Convert方法处理从源到目标的数据转换，而ConvertBack方法处理TwoWay（双向）绑定时另外一个方向的转换。&lt;/p&gt;&#xD;
&lt;p&gt;如果你的转换类从来不使用在双向绑定上，那么在ConvertBack方法中简单地返回null就可以了。 &lt;br /&gt;为了给SliderBindings程序添加一个简单的转换器，在项目中增加一个名为Truncation- Converter的类。其实这个类已经在项目中，如下所示：&lt;/p&gt;&lt;pre &gt;Silverlight项目：SliderBindings　　文件：TruncationConverter.cs&#xD;
&lt;span style="color: blue"&gt;using &lt;/span&gt;System;&#xD;
&lt;span style="color: blue"&gt;using &lt;/span&gt;System.Globalization;&#xD;
&lt;span style="color: blue"&gt;using &lt;/span&gt;System.Windows.Data;&#xD;
&#xD;
&lt;span style="color: blue"&gt;namespace &lt;/span&gt;SliderBindings&#xD;
{&#xD;
    &lt;span style="color: blue"&gt;public class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;TruncationConverter &lt;/span&gt;: &lt;span style="color: #2b91af"&gt;IValueConverter&#xD;
    &lt;/span&gt;{&#xD;
        &lt;span style="color: blue"&gt;public object &lt;/span&gt;Convert(&lt;span style="color: blue"&gt;object &lt;/span&gt;value, &lt;span style="color: #2b91af"&gt;Type &lt;/span&gt;targetType, &#xD;
                              &lt;span style="color: blue"&gt;object &lt;/span&gt;parameter, &lt;span style="color: #2b91af"&gt;CultureInfo &lt;/span&gt;culture)&#xD;
        {&#xD;
            &lt;span style="color: blue"&gt;if &lt;/span&gt;(value &lt;span style="color: blue"&gt;is double&lt;/span&gt;)&#xD;
                &lt;span style="color: blue"&gt;return &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Math&lt;/span&gt;.Round((&lt;span style="color: blue"&gt;double&lt;/span&gt;)value);&#xD;
&#xD;
            &lt;span style="color: blue"&gt;return &lt;/span&gt;value;&#xD;
        }&#xD;
&#xD;
        &lt;span style="color: blue"&gt;public object &lt;/span&gt;ConvertBack(&lt;span style="color: blue"&gt;object &lt;/span&gt;value, &lt;span style="color: #2b91af"&gt;Type &lt;/span&gt;targetType, &#xD;
                                  &lt;span style="color: blue"&gt;object &lt;/span&gt;parameter, &lt;span style="color: #2b91af"&gt;CultureInfo &lt;/span&gt;culture)&#xD;
        {&#xD;
            &lt;span style="color: blue"&gt;return &lt;/span&gt;value;&#xD;
        }&#xD;
    }&#xD;
}&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;Convert方法的value参数是从源传递到目标的对象。这个方法检查value是否为double类型。如果是double，那么显式地调用Math.Round方法把value转换成double。&lt;/p&gt;&#xD;
&lt;p&gt;如果需要在MainPage.xaml引用这个类，你需要使用XML命名空间声明：&lt;/p&gt;&lt;pre &gt;&lt;span style="color: #a31515"&gt;xmlns:local="clr-namespace:SliderBindings"&#xD;
&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;p&gt;然后把TruncationConverter类作为资源：&lt;/p&gt;&lt;pre &gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;phone&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;PhoneApplicationPage.Resources&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
            &amp;lt;&lt;/span&gt;&lt;span style="color: red"&gt;local&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: red"&gt;TruncationConverter x&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: red"&gt;Key&lt;/span&gt;&lt;span style="color: blue"&gt;="truncate" /&amp;gt;&#xD;
            &lt;/span&gt;&lt;span style="color: #a31515"&gt;...&#xD;
        &lt;/span&gt;&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;phone&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;PhoneApplicationPage.Resources&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;p&gt;你会发现这些已经存在于SliderBindings项目的MainPage.xaml文件中了。&lt;/p&gt;&#xD;
&lt;p&gt;然后Binding扩展标记就可以引用这个资源：&lt;/p&gt;&lt;pre &gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;TextBlock &lt;/span&gt;&lt;span style="color: red"&gt;Name&lt;/span&gt;&lt;span style="color: blue"&gt;="txtblk" &#xD;
           &lt;/span&gt;&lt;span style="color: red"&gt;Text&lt;/span&gt;&lt;span style="color: blue"&gt;="{&lt;/span&gt;&lt;span style="color: #a31515"&gt;Binding &lt;/span&gt;&lt;span style="color: red"&gt;ElementName&lt;/span&gt;&lt;span style="color: blue"&gt;=slider, &#xD;
                          &lt;/span&gt;&lt;span style="color: red"&gt;Path&lt;/span&gt;&lt;span style="color: blue"&gt;=Value, &#xD;
&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;p&gt;我把扩展标记分成三行使各个部件更加清晰可见。注意StaticResource也是一个扩展标记，它嵌套在第一个标记扩展中，因此整个表达式包含了两个花括号。&lt;/p&gt;&#xD;
&lt;p&gt;现在TextBlock显示的数字被截断了，如图12-2所示。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img alt="enter image description here" src="http://www.ituring.com.cn/download/01QipJwoEA1y" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;记住，把转换器定义为StaticResource。很多时候，我可能不由自主地将Binding的Converter属性设置为静态资源的键名：&lt;/p&gt;&lt;pre &gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;! &amp;#8212; &lt;span style="color: red"&gt;这是错误的 &lt;/span&gt;!--&lt;span style="color: blue"&gt;&amp;gt;&#xD;
        &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;TextBlock &lt;/span&gt;&lt;span style="color: red"&gt;Name&lt;/span&gt;&lt;span style="color: blue"&gt;="txtblk"  &#xD;
           &lt;/span&gt;&lt;span style="color: red"&gt;Text&lt;/span&gt;&lt;span style="color: blue"&gt;="{&lt;/span&gt;&lt;span style="color: #a31515"&gt;Binding &lt;/span&gt;&lt;span style="color: red"&gt;ElementName&lt;/span&gt;&lt;span style="color: blue"&gt;=slider,  &#xD;
                          &lt;/span&gt;&lt;span style="color: red"&gt;Path&lt;/span&gt;&lt;span style="color: blue"&gt;=Value,  &#xD;
                          &lt;/span&gt;&lt;span style="color: red"&gt;Converter&lt;/span&gt;&lt;span style="color: blue"&gt;=truncate}" ... /&amp;gt;&#xD;
&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;p&gt;我自己经常这样做，但是这种问题却难以追踪。&lt;/p&gt;&#xD;
&lt;p&gt;使用转换器最常用的方法是把转换器定义为资源，但是这不是唯一的方法。如果你使用Binding的元素语法，可以直接把TrunctionConverter类嵌入到标记中：&lt;/p&gt;&lt;pre &gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;TextBlock &lt;/span&gt;&lt;span style="color: blue"&gt;... &amp;gt; &#xD;
    &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;TextBlock.Text&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt; &#xD;
        &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Binding &lt;/span&gt;&lt;span style="color: red"&gt;ElementName&lt;/span&gt;&lt;span style="color: blue"&gt;="slider" &#xD;
                 &lt;/span&gt;&lt;span style="color: red"&gt;Path&lt;/span&gt;&lt;span style="color: blue"&gt;="Value"&amp;gt; &#xD;
            &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Binding.Converter&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt; &#xD;
                &amp;lt;&lt;/span&gt;&lt;span style="color: red"&gt;local&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: red"&gt;TruncationConverter &lt;/span&gt;&lt;span style="color: blue"&gt;/&amp;gt; &#xD;
            &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Binding.Converter&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt; &#xD;
        &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Binding&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt; &#xD;
    &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;TextBlock.Text&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
        &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;TextBlock&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;p&gt;不过，如果你在一个XAML文件中多次使用相同的转换器，最好还是把它定义为资源，这样能共享唯一实例。 &lt;br /&gt;TrucationConverter实际上是一个糟糕的数据转换器。当然它能完成它应该做的工作，但完成的方式并不灵活。如果你要在转换器类中调用Math.Round方法，那么提供一个小数位舍入功能不是更好吗？试想一下，如果有一个不仅支持数字，而且还支持不同的格式和各种数据类型的功能，那岂不是更好？&lt;/p&gt;&#xD;
&lt;p&gt;这种魔法般的功能由Petzold.Phone.Silverlight库里面的StringFormatConverter类所提供：&lt;/p&gt;&lt;pre &gt;Silverlight项目：Petzold.Phone.Silverlight　　文件：StringFormatConverter.cs&#xD;
&lt;span style="color: blue"&gt;using &lt;/span&gt;System;&#xD;
&lt;span style="color: blue"&gt;using &lt;/span&gt;System.Globalization;&#xD;
&lt;span style="color: blue"&gt;using &lt;/span&gt;System.Windows.Data;&#xD;
&#xD;
&lt;span style="color: blue"&gt;namespace &lt;/span&gt;Petzold.Phone.Silverlight&#xD;
{&#xD;
    &lt;span style="color: blue"&gt;public class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;StringFormatConverter &lt;/span&gt;: &lt;span style="color: #2b91af"&gt;IValueConverter&#xD;
    &lt;/span&gt;{&#xD;
        &lt;span style="color: blue"&gt;public object &lt;/span&gt;Convert(&lt;span style="color: blue"&gt;object &lt;/span&gt;value, &lt;span style="color: #2b91af"&gt;Type &lt;/span&gt;targetType,&#xD;
                              &lt;span style="color: blue"&gt;object &lt;/span&gt;parameter, &lt;span style="color: #2b91af"&gt;CultureInfo &lt;/span&gt;culture)&#xD;
        {&#xD;
            &lt;span style="color: blue"&gt;if &lt;/span&gt;(targetType == &lt;span style="color: blue"&gt;typeof&lt;/span&gt;(&lt;span style="color: blue"&gt;string&lt;/span&gt;) &amp;amp;&amp;amp; parameter &lt;span style="color: blue"&gt;is string&lt;/span&gt;)&#xD;
                &lt;span style="color: blue"&gt;return &lt;/span&gt;&lt;span style="color: #2b91af"&gt;String&lt;/span&gt;.Format(parameter &lt;span style="color: blue"&gt;as string&lt;/span&gt;, value);&#xD;
&#xD;
            &lt;span style="color: blue"&gt;return &lt;/span&gt;value;&#xD;
        }&#xD;
&#xD;
        &lt;span style="color: blue"&gt;public object &lt;/span&gt;ConvertBack(&lt;span style="color: blue"&gt;object &lt;/span&gt;value, &lt;span style="color: #2b91af"&gt;Type &lt;/span&gt;targetType,&#xD;
                                  &lt;span style="color: blue"&gt;object &lt;/span&gt;parameter, &lt;span style="color: #2b91af"&gt;CultureInfo &lt;/span&gt;culture)&#xD;
        {&#xD;
            &lt;span style="color: blue"&gt;return &lt;/span&gt;value;&#xD;
        }&#xD;
    }&#xD;
}&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;除了Converter属性以外，Binding类包含一个叫做ConverterParameter的属性。该属性的值是调用Convert时传递给parameter的参数。Convert方法假设该parameter是.NET标准的格式化字符串，该字符串可用来调用String.Format。&lt;/p&gt;&#xD;
&lt;p&gt;为了在SliderBindings程序中使用这个转换器，你需要引用Petzold.Phone.Silverlight库。（这里已经引用了。）并在文件中添加XML命名空间声明：&lt;/p&gt;&#xD;
&lt;p&gt;xmlns:petzold="clr-namespace:Petzold.Phone.Silverlight;assembly=Petzold.Phone.Silv-erlight" &lt;br /&gt;下面的代码用于实例化页面中Resources集合里的StringFormatConverter：&lt;/p&gt;&lt;pre &gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;phone&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;PhoneApplicationPage.Resources&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
            &lt;/span&gt;&lt;span style="color: #a31515"&gt;...&#xD;
            &lt;/span&gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: red"&gt;petzold&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: red"&gt;StringFormatConverter x&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: red"&gt;Key&lt;/span&gt;&lt;span style="color: blue"&gt;="stringFormat" /&amp;gt;&#xD;
        &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;phone&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;PhoneApplicationPage.Resources&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;p&gt;现在你可以在Binding标记表达式中引用这个转换器了。将ConverterParameter设置为.NET格式化字符串的一个占位符（Placeholder）的：&lt;/p&gt;&lt;pre &gt;&lt;span style="color: #a31515"&gt;Text="{Binding ElementName=slider,  &#xD;
               Path=Value,  &#xD;
               Converter={StaticResource stringFormat}, &#xD;
               ConverterParameter=...}"&#xD;
&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;p&gt;当你输入.NET格式化字符串时，你会发现一个问题。标准.NET的格式化字符串需要使用大括号，但你也知道当XAML解析器（XAML parser）解码Binding标记表达式时，并不会喜欢非法嵌入的大括号。 &lt;br /&gt;简单的解决方法是把ConverterParameter的值用单引号括起来：&lt;/p&gt;&lt;pre &gt;&lt;span style="color: #a31515"&gt;Text="{Binding ElementName=slider,  &#xD;
               Path=Value,  &#xD;
               Converter={StaticResource stringFormat}, &#xD;
               ConverterParameter='{0:F2}'}"&#xD;
&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;p&gt;Visual Studio中的XAML解析器和可视化设计器（visual designer）不喜欢这种特定的语法，但是运行时却没有问题。如果你想让设计器接受这种语法，在第一个单引号后插入一个空格（或者其他字符）就可以了。 &lt;br /&gt;因为ConverterParameter是String.Format调用的第一个参数，你可以把它完善一下：&lt;/p&gt;&lt;pre &gt;&lt;span style="color: #a31515"&gt;Text="{Binding ElementName=slider,  &#xD;
           Path=Value,  &#xD;
           Converter={StaticResource stringFormat}, &#xD;
           ConverterParameter='The slider is {0:F2}'}"&#xD;
&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;p&gt;结果如图12-3所示。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img alt="enter image description here" src="http://www.ituring.com.cn/download/01QipK01PDLs" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;相对绑定源&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;根据绑定数据源来分类，Silverlight for Windows Phone支持三种不同的绑定类型。到目前为止，这一章已经介绍了ElementName绑定，这种绑定指向一个命名元素。在本章后面的部分，主要使用Source属性来代替ElementName属性指向数据源。&lt;/p&gt;&#xD;
&lt;p&gt;第3类绑定称为RelativeSource（相对绑定源）。在Windows Presentation Foundation中的RelativeSource比Silverlight中的RelativeSource灵活很多，所以你可能对这个选项没有深刻的印象。使用RelativeSource的一个目的是与模板相关联，你将在第16章看到这样的应用。最后一个选项叫做Self，使用Self可以定义指向自身元素属性的绑定。下面的程序演示了这种语法：&lt;/p&gt;&lt;pre &gt;&lt;span style="color: #a31515"&gt;Silverlight项目：BindToSelf　　文件：MainPage.xaml（节选）&#xD;
        &lt;/span&gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Grid &lt;/span&gt;&lt;span style="color: red"&gt;x&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: red"&gt;Name&lt;/span&gt;&lt;span style="color: blue"&gt;="ContentPanel" &lt;/span&gt;&lt;span style="color: red"&gt;Grid.Row&lt;/span&gt;&lt;span style="color: blue"&gt;="1" &lt;/span&gt;&lt;span style="color: red"&gt;Margin&lt;/span&gt;&lt;span style="color: blue"&gt;="12,0,12,0"&amp;gt;&#xD;
            &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;StackPanel &lt;/span&gt;&lt;span style="color: red"&gt;Orientation&lt;/span&gt;&lt;span style="color: blue"&gt;="Horizontal"&#xD;
                &lt;/span&gt;&lt;span style="color: red"&gt;HorizontalAlignment&lt;/span&gt;&lt;span style="color: blue"&gt;="Center"&#xD;
                &lt;/span&gt;&lt;span style="color: red"&gt;VerticalAlignment&lt;/span&gt;&lt;span style="color: blue"&gt;="Center"&amp;gt;&#xD;
&#xD;
                &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;TextBlock &lt;/span&gt;&lt;span style="color: red"&gt;Text&lt;/span&gt;&lt;span style="color: blue"&gt;="{&lt;/span&gt;&lt;span style="color: #a31515"&gt;Binding &lt;/span&gt;&lt;span style="color: red"&gt;RelativeSource&lt;/span&gt;&lt;span style="color: blue"&gt;={&lt;/span&gt;&lt;span style="color: #a31515"&gt;RelativeSource &lt;/span&gt;&lt;span style="color: red"&gt;Self&lt;/span&gt;&lt;span style="color: blue"&gt;}, &#xD;
                                  &lt;/span&gt;&lt;span style="color: red"&gt;Path&lt;/span&gt;&lt;span style="color: blue"&gt;=FontFamily}" /&amp;gt;&#xD;
&#xD;
                &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;TextBlock &lt;/span&gt;&lt;span style="color: red"&gt;Text&lt;/span&gt;&lt;span style="color: blue"&gt;=" - " /&amp;gt;&#xD;
&#xD;
                &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;TextBlock &lt;/span&gt;&lt;span style="color: red"&gt;Text&lt;/span&gt;&lt;span style="color: blue"&gt;="{&lt;/span&gt;&lt;span style="color: #a31515"&gt;Binding &lt;/span&gt;&lt;span style="color: red"&gt;RelativeSource&lt;/span&gt;&lt;span style="color: blue"&gt;={&lt;/span&gt;&lt;span style="color: #a31515"&gt;RelativeSource &lt;/span&gt;&lt;span style="color: red"&gt;Self&lt;/span&gt;&lt;span style="color: blue"&gt;}, &#xD;
                                  &lt;/span&gt;&lt;span style="color: red"&gt;Path&lt;/span&gt;&lt;span style="color: blue"&gt;=FontSize}" /&amp;gt;&#xD;
&#xD;
                &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;TextBlock &lt;/span&gt;&lt;span style="color: red"&gt;Text&lt;/span&gt;&lt;span style="color: blue"&gt;=" pixels" /&amp;gt;&#xD;
            &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;StackPanel&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
        &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Grid&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;p&gt;RelativeSource属性是另一个扩展标记，其中包含RelativeSource和Self。Path指向同一个元素的另一个属性。在这个例子中，这两个TextBlock元素分别显示自身的TextBlock的FontFamily和FontSize属性。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;this绑定源&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;也许你的应用程序有这样一个需求：需要显示很多简短的文本字符串，这些字符串都由边界所包围。你决定创建一个派生自UserControl类的控件，并将其命名为BorderedText，如下所示：&lt;/p&gt;&lt;pre &gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: red"&gt;petzold&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: red"&gt;BorderedText Text&lt;/span&gt;&lt;span style="color: blue"&gt;="Ta Da!" &#xD;
                      &lt;/span&gt;&lt;span style="color: red"&gt;FontFamily&lt;/span&gt;&lt;span style="color: blue"&gt;="Times New Roman" &#xD;
                      &lt;/span&gt;&lt;span style="color: red"&gt;FontSize&lt;/span&gt;&lt;span style="color: blue"&gt;="96" &#xD;
                      &lt;/span&gt;&lt;span style="color: red"&gt;FontStyle&lt;/span&gt;&lt;span style="color: blue"&gt;="Italic" &#xD;
                      &lt;/span&gt;&lt;span style="color: red"&gt;FontWeight&lt;/span&gt;&lt;span style="color: blue"&gt;="Bold" &#xD;
                      &lt;/span&gt;&lt;span style="color: red"&gt;TextDecorations&lt;/span&gt;&lt;span style="color: blue"&gt;="Underline" &#xD;
                      &lt;/span&gt;&lt;span style="color: red"&gt;Foreground&lt;/span&gt;&lt;span style="color: blue"&gt;="Red" &#xD;
                      &lt;/span&gt;&lt;span style="color: red"&gt;Background&lt;/span&gt;&lt;span style="color: blue"&gt;="Lime" &#xD;
                      &lt;/span&gt;&lt;span style="color: red"&gt;BorderBrush&lt;/span&gt;&lt;span style="color: blue"&gt;="Blue" &#xD;
                      &lt;/span&gt;&lt;span style="color: red"&gt;BorderThickness&lt;/span&gt;&lt;span style="color: blue"&gt;="8" &#xD;
                      &lt;/span&gt;&lt;span style="color: red"&gt;CornerRadius&lt;/span&gt;&lt;span style="color: blue"&gt;="36" &#xD;
                      &lt;/span&gt;&lt;span style="color: red"&gt;Padding&lt;/span&gt;&lt;span style="color: blue"&gt;="16 4" &#xD;
                      &lt;/span&gt;&lt;span style="color: red"&gt;HorizontalAlignment&lt;/span&gt;&lt;span style="color: blue"&gt;="Center" &#xD;
                      &lt;/span&gt;&lt;span style="color: red"&gt;VerticalAlignment&lt;/span&gt;&lt;span style="color: blue"&gt;="Center" /&amp;gt;&#xD;
&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;p&gt;从XML命名空间的前缀可以判断出，这个类也在Petzold.Phone.Silverlight库中。&lt;/p&gt;&#xD;
&lt;p&gt;BorderedText派生自UserControl，而UserControl继承自Control，所以我们知道通过类继承BorderedText具备Control类的一些属性。BorderedText需要自己定义Text、TextDecorations、CornerRadius等属性，以及一些使其变得更加灵活的其他属性。&lt;/p&gt;&#xD;
&lt;p&gt;BorderedText.xaml文件中的可视化树很可能包含了一个Border，并且Border里包含了一个TextBlock。TextBlock和Border的属性都是通过BorderedText的属性来设置。&lt;/p&gt;&#xD;
&lt;p&gt;在前面的章节中，你已经见过实现这种功能的方法：ColorColumn类定义了Label和Value属性，然后在代码中使用属性变更处理程序为可视化树中元素的属性设置新值。使用数据绑定能简化这项工作。&lt;/p&gt;&#xD;
&lt;p&gt;BorderedText的代码隐藏文件定义了一些属性，其父类Control类并没有提供这些虚属性供其子类使用：&lt;/p&gt;&lt;pre &gt;Silverlight项目：Petzold.Phone.Silverlight　　文件：BorderedText.xaml.cs&#xD;
&lt;span style="color: blue"&gt;using &lt;/span&gt;System;&#xD;
&lt;span style="color: blue"&gt;using &lt;/span&gt;System.Windows;&#xD;
&lt;span style="color: blue"&gt;using &lt;/span&gt;System.Windows.Controls;&#xD;
&#xD;
&lt;span style="color: blue"&gt;namespace &lt;/span&gt;Petzold.Phone.Silverlight&#xD;
{&#xD;
    &lt;span style="color: blue"&gt;public partial class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;BorderedText &lt;/span&gt;: &lt;span style="color: #2b91af"&gt;UserControl&#xD;
    &lt;/span&gt;{&#xD;
        &lt;span style="color: blue"&gt;public static readonly &lt;/span&gt;&lt;span style="color: #2b91af"&gt;DependencyProperty &lt;/span&gt;TextProperty =&#xD;
            &lt;span style="color: #2b91af"&gt;DependencyProperty&lt;/span&gt;.Register(&lt;span style="color: #a31515"&gt;"Text"&lt;/span&gt;,&#xD;
                &lt;span style="color: blue"&gt;typeof&lt;/span&gt;(&lt;span style="color: blue"&gt;string&lt;/span&gt;),&#xD;
                &lt;span style="color: blue"&gt;typeof&lt;/span&gt;(&lt;span style="color: #2b91af"&gt;BorderedText&lt;/span&gt;),&#xD;
                &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;PropertyMetadata&lt;/span&gt;(&lt;span style="color: blue"&gt;null&lt;/span&gt;));&#xD;
&#xD;
        &lt;span style="color: blue"&gt;public static readonly &lt;/span&gt;&lt;span style="color: #2b91af"&gt;DependencyProperty &lt;/span&gt;TextAlignmentProperty =&#xD;
            &lt;span style="color: #2b91af"&gt;DependencyProperty&lt;/span&gt;.Register(&lt;span style="color: #a31515"&gt;"TextAlignment"&lt;/span&gt;,&#xD;
                &lt;span style="color: blue"&gt;typeof&lt;/span&gt;(&lt;span style="color: #2b91af"&gt;TextAlignment&lt;/span&gt;),&#xD;
                &lt;span style="color: blue"&gt;typeof&lt;/span&gt;(&lt;span style="color: #2b91af"&gt;BorderedText&lt;/span&gt;),&#xD;
                &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;PropertyMetadata&lt;/span&gt;(&lt;span style="color: #2b91af"&gt;TextAlignment&lt;/span&gt;.Left));&#xD;
&#xD;
        &lt;span style="color: blue"&gt;public static readonly &lt;/span&gt;&lt;span style="color: #2b91af"&gt;DependencyProperty &lt;/span&gt;TextDecorationsProperty =&#xD;
            &lt;span style="color: #2b91af"&gt;DependencyProperty&lt;/span&gt;.Register(&lt;span style="color: #a31515"&gt;"TextDecorations"&lt;/span&gt;,&#xD;
                &lt;span style="color: blue"&gt;typeof&lt;/span&gt;(&lt;span style="color: #2b91af"&gt;TextDecorationCollection&lt;/span&gt;),&#xD;
                &lt;span style="color: blue"&gt;typeof&lt;/span&gt;(&lt;span style="color: #2b91af"&gt;BorderedText&lt;/span&gt;),&#xD;
                &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;PropertyMetadata&lt;/span&gt;(&lt;span style="color: blue"&gt;null&lt;/span&gt;));&#xD;
&#xD;
&#xD;
        &lt;span style="color: blue"&gt;public static readonly &lt;/span&gt;&lt;span style="color: #2b91af"&gt;DependencyProperty &lt;/span&gt;TextWrappingProperty =&#xD;
            &lt;span style="color: #2b91af"&gt;DependencyProperty&lt;/span&gt;.Register(&lt;span style="color: #a31515"&gt;"TextWrapping"&lt;/span&gt;,&#xD;
                &lt;span style="color: blue"&gt;typeof&lt;/span&gt;(&lt;span style="color: #2b91af"&gt;TextWrapping&lt;/span&gt;),&#xD;
                &lt;span style="color: blue"&gt;typeof&lt;/span&gt;(&lt;span style="color: #2b91af"&gt;BorderedText&lt;/span&gt;),&#xD;
                &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;PropertyMetadata&lt;/span&gt;(&lt;span style="color: #2b91af"&gt;TextWrapping&lt;/span&gt;.NoWrap));&#xD;
&#xD;
        &lt;span style="color: blue"&gt;public static readonly &lt;/span&gt;&lt;span style="color: #2b91af"&gt;DependencyProperty &lt;/span&gt;CornerRadiusProperty =&#xD;
            &lt;span style="color: #2b91af"&gt;DependencyProperty&lt;/span&gt;.Register(&lt;span style="color: #a31515"&gt;"CornerRadius"&lt;/span&gt;,&#xD;
                &lt;span style="color: blue"&gt;typeof&lt;/span&gt;(&lt;span style="color: #2b91af"&gt;CornerRadius&lt;/span&gt;),&#xD;
                &lt;span style="color: blue"&gt;typeof&lt;/span&gt;(&lt;span style="color: #2b91af"&gt;BorderedText&lt;/span&gt;),&#xD;
                &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;PropertyMetadata&lt;/span&gt;(&lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;CornerRadius&lt;/span&gt;()));&#xD;
&#xD;
        &lt;span style="color: blue"&gt;public &lt;/span&gt;BorderedText()&#xD;
        {&#xD;
            &lt;span style="color: red"&gt;InitializeComponent&lt;/span&gt;();&#xD;
        }&#xD;
&#xD;
        &lt;span style="color: blue"&gt;public string &lt;/span&gt;Text&#xD;
        {&#xD;
            &lt;span style="color: blue"&gt;set &lt;/span&gt;{ SetValue(TextProperty, &lt;span style="color: blue"&gt;value&lt;/span&gt;); }&#xD;
            &lt;span style="color: blue"&gt;get &lt;/span&gt;{ &lt;span style="color: blue"&gt;return &lt;/span&gt;(&lt;span style="color: blue"&gt;string&lt;/span&gt;)GetValue(TextProperty); }&#xD;
        }&#xD;
&#xD;
        &lt;span style="color: blue"&gt;public &lt;/span&gt;&lt;span style="color: #2b91af"&gt;TextAlignment &lt;/span&gt;TextAlignment&#xD;
        {&#xD;
            &lt;span style="color: blue"&gt;set &lt;/span&gt;{ SetValue(TextAlignmentProperty, &lt;span style="color: blue"&gt;value&lt;/span&gt;); }&#xD;
            &lt;span style="color: blue"&gt;get &lt;/span&gt;{ &lt;span style="color: blue"&gt;return &lt;/span&gt;(&lt;span style="color: #2b91af"&gt;TextAlignment&lt;/span&gt;)GetValue(TextAlignmentProperty); }&#xD;
        }&#xD;
&#xD;
        &lt;span style="color: blue"&gt;public &lt;/span&gt;&lt;span style="color: #2b91af"&gt;TextDecorationCollection &lt;/span&gt;TextDecorations&#xD;
        {&#xD;
            &lt;span style="color: blue"&gt;set &lt;/span&gt;{ SetValue(TextDecorationsProperty, &lt;span style="color: blue"&gt;value&lt;/span&gt;); }&#xD;
            &lt;span style="color: blue"&gt;get &lt;/span&gt;{ &lt;span style="color: blue"&gt;return &lt;/span&gt;(&lt;span style="color: #2b91af"&gt;TextDecorationCollection&lt;/span&gt;)GetValue(TextDecorationsProperty); }&#xD;
        }&#xD;
&#xD;
        &lt;span style="color: blue"&gt;public &lt;/span&gt;&lt;span style="color: #2b91af"&gt;TextWrapping &lt;/span&gt;TextWrapping&#xD;
        {&#xD;
            &lt;span style="color: blue"&gt;set &lt;/span&gt;{ SetValue(TextWrappingProperty, &lt;span style="color: blue"&gt;value&lt;/span&gt;); }&#xD;
            &lt;span style="color: blue"&gt;get &lt;/span&gt;{ &lt;span style="color: blue"&gt;return &lt;/span&gt;(&lt;span style="color: #2b91af"&gt;TextWrapping&lt;/span&gt;)GetValue(TextWrappingProperty); }&#xD;
        }&#xD;
&#xD;
        &lt;span style="color: blue"&gt;public &lt;/span&gt;&lt;span style="color: #2b91af"&gt;CornerRadius &lt;/span&gt;CornerRadius&#xD;
        {&#xD;
            &lt;span style="color: blue"&gt;set &lt;/span&gt;{ SetValue(CornerRadiusProperty, &lt;span style="color: blue"&gt;value&lt;/span&gt;); }&#xD;
            &lt;span style="color: blue"&gt;get &lt;/span&gt;{ &lt;span style="color: blue"&gt;return &lt;/span&gt;(&lt;span style="color: #2b91af"&gt;CornerRadius&lt;/span&gt;)GetValue(CornerRadiusProperty); }&#xD;
        }&#xD;
    }&#xD;
}&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;这些代码有点长但其实很简单，因为都是一些属性的定义。并没有使用任何属性变更处理程序。下面是包含了Border和TextBlock的XAML文件：&lt;/p&gt;&lt;pre &gt;&lt;span style="color: #a31515"&gt;Silverlight项目：Petzold.Phone.Silverlight　　文件：BorderedText.xaml&#xD;
        &lt;/span&gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;UserControl &lt;/span&gt;&lt;span style="color: red"&gt;x&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: red"&gt;Class&lt;/span&gt;&lt;span style="color: blue"&gt;="Petzold.Phone.Silverlight.BorderedText"&#xD;
             &lt;/span&gt;&lt;span style="color: red"&gt;xmlns&lt;/span&gt;&lt;span style="color: blue"&gt;="http://schemas.microsoft.com/winfx/2006/xaml/presentation"&#xD;
             &lt;/span&gt;&lt;span style="color: red"&gt;xmlns&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: red"&gt;x&lt;/span&gt;&lt;span style="color: blue"&gt;="http://schemas.microsoft.com/winfx/2006/xaml"&#xD;
             &lt;/span&gt;&lt;span style="color: red"&gt;xmlns&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: red"&gt;d&lt;/span&gt;&lt;span style="color: blue"&gt;="http://schemas.microsoft.com/expression/blend/2008"&#xD;
             &lt;/span&gt;&lt;span style="color: red"&gt;Name&lt;/span&gt;&lt;span style="color: blue"&gt;="this"&amp;gt;&#xD;
&#xD;
            &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Border &lt;/span&gt;&lt;span style="color: red"&gt;Background&lt;/span&gt;&lt;span style="color: blue"&gt;="{&lt;/span&gt;&lt;span style="color: #a31515"&gt;Binding &lt;/span&gt;&lt;span style="color: red"&gt;ElementName&lt;/span&gt;&lt;span style="color: blue"&gt;=this, &lt;/span&gt;&lt;span style="color: red"&gt;Path&lt;/span&gt;&lt;span style="color: blue"&gt;=Background}"&#xD;
            &lt;/span&gt;&lt;span style="color: red"&gt;BorderBrush&lt;/span&gt;&lt;span style="color: blue"&gt;="{&lt;/span&gt;&lt;span style="color: #a31515"&gt;Binding &lt;/span&gt;&lt;span style="color: red"&gt;ElementName&lt;/span&gt;&lt;span style="color: blue"&gt;=this, &lt;/span&gt;&lt;span style="color: red"&gt;Path&lt;/span&gt;&lt;span style="color: blue"&gt;=BorderBrush}"&#xD;
            &lt;/span&gt;&lt;span style="color: red"&gt;BorderThickness&lt;/span&gt;&lt;span style="color: blue"&gt;="{&lt;/span&gt;&lt;span style="color: #a31515"&gt;Binding &lt;/span&gt;&lt;span style="color: red"&gt;ElementName&lt;/span&gt;&lt;span style="color: blue"&gt;=this, &lt;/span&gt;&lt;span style="color: red"&gt;Path&lt;/span&gt;&lt;span style="color: blue"&gt;=BorderThickness}"&#xD;
            &lt;/span&gt;&lt;span style="color: red"&gt;CornerRadius&lt;/span&gt;&lt;span style="color: blue"&gt;="{&lt;/span&gt;&lt;span style="color: #a31515"&gt;Binding &lt;/span&gt;&lt;span style="color: red"&gt;ElementName&lt;/span&gt;&lt;span style="color: blue"&gt;=this, &lt;/span&gt;&lt;span style="color: red"&gt;Path&lt;/span&gt;&lt;span style="color: blue"&gt;=CornerRadius}"&#xD;
            &lt;/span&gt;&lt;span style="color: red"&gt;Padding&lt;/span&gt;&lt;span style="color: blue"&gt;="{&lt;/span&gt;&lt;span style="color: #a31515"&gt;Binding &lt;/span&gt;&lt;span style="color: red"&gt;ElementName&lt;/span&gt;&lt;span style="color: blue"&gt;=this, &lt;/span&gt;&lt;span style="color: red"&gt;Path&lt;/span&gt;&lt;span style="color: blue"&gt;=Padding}"&amp;gt;&#xD;
&#xD;
                &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;TextBlock &lt;/span&gt;&lt;span style="color: red"&gt;Text&lt;/span&gt;&lt;span style="color: blue"&gt;="{&lt;/span&gt;&lt;span style="color: #a31515"&gt;Binding &lt;/span&gt;&lt;span style="color: red"&gt;ElementName&lt;/span&gt;&lt;span style="color: blue"&gt;=this, &lt;/span&gt;&lt;span style="color: red"&gt;Path&lt;/span&gt;&lt;span style="color: blue"&gt;=Text}"&#xD;
                   &lt;/span&gt;&lt;span style="color: red"&gt;TextAlignment&lt;/span&gt;&lt;span style="color: blue"&gt;="{&lt;/span&gt;&lt;span style="color: #a31515"&gt;Binding &lt;/span&gt;&lt;span style="color: red"&gt;ElementName&lt;/span&gt;&lt;span style="color: blue"&gt;=this, &lt;/span&gt;&lt;span style="color: red"&gt;Path&lt;/span&gt;&lt;span style="color: blue"&gt;=TextAlignment}"&#xD;
                   &lt;/span&gt;&lt;span style="color: red"&gt;TextDecorations&lt;/span&gt;&lt;span style="color: blue"&gt;="{&lt;/span&gt;&lt;span style="color: #a31515"&gt;Binding &lt;/span&gt;&lt;span style="color: red"&gt;ElementName&lt;/span&gt;&lt;span style="color: blue"&gt;=this, &lt;/span&gt;&lt;span style="color: red"&gt;Path&lt;/span&gt;&lt;span style="color: blue"&gt;=TextDecorations}"&#xD;
                   &lt;/span&gt;&lt;span style="color: red"&gt;TextWrapping&lt;/span&gt;&lt;span style="color: blue"&gt;="{&lt;/span&gt;&lt;span style="color: #a31515"&gt;Binding &lt;/span&gt;&lt;span style="color: red"&gt;ElementName&lt;/span&gt;&lt;span style="color: blue"&gt;=this, &lt;/span&gt;&lt;span style="color: red"&gt;Path&lt;/span&gt;&lt;span style="color: blue"&gt;=TextWrapping}" /&amp;gt;&#xD;
            &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Border&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
        &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;UserControl&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;p&gt;请注意根元素的命名：&lt;/p&gt;&lt;pre &gt;&lt;span style="color: #a31515"&gt;Name="this"&#xD;
&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;p&gt;你可以把这个根元素设置成你想要的名称，但使用C#的关键字this是最常见的做法，因为在该XAML文件中，this是指BorderedText类当前的实例，因此可以使用this这一熟悉的概念。你可以通过this这一名字把BorderedText的属性与可视化树中元素的属性建立绑定关系。&lt;/p&gt;&#xD;
&lt;p&gt;这个文件不需要为Foreground属性或者一些其他字体相关的属性进行数据绑定，因为这些属性都可以从可视化树中继承过来。TextBlock的Inlines属性使我感觉不爽。这是因为TextBlock把Inlines属性定义为只读（get-only）属性，所以没办法为它定义数据绑定。&lt;/p&gt;&#xD;
&lt;p&gt;BorderedTextDemo程序测试这个新控件：&lt;/p&gt;&lt;pre &gt;&lt;span style="color: #a31515"&gt;Silverlight项目：BorderedTextDemo　　文件：MainPage.xaml（节选）&#xD;
    &lt;/span&gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Grid &lt;/span&gt;&lt;span style="color: red"&gt;x&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: red"&gt;Name&lt;/span&gt;&lt;span style="color: blue"&gt;="ContentPanel" &lt;/span&gt;&lt;span style="color: red"&gt;Grid.Row&lt;/span&gt;&lt;span style="color: blue"&gt;="1" &lt;/span&gt;&lt;span style="color: red"&gt;Margin&lt;/span&gt;&lt;span style="color: blue"&gt;="12,0,12,0"&amp;gt;&#xD;
        &amp;lt;&lt;/span&gt;&lt;span style="color: red"&gt;petzold&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: red"&gt;BorderedText Text&lt;/span&gt;&lt;span style="color: blue"&gt;="Ta Da!"&#xD;
                          &lt;/span&gt;&lt;span style="color: red"&gt;FontFamily&lt;/span&gt;&lt;span style="color: blue"&gt;="Times New Roman"&#xD;
                          &lt;/span&gt;&lt;span style="color: red"&gt;FontSize&lt;/span&gt;&lt;span style="color: blue"&gt;="96"&#xD;
                          &lt;/span&gt;&lt;span style="color: red"&gt;FontStyle&lt;/span&gt;&lt;span style="color: blue"&gt;="Italic"&#xD;
                          &lt;/span&gt;&lt;span style="color: red"&gt;FontWeight&lt;/span&gt;&lt;span style="color: blue"&gt;="Bold"&#xD;
                          &lt;/span&gt;&lt;span style="color: red"&gt;TextDecorations&lt;/span&gt;&lt;span style="color: blue"&gt;="Underline"&#xD;
                          &lt;/span&gt;&lt;span style="color: red"&gt;Foreground&lt;/span&gt;&lt;span style="color: blue"&gt;="Red"&#xD;
                          &lt;/span&gt;&lt;span style="color: red"&gt;Background&lt;/span&gt;&lt;span style="color: blue"&gt;="Lime"&#xD;
                          &lt;/span&gt;&lt;span style="color: red"&gt;BorderBrush&lt;/span&gt;&lt;span style="color: blue"&gt;="Blue"&#xD;
                          &lt;/span&gt;&lt;span style="color: red"&gt;BorderThickness&lt;/span&gt;&lt;span style="color: blue"&gt;="8"&#xD;
                          &lt;/span&gt;&lt;span style="color: red"&gt;CornerRadius&lt;/span&gt;&lt;span style="color: blue"&gt;="36"&#xD;
                          &lt;/span&gt;&lt;span style="color: red"&gt;Padding&lt;/span&gt;&lt;span style="color: blue"&gt;="16 4"&#xD;
                          &lt;/span&gt;&lt;span style="color: red"&gt;HorizontalAlignment&lt;/span&gt;&lt;span style="color: blue"&gt;="Center"&#xD;
                          &lt;/span&gt;&lt;span style="color: red"&gt;VerticalAlignment&lt;/span&gt;&lt;span style="color: blue"&gt;="Center" /&amp;gt;&#xD;
    &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Grid&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;通知机制&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;为了使数据绑定能正常运作，绑定源必须实现某种通知机制（notification mechanism）。当属性的值发生改变的时候，这种通知机制会发送通知信号，使得新的值可以从源传递到目标。当你绑定Slider的Value属性到TextBlock的Text属性时，同时使用到两个依赖属性。虽然你在公共的编程接口中看不出来，但是就是这些依赖属性提供了通知机制。&lt;/p&gt;&#xD;
&lt;p&gt;使用数据绑定可以非常方便地关联两个可视化元素，但以可视化元素作为绑定目标，使用业务对象（business object）来代替可视化元素作为绑定源的数据绑定功能最强大。&lt;/p&gt;&#xD;
&lt;p&gt;这里需要提醒一下：&lt;/p&gt;&#xD;
&lt;p&gt;有时候，当程序员学习了操作系统的一个全新且重要的功能时（例如我在前面讨论过的依赖属性），他们就觉得需要在各个地方使用该功能，也许这样做只是为了多练习一下。对于依赖特性来说，这种做法不太可取。当然，如果你的父类的父类已经是DependencyObject的派生类，那么可以使用依赖属性，否则不应该单纯地为了使用依赖属性而继承DependencyObject类。&lt;/p&gt;&#xD;
&lt;p&gt;换句话说：不要为了使用依赖属性而重写业务对象！&lt;/p&gt;&#xD;
&lt;p&gt;数据绑定的目标必须是依赖属性，但是对于绑定的源，并没有严格要求。绑定源可以是普通类的普通属性。但是如果你希望绑定源在变化的时候，绑定目标也随之自动更新，那么绑定源必须实现某种通知机制。 &lt;br /&gt;通常用作绑定源的业务对象需要实现的通知机制称为INotifyPropertyChanged接口。&lt;/p&gt;&#xD;
&lt;p&gt;INotifyPropertyChanged定义在System.ComponentModel命名空间。（这清楚地表明该接口不仅仅在Silverlight中，而且在.NET中扮演着非常重要的角色。）这就是业务对象提供数据变更通知的方法。 &lt;br /&gt;INotifyPropertyChanged的定义非常简单，如下所示：&lt;span style="color: blue"&gt;&lt;/span&gt;&lt;/p&gt;&lt;pre &gt;&lt;span style="color: blue"&gt;public interface &lt;/span&gt;&lt;span style="color: #2b91af"&gt;INotifyPropertyChanged&#xD;
&lt;/span&gt;{&#xD;
    &lt;span style="color: blue"&gt;event &lt;/span&gt;&lt;span style="color: #2b91af"&gt;PropertyChangedEventHandler &lt;/span&gt;PropertyChanged;&#xD;
}&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;实现INotifyPropertyChanged接口的类只需要简单地定义一个公共事件Property- Changed。理论上，这个派生类并不需要为这个事件做任何特殊的处理，但是当它的某个属性发生变化时，可以通过这个事件来触发变更事件。&lt;/p&gt;&#xD;
&lt;p&gt;PropertyChangedEventHandler委托与PropertyChangedEventArgs类相关联，Pro- pertyChangedEventArgs类只有一个string类型的只读属性PropertyName，你要将发生变化的属性名传递给PropertyChangedEventArgs的构造函数。&lt;/p&gt;&#xD;
&lt;p&gt;有时候实现INotifyPropertyChanged接口的类需要定义一个受保护的虚方法OnPropertyChanged，该方法具有一个PropertyChangedEventArgs类型的参数。这个方法不是必须的，但能给派生类带来便利。我在这个例子中使用了该方法，因为在该方法中可以方便触发事件。&lt;/p&gt;&#xD;
&lt;p&gt;由于实现了INotifyPropertyChanged接口的业务对象并没有继承FrameworkElement，它们并不是XAML文件中可视化树的组成部分，因此它们通常会被实例化为XAML的资源或者位于代码隐藏文件中。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;简单的绑定服务&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;有时我觉得使用业务对象的本意是在XAML文件中进行绑定，这种绑定称为绑定服务（binding server）。绑定服务公开了一些公共属性，当这些属性发生变化时，绑定服务会触发相应的PropertyChanged事件。&lt;/p&gt;&#xD;
&lt;p&gt;例如，假设你想在Windows Phone 7应用程序中显示当前时间，并且提供灵活的呈现方式。有时你只想显示秒，并完全通过XAML来完成这个功能。例如，你想通过XAML显示：&amp;#8220;目前是X秒&amp;#8221;，中间放一个每秒钟更新一次的数字。当然这里讲述的技巧可以扩展到许多其他的应用中，而不仅仅是一个钟表应用。&lt;/p&gt;&#xD;
&lt;p&gt;虽然可以完全通过XAML实现整体的可视元素，但是你还是需要一些辅助的代码（可能是一个命名为Clock的类，该类包含了Year、Month、Day、DayOfWeek、Hour、Minute和Second等属性。）我们将在XAML文件中实例化这个Clock类并通过数据绑定来访问它的属性。&lt;/p&gt;&#xD;
&lt;p&gt;如你所知，在.NET中已经存在一个包含Year、Month和Day等相关属性的结构体：DateTime。尽管DateTime对于编写Clock类是必不可少的，但是它并不大符合我们的需求，因为DateTime的属性不可以动态更改。相反，我要演示的Clock类所包含的属性会实时地反映当前的时间，而且会通过PropertyChanged事件通知外部世界相应的变化。&lt;/p&gt;&#xD;
&lt;p&gt;Clock类包含在Petzold.Phone.Silverlight库中，如下所示：&lt;/p&gt;&lt;pre &gt;Silverlight项目：Petzold.Phone.Silverlight　　文件：Clock.cs&#xD;
&lt;span style="color: blue"&gt;using &lt;/span&gt;System;&#xD;
&lt;span style="color: blue"&gt;using &lt;/span&gt;System.ComponentModel;&#xD;
&lt;span style="color: blue"&gt;using &lt;/span&gt;System.Windows.Threading; &#xD;
&#xD;
&lt;span style="color: blue"&gt;namespace &lt;/span&gt;Petzold.Phone.Silverlight&#xD;
{&#xD;
    &lt;span style="color: blue"&gt;public class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Clock &lt;/span&gt;: &lt;span style="color: #2b91af"&gt;INotifyPropertyChanged&#xD;
    &lt;/span&gt;{&#xD;
        &lt;span style="color: blue"&gt;int &lt;/span&gt;hour, min, sec;&#xD;
        &lt;span style="color: #2b91af"&gt;DateTime &lt;/span&gt;date;&#xD;
&#xD;
        &lt;span style="color: blue"&gt;public event &lt;/span&gt;&lt;span style="color: #2b91af"&gt;PropertyChangedEventHandler &lt;/span&gt;PropertyChanged;&#xD;
&#xD;
        &lt;span style="color: blue"&gt;public &lt;/span&gt;Clock()&#xD;
        {&#xD;
            OnTimerTick(&lt;span style="color: blue"&gt;null&lt;/span&gt;, &lt;span style="color: blue"&gt;null&lt;/span&gt;);&#xD;
&#xD;
            &lt;span style="color: red"&gt;DispatcherTimer &lt;/span&gt;tmr = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: red"&gt;DispatcherTimer&lt;/span&gt;();&#xD;
            tmr.&lt;span style="color: red"&gt;Interval &lt;/span&gt;= &lt;span style="color: #2b91af"&gt;TimeSpan&lt;/span&gt;.FromSeconds(0.1);&#xD;
            tmr.&lt;span style="color: red"&gt;Tick &lt;/span&gt;+= OnTimerTick;&#xD;
            tmr.&lt;span style="color: red"&gt;Start&lt;/span&gt;();&#xD;
&#xD;
&#xD;
        }&#xD;
&#xD;
        &lt;span style="color: blue"&gt;public int &lt;/span&gt;Hour&#xD;
        {&#xD;
            &lt;span style="color: blue"&gt;protected set&#xD;
            &lt;/span&gt;{&#xD;
                &lt;span style="color: blue"&gt;if &lt;/span&gt;(&lt;span style="color: blue"&gt;value &lt;/span&gt;!= hour)&#xD;
                {&#xD;
                    hour = &lt;span style="color: blue"&gt;value&lt;/span&gt;;&#xD;
                    OnPropertyChanged(&lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;PropertyChangedEventArgs&lt;/span&gt;(&lt;span style="color: #a31515"&gt;"Hour"&lt;/span&gt;));&#xD;
                }&#xD;
            }&#xD;
            &lt;span style="color: blue"&gt;get &#xD;
            &lt;/span&gt;{ &#xD;
                &lt;span style="color: blue"&gt;return &lt;/span&gt;hour; &#xD;
            }&#xD;
        }&#xD;
        &lt;span style="color: blue"&gt;public int &lt;/span&gt;Minute&#xD;
        {&#xD;
            &lt;span style="color: blue"&gt;protected set&#xD;
            &lt;/span&gt;{&#xD;
                &lt;span style="color: blue"&gt;if &lt;/span&gt;(&lt;span style="color: blue"&gt;value &lt;/span&gt;!= min)&#xD;
                {&#xD;
                    min = &lt;span style="color: blue"&gt;value&lt;/span&gt;;&#xD;
                    OnPropertyChanged(&lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;PropertyChangedEventArgs&lt;/span&gt;(&lt;span style="color: #a31515"&gt;"Minute"&lt;/span&gt;));&#xD;
                }&#xD;
            }&#xD;
            &lt;span style="color: blue"&gt;get &#xD;
            &lt;/span&gt;{ &#xD;
                &lt;span style="color: blue"&gt;return &lt;/span&gt;min; &#xD;
            }&#xD;
        }&#xD;
&#xD;
        &lt;span style="color: blue"&gt;public int &lt;/span&gt;Second&#xD;
        {&#xD;
            &lt;span style="color: blue"&gt;protected set&#xD;
            &lt;/span&gt;{&#xD;
                &lt;span style="color: blue"&gt;if &lt;/span&gt;(&lt;span style="color: blue"&gt;value &lt;/span&gt;!= sec)&#xD;
                {&#xD;
                    sec = &lt;span style="color: blue"&gt;value&lt;/span&gt;;&#xD;
                    OnPropertyChanged(&lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;PropertyChangedEventArgs&lt;/span&gt;(&lt;span style="color: #a31515"&gt;"Second"&lt;/span&gt;));&#xD;
                }&#xD;
            }&#xD;
            &lt;span style="color: blue"&gt;get&#xD;
            &lt;/span&gt;{&#xD;
                &lt;span style="color: blue"&gt;return &lt;/span&gt;sec;&#xD;
            }&#xD;
        }&#xD;
&#xD;
        &lt;span style="color: blue"&gt;public &lt;/span&gt;&lt;span style="color: #2b91af"&gt;DateTime &lt;/span&gt;Date&#xD;
        {&#xD;
            &lt;span style="color: blue"&gt;protected set&#xD;
            &lt;/span&gt;{&#xD;
                &lt;span style="color: blue"&gt;if &lt;/span&gt;(&lt;span style="color: blue"&gt;value &lt;/span&gt;!= date)&#xD;
                {&#xD;
                    date = &lt;span style="color: blue"&gt;value&lt;/span&gt;;&#xD;
&#xD;
&#xD;
                    OnPropertyChanged(&lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;PropertyChangedEventArgs&lt;/span&gt;(&lt;span style="color: #a31515"&gt;"Date"&lt;/span&gt;));&#xD;
                }&#xD;
            }&#xD;
            &lt;span style="color: blue"&gt;get&#xD;
            &lt;/span&gt;{&#xD;
                &lt;span style="color: blue"&gt;return &lt;/span&gt;date;&#xD;
            }&#xD;
        }&#xD;
&#xD;
        &lt;span style="color: blue"&gt;protected virtual void &lt;/span&gt;OnPropertyChanged(&lt;span style="color: #2b91af"&gt;PropertyChangedEventArgs &lt;/span&gt;args)&#xD;
        {&#xD;
            &lt;span style="color: blue"&gt;if &lt;/span&gt;(PropertyChanged != &lt;span style="color: blue"&gt;null&lt;/span&gt;)&#xD;
                PropertyChanged(&lt;span style="color: blue"&gt;this&lt;/span&gt;, args);&#xD;
        }&#xD;
      &lt;span style="color: blue"&gt;void &lt;/span&gt;OnTimerTick(&lt;span style="color: blue"&gt;object &lt;/span&gt;sender, &lt;span style="color: #2b91af"&gt;EventArgs &lt;/span&gt;args)&#xD;
        {&#xD;
            &lt;span style="color: #2b91af"&gt;DateTime &lt;/span&gt;dt = &lt;span style="color: #2b91af"&gt;DateTime&lt;/span&gt;.Now;&#xD;
            Hour = dt.Hour;&#xD;
            Minute = dt.Minute;&#xD;
            Second = dt.Second;&#xD;
            Date = &lt;span style="color: #2b91af"&gt;DateTime&lt;/span&gt;.Today;&#xD;
        }&#xD;
    }&#xD;
}&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;Clock类实现了INotifyPropertyChanged接口，因此包含PropertyChanged公共事件。靠近结尾的地方，有一个受保护的OnPropertyChanged方法，负责触发实际的事件。在Clock类的构造函数中创建DispatcherTimer的实例并为它的Tick事件注册了一个事件处理程序，这个处理程序的调用间隔（Interval）为1/10秒。在类最底部的OnTimerTick处理程序负责给这个类的Hour、Minute、Second和Data属性设置新值，这些属性的结构都非常相似。&lt;/p&gt;&#xD;
&lt;p&gt;例如，看一下Hour属性：&lt;/p&gt;&lt;pre&gt;&lt;/pre&gt;&lt;pre &gt;&lt;span style="color: blue"&gt;public int &lt;/span&gt;Hour &#xD;
{ &#xD;
    &lt;span style="color: blue"&gt;protected &lt;/span&gt;&lt;span style="color: red"&gt;set &#xD;
    &lt;/span&gt;{ &#xD;
        &lt;span style="color: blue"&gt;if &lt;/span&gt;(&lt;span style="color: red"&gt;value &lt;/span&gt;!= &lt;span style="color: red"&gt;hour&lt;/span&gt;) &#xD;
        { &#xD;
            &lt;span style="color: red"&gt;hour &lt;/span&gt;= &lt;span style="color: red"&gt;value&lt;/span&gt;; &#xD;
            &lt;span style="color: red"&gt;OnPropertyChanged&lt;/span&gt;(&lt;span style="color: blue"&gt;new &lt;/span&gt;PropertyChangedEventArgs(&lt;span style="color: #a31515"&gt;"Hour"&lt;/span&gt;)); &#xD;
        } &#xD;
    } &#xD;
    &lt;span style="color: red"&gt;get  &#xD;
    &lt;/span&gt;{  &#xD;
        &lt;span style="color: blue"&gt;return &lt;/span&gt;&lt;span style="color: red"&gt;hour&lt;/span&gt;;  &#xD;
    } &#xD;
}&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;set存储器是受保护的。因此该值只能在内部设置，我们并不希望外部的类设置该属性。set存取器检查正在设置的值与存储在字段中的值是否相同，如果不相同，就把新值设置到hour字段中，同时调用OnPropertyChanged来触发更新事件。&lt;/p&gt;&#xD;
&lt;p&gt;有些程序员不使用if语句来检查属性是否发生变化，其结果是一旦属性被设置就马上触发PropertyChanged事件，即使该属性的值并没有发生变化也是如此。这并不是一个好主意，特别是像这样的类。我们不希望每隔1/10秒PropertyChanged事件就报告Hour属性发生了变化，其实该属性每一小时才改变一次。&lt;/p&gt;&#xD;
&lt;p&gt;要在XAML文件中使用Clock类，你需要声明一个XML命名空间来引用Petzold.Phone.Silverlight库： &lt;br /&gt;xmlns:petzold="clr-namespace:Petzold.Phone.Silverlight;assembly=Petzold.Phone.Silverlight" &lt;br /&gt;当绑定源不是DependencyObject的子类时，你会在Binding中使用Source属性来代替ElementName属性。我们要创建的绑定的Source属性设置为Petzold.Phone.Silverlight库中的Clock对象。&lt;/p&gt;&#xD;
&lt;p&gt;你可以直接在Binding中插入Clock类的引用：&lt;/p&gt;&lt;pre &gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;TextBlock&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt; &#xD;
    &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;TextBlock.Text&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt; &#xD;
        &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Binding &lt;/span&gt;&lt;span style="color: red"&gt;Path&lt;/span&gt;&lt;span style="color: blue"&gt;="Second"&amp;gt; &#xD;
            &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Binding.Source&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt; &#xD;
                &amp;lt;&lt;/span&gt;&lt;span style="color: red"&gt;petzold&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: red"&gt;Clock &lt;/span&gt;&lt;span style="color: blue"&gt;/&amp;gt; &#xD;
            &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Binding.Source&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt; &#xD;
        &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Binding&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt; &#xD;
    &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;TextBlock.Text&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
    &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;TextBlock&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;p&gt;Binding的Source属性是一个属性元素，并设置为Clock类的实例。Path属性指向Clock类的Second属性。 &lt;br /&gt;或者按照惯例把Clock类定义为XAML的资源：&lt;/p&gt;&lt;pre &gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;phone&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;PhoneApplicationPage.Resources&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
        &amp;lt;&lt;/span&gt;&lt;span style="color: red"&gt;petzold&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: red"&gt;Clock x&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: red"&gt;Key&lt;/span&gt;&lt;span style="color: blue"&gt;="clock" /&amp;gt;&#xD;
        &lt;/span&gt;&lt;span style="color: #a31515"&gt;...&#xD;
    &lt;/span&gt;&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;phone&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;PhoneApplicationPage.Resources&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;p&gt;然后就可以在Binding扩展标记中引用该资源了：&lt;/p&gt;&lt;pre &gt;&lt;span style="color: #a31515"&gt;TextBlock Text="{Binding Source={StaticResource clock}, Path=Second}" /&amp;gt;&#xD;
&#xD;
&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;p&gt;注意StaticResource的嵌入标记表达式（embedded markup expression）。&lt;/p&gt;&#xD;
&lt;p&gt;TimeDisplay项目演示了这种方法，该项目使用了水平StackPanel来串联文本：&lt;/p&gt;&lt;pre &gt;&lt;span style="color: #a31515"&gt;Silverlight项目：TimeDisplay　　文件：MainPage.xaml&#xD;
&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: red"&gt;Grid x&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: red"&gt;Name&lt;/span&gt;&lt;span style="color: blue"&gt;="ContentPanel" &lt;/span&gt;&lt;span style="color: red"&gt;Grid.Row&lt;/span&gt;&lt;span style="color: blue"&gt;="1" &lt;/span&gt;&lt;span style="color: red"&gt;Margin&lt;/span&gt;&lt;span style="color: blue"&gt;="12,0,12,0"&amp;gt;&#xD;
    &amp;lt;&lt;/span&gt;&lt;span style="color: red"&gt;StackPanel Orientation&lt;/span&gt;&lt;span style="color: blue"&gt;="Horizontal"&#xD;
                &lt;/span&gt;&lt;span style="color: red"&gt;HorizontalAlignment&lt;/span&gt;&lt;span style="color: blue"&gt;="Center"&#xD;
                &lt;/span&gt;&lt;span style="color: red"&gt;VerticalAlignment&lt;/span&gt;&lt;span style="color: blue"&gt;="Center"&amp;gt;&#xD;
        &amp;lt;&lt;/span&gt;&lt;span style="color: red"&gt;TextBlock Text&lt;/span&gt;&lt;span style="color: blue"&gt;="The current seconds are " /&amp;gt;&#xD;
        &amp;lt;&lt;/span&gt;&lt;span style="color: red"&gt;TextBlock Text&lt;/span&gt;&lt;span style="color: blue"&gt;="{&lt;/span&gt;&lt;span style="color: red"&gt;Binding Source&lt;/span&gt;&lt;span style="color: blue"&gt;={&lt;/span&gt;&lt;span style="color: #a31515"&gt;StaticResource &lt;/span&gt;&lt;span style="color: red"&gt;clock&lt;/span&gt;&lt;span style="color: blue"&gt;}, &#xD;
                                  &lt;/span&gt;&lt;span style="color: red"&gt;Path&lt;/span&gt;&lt;span style="color: blue"&gt;=Second}" /&amp;gt;&#xD;
    &amp;lt;/&lt;/span&gt;&lt;span style="color: red"&gt;StackPanel&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
&amp;lt;/&lt;/span&gt;&lt;span style="color: red"&gt;Grid&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;p&gt;运行效果如图12-4所示。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img alt="enter image description here" src="http://www.ituring.com.cn/download/01QipK8D9bav" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;再次强调：绑定目标（例如TextBlock的Text属性）必须是依赖属性。为了使绑定目标随着绑定源（例如Clock的Second属性）的变化而更新，绑定源必须实现某种通知机制。&lt;/p&gt;&#xD;
&lt;p&gt;当然，我并不想使用承载多个TextBlock元素的StackPanel。可以使用StringFormat- Converter（我已在TimeDisplay项目中把它定义为资源，并指定了它的键为StringFormat，因此你现在可以使用它了），我可以简单地在一个TextBlock中包括整段文字，如下所示：&lt;/p&gt;&lt;pre &gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: red"&gt;Grid x&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: red"&gt;Name&lt;/span&gt;&lt;span style="color: blue"&gt;="ContentPanel" &lt;/span&gt;&lt;span style="color: red"&gt;Grid.Row&lt;/span&gt;&lt;span style="color: blue"&gt;="1" &lt;/span&gt;&lt;span style="color: red"&gt;Margin&lt;/span&gt;&lt;span style="color: blue"&gt;="12,0,12,0"&amp;gt;&#xD;
    &amp;lt;&lt;/span&gt;&lt;span style="color: red"&gt;TextBlock HorizontalAlignment&lt;/span&gt;&lt;span style="color: blue"&gt;="Center" &#xD;
               &lt;/span&gt;&lt;span style="color: red"&gt;VerticalAlignment&lt;/span&gt;&lt;span style="color: blue"&gt;="Center" &#xD;
               &lt;/span&gt;&lt;span style="color: red"&gt;Text&lt;/span&gt;&lt;span style="color: blue"&gt;="{&lt;/span&gt;&lt;span style="color: red"&gt;Binding Source&lt;/span&gt;&lt;span style="color: blue"&gt;={&lt;/span&gt;&lt;span style="color: #a31515"&gt;StaticResource &lt;/span&gt;&lt;span style="color: red"&gt;clock&lt;/span&gt;&lt;span style="color: blue"&gt;},  &#xD;
                              &lt;/span&gt;&lt;span style="color: red"&gt;Path&lt;/span&gt;&lt;span style="color: blue"&gt;=Second, &#xD;
                              &lt;/span&gt;&lt;span style="color: red"&gt;Converter&lt;/span&gt;&lt;span style="color: blue"&gt;={&lt;/span&gt;&lt;span style="color: #a31515"&gt;StaticResource &lt;/span&gt;&lt;span style="color: red"&gt;stringFormat&lt;/span&gt;&lt;span style="color: blue"&gt;}, &#xD;
                              &lt;/span&gt;&lt;span style="color: red"&gt;ConverterParameter&lt;/span&gt;&lt;span style="color: blue"&gt;='The current seconds are {0}'}" /&amp;gt;&#xD;
&amp;lt;/&lt;/span&gt;&lt;span style="color: red"&gt;Grid&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;p&gt;现在Binding标记表达式包含了两个嵌入标记表达式。&lt;/p&gt;&#xD;
&lt;p&gt;如果想显示Clock类的多个属性，你可以回去使用多个TextBlock元素。例如，可以通过冒号来分割时、分和秒，同时在分和秒前补0：&lt;/p&gt;&lt;pre &gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: red"&gt;Grid x&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: red"&gt;Name&lt;/span&gt;&lt;span style="color: blue"&gt;="ContentPanel" &lt;/span&gt;&lt;span style="color: red"&gt;Grid.Row&lt;/span&gt;&lt;span style="color: blue"&gt;="1" &lt;/span&gt;&lt;span style="color: red"&gt;Margin&lt;/span&gt;&lt;span style="color: blue"&gt;="12,0,12,0"&amp;gt;&#xD;
    &amp;lt;&lt;/span&gt;&lt;span style="color: red"&gt;StackPanel Orientation&lt;/span&gt;&lt;span style="color: blue"&gt;="Horizontal" &#xD;
                &lt;/span&gt;&lt;span style="color: red"&gt;HorizontalAlignment&lt;/span&gt;&lt;span style="color: blue"&gt;="Center" &#xD;
                &lt;/span&gt;&lt;span style="color: red"&gt;VerticalAlignment&lt;/span&gt;&lt;span style="color: blue"&gt;="Center"&amp;gt;&#xD;
        &amp;lt;&lt;/span&gt;&lt;span style="color: red"&gt;TextBlock Text&lt;/span&gt;&lt;span style="color: blue"&gt;="{&lt;/span&gt;&lt;span style="color: red"&gt;Binding Source&lt;/span&gt;&lt;span style="color: blue"&gt;={&lt;/span&gt;&lt;span style="color: #a31515"&gt;StaticResource &lt;/span&gt;&lt;span style="color: red"&gt;clock&lt;/span&gt;&lt;span style="color: blue"&gt;},  &#xD;
                                  &lt;/span&gt;&lt;span style="color: red"&gt;Path&lt;/span&gt;&lt;span style="color: blue"&gt;=Hour}" /&amp;gt;&#xD;
        &amp;lt;&lt;/span&gt;&lt;span style="color: red"&gt;TextBlock Text&lt;/span&gt;&lt;span style="color: blue"&gt;="{&lt;/span&gt;&lt;span style="color: red"&gt;Binding Source&lt;/span&gt;&lt;span style="color: blue"&gt;={&lt;/span&gt;&lt;span style="color: #a31515"&gt;StaticResource &lt;/span&gt;&lt;span style="color: red"&gt;clock&lt;/span&gt;&lt;span style="color: blue"&gt;},  &#xD;
                                  &lt;/span&gt;&lt;span style="color: red"&gt;Path&lt;/span&gt;&lt;span style="color: blue"&gt;=Minute, &#xD;
                                  &lt;/span&gt;&lt;span style="color: red"&gt;Converter&lt;/span&gt;&lt;span style="color: blue"&gt;={&lt;/span&gt;&lt;span style="color: #a31515"&gt;StaticResource &lt;/span&gt;&lt;span style="color: red"&gt;stringFormat&lt;/span&gt;&lt;span style="color: blue"&gt;}, &#xD;
                                  &lt;/span&gt;&lt;span style="color: red"&gt;ConverterParameter&lt;/span&gt;&lt;span style="color: blue"&gt;=':{0:D2}'}" /&amp;gt;&#xD;
        &amp;lt;&lt;/span&gt;&lt;span style="color: red"&gt;TextBlock Text&lt;/span&gt;&lt;span style="color: blue"&gt;="{&lt;/span&gt;&lt;span style="color: red"&gt;Binding Source&lt;/span&gt;&lt;span style="color: blue"&gt;={&lt;/span&gt;&lt;span style="color: #a31515"&gt;StaticResource &lt;/span&gt;&lt;span style="color: red"&gt;clock&lt;/span&gt;&lt;span style="color: blue"&gt;},  &#xD;
                                  &lt;/span&gt;&lt;span style="color: red"&gt;Path&lt;/span&gt;&lt;span style="color: blue"&gt;=Second, &#xD;
                                  &lt;/span&gt;&lt;span style="color: red"&gt;Converter&lt;/span&gt;&lt;span style="color: blue"&gt;={&lt;/span&gt;&lt;span style="color: #a31515"&gt;StaticResource &lt;/span&gt;&lt;span style="color: red"&gt;stringFormat&lt;/span&gt;&lt;span style="color: blue"&gt;}, &#xD;
                                  &lt;/span&gt;&lt;span style="color: red"&gt;ConverterParameter&lt;/span&gt;&lt;span style="color: blue"&gt;=':{0:D2}'}" /&amp;gt;&#xD;
    &amp;lt;/&lt;/span&gt;&lt;span style="color: red"&gt;StackPanel&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
&amp;lt;/&lt;/span&gt;&lt;span style="color: red"&gt;Grid&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;p&gt;如你所见，3个绑定都使用了相同的Source设置。是否有方法让我们避免这种重复呢？有，并且这种技巧是一个非常重要的概念。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------&lt;/p&gt;&#xD;
&lt;p&gt;原文首发《图灵社区》&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://www.ituring.com.cn/article/details/848"&gt;http://www.ituring.com.cn/article/details/848&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://www.ituring.com.cn/article/849"&gt;http://www.ituring.com.cn/article/849&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/procoder/aggbug/2314658.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/procoder/archive/2012/01/06/Windows-Phone-Databinding.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/procoder/archive/2011/10/28/WIndows-Phone-Idle-Mode.html</id><title type="text">Windows Phone的网络连接策略</title><summary type="text">本文讲述Windows Phone在空闲状态下是否保持网络链接，有哪些情况会保持链接。</summary><published>2011-10-28T08:21:00Z</published><updated>2011-10-28T08:21:00Z</updated><author><name>Jake Lin</name><uri>http://www.cnblogs.com/procoder/</uri></author><link rel="alternate" href="http://www.cnblogs.com/procoder/archive/2011/10/28/WIndows-Phone-Idle-Mode.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/procoder/archive/2011/10/28/WIndows-Phone-Idle-Mode.html"/><content type="html">&lt;div&gt;&lt;p&gt;&lt;strong&gt;前言&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;在微薄中&amp;#8220;有人&amp;#8221;（我记得是谁，^_^）问起Windows  Phone在锁屏下是否继续链接WiFi，引起了很多WP微博控在讨论，其实我本来不关心这个问题的，因为这个是不可控的，但是讨论的人太多了，因此我想聊聊我对Windows  Phone的网络连接策略的想法。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;问题定义&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;这个问题可以简单的重新定义为&lt;strong&gt;Windows  Phone在空闲（idle）情况下，是否进行网络链接。&lt;/strong&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是单任务，在锁屏的时候会把所有app杀死了，那么他/她可能给水军给忽悠了，Windows  Phone从第一天开始就是一个多任务操作系统，所以在锁屏情况下继续保持网络链接，继续完成后台任务是&lt;strong&gt;可能的&lt;/strong&gt;。但微软一般不这样做，而且限制app开发者这样做，这些都是为了提供更好的用户体验。&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;到底链接or断开？&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;我的答案是yes and no，呵呵。在Windows  Phone锁屏的情况下，到底继续保持链接还是断开链接，不能简单的回答，因为这个操作是根据策略来决定的。这些策略的目的都是为了提供更好的用户体验，这种策略简单可以参考下面的公式：&lt;/p&gt; &lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt; &lt;p&gt;任务类型 + 电源状态 = 是否断开链接&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;根据之前重新定义，公式可以替换为：&lt;/p&gt; &lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt; &lt;p&gt;任务类型 + 电源状态 + 可用网络链接媒体（WiFi/3G） =  是否进行网络链接&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;也就是说在不同的情况下，Windows Phone会相应的保持或者断开链接。这也是现代智能手机系统（WP，  Android，iOS）最最基本的功能了。现代的智能手机系统一般都由&lt;strong&gt;系统&lt;/strong&gt;来进行电源管理和网络连接管理。请注意我把&amp;#8220;系统&amp;#8221;两个字重点加粗了，因为非现代智能手机系统可能是把主动权交给了应用（app）来管理的（当然最终操作系统保留了最高决定权），例如以前的Windows  Mobile是由应用来决定打开和关闭网络连接，打开3G还是WiFi，试问一个app开发者怎么要肩负着OS开发者的责任，需要考虑的情况也太多了。再例如Symbian的app在启动是会提示&amp;#8220;是否打开网络连接，到底打开3G还是WiFi&amp;#8221;，把链接责任推给了用户。这些老系统都极大破坏了用户体验。&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;-------------------------貌似合理的跑题-------------------------------------------------------------------------------------&lt;/p&gt; &lt;p&gt;下面举一个Agile的例子，讨论一下用户到底要什么：&lt;/p&gt; &lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt; &lt;p&gt;最为一个非技术用户，如果我想看微薄，那么打开微薄app就可以看。&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;这里的&lt;strong&gt;非技术用户&lt;/strong&gt;根本就不关心手机的链接状态，关心的是&lt;strong&gt;是否能查看和发微薄&lt;/strong&gt;。&lt;/p&gt; &lt;p&gt;这里用户故事有以下的附加条款（acceptance criteria）：&lt;/p&gt; &lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt; &lt;p&gt;1.如果能接触（这里没有使用链接，其实也是这个意思，connect）到微薄后台服务，直接打开app，显示默认页，例如&amp;#8220;@我的&amp;#8221;&lt;/p&gt; &lt;p&gt;2.如果不能接触到微薄后台服务，而且没有缓存，提示用户没网络链接，请稍候再试。&lt;/p&gt; &lt;p&gt;3.如果不能接触到微薄后台服务，而且有缓存，提示用户只能看缓存。&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;这个用户故事有个特点是，不由用户来决定，而是预定动作，&lt;strong&gt;强迫&lt;/strong&gt;用户选择或接受，但是假装很尊重用户的样子。&lt;em&gt;回到Jobs那句话，给用户最好的选择就是不给他选择。&lt;/em&gt;&lt;/p&gt; &lt;p&gt;-------------------------跑回到主题上------------------------------------------------------------------------------------&lt;/p&gt; &lt;p&gt;&lt;em&gt;&lt;/em&gt;&lt;/p&gt; &lt;p&gt;由此可以知道关心这种问题的都不是&amp;#8220;&lt;strong&gt;非技术用户&lt;/strong&gt;&amp;#8221;，对，我就是说你，0_^。其实Windows  Phone已经把管理网络链接的主动权收起来，统一由系统进行管理，作为app开发者不一定要把这个问题查根问底也能写出很优秀的程序，但是如果真的想知道，我下面尽力探讨一下。&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;什么时候Windows Phone在空闲状态会进行网络链接&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;上面讲到网络链接的策略，因此我们开发的app符合这些策略，就会在空闲状态下也进行网络链接。我尽力列出所有可能出现的情况：&lt;/p&gt; &lt;p&gt;&lt;strong&gt;ApplicationIdleDetectionMode设置为disabled&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Windows Phone的app可以通过修改&lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.phone.shell.phoneapplicationservice(v=vs.92).aspx"&gt;PhoneApplicationService&lt;/a&gt;的&lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.phone.shell.phoneapplicationservice.applicationidledetectionmode(v=vs.92).aspx"&gt;ApplicationIdleDetectionMode&lt;/a&gt;强制app在锁屏的时候不会被墓碑化（注意Mango发布后这个功能有时候是鸡肋了），这种程序一般是导航程序，音乐播放程序（mango后有替代方案，会在后面讲述），也就是手机锁屏，app还是继续运行，程序可以继续做一些网络request，这样WiFi链接就会保持（如果有WiFi链接的话）。但是根据微软的文档，在程序锁屏情况下&lt;strong&gt;应该&lt;/strong&gt;停止/关闭很多操作，例如Timer，动画（animations  ），重力加速计（accelerometer ），地理定位服务（Location Service  ），FM收音机，同时断开网络链接等等。但是注意我这里使用了应该，没有说必须，因此app还是可以继续做网络请求的。&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Background Audio &lt;/strong&gt;&lt;/p&gt; &lt;p&gt;使用&lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.phone.backgroundaudio.audioplayeragent(v=vs.92).aspx"&gt;AudioPlayerAgent&lt;/a&gt;（后台音频播放）的app在锁屏的时候也可以继续播放，如果音频的url指定为网络的url，那么为了能正常播放，Windows  Phone继续保持WiFi链接如果WiFi可用的话。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;strong&gt;Background File Transfers &lt;/strong&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;如果app使用了&lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.phone.backgroundtransfer.backgroundtransferservice(v=vs.92).aspx"&gt;BackgroundTransferService&lt;/a&gt;（后台传输服务），那么程序会在特定情况下保持链接，继续下载，如果文件小于20M，Windows  Phone会继续使用3G下载，如果文件100M以下，那么Windows  Phone会继续使用WiFi下载文件，如果文件大于100M，必须外接电源和联通WiFi的情况下Windows Phone才会启动下载。&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Background Agents &lt;/strong&gt;&lt;/p&gt; &lt;p&gt;如果app使用了&lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.phone.scheduler.scheduledtask(v=vs.92).aspx"&gt;ScheduledTask&lt;/a&gt;（定时任务），那么程序在每隔一段时间会启动执行一下，可能有两种不同的任务如下&lt;/p&gt; &lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt; &lt;p&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.phone.scheduler.periodictask(v=vs.92).aspx"&gt;PeriodicTask&lt;/a&gt;  （周期性任务）会每隔30分钟执行一次，每次只能执行25秒。&lt;/p&gt; &lt;p&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.phone.scheduler.resourceintensivetask(v=vs.92).aspx"&gt;ResourceIntensiveTask&lt;/a&gt;  （耗资源的任务）每隔10分钟执行一次，但是需要连接上外接电源。&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;其中两种任务在执行过程都可以链接网络，请求网络资源的。&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;strong&gt;Schedule Tile &lt;/strong&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;如果app使用了&lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.phone.shell.shelltileschedule(v=VS.92).aspx"&gt;ShellTileSchedule&lt;/a&gt;（信息块更新任务），那么程序每隔一段时间可以更新Live  Tile，如果Tile的图片在网络上，会启动网络链接。&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Tile Notification&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;官方没有说明推送任务的实现细节，从系统角度看一般实现方法可能如下：&lt;/p&gt; &lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt; &lt;p&gt;1.通过sms触发手机去请求。&lt;/p&gt; &lt;p&gt;2.手机定时pull（拉）信息。&lt;/p&gt;&lt;/blockquote&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;不管哪种方法，微软试图做的是提供良好的用户体验（包括电源消耗，反映速度，通信资费等等），因此作为app开发者，我们要做的是在现有的限制条件下，提供更好的用户体验，没必要为了数据长链接而破坏用户体验。&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;有任何问题，请留言，或者微博我 &lt;a href="http://weibo.com/yongjianlin"&gt;@林永坚jake&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;一年一度的墨尔本杯又来了，看马看美女的时候到了，一起来下来免费Melbourne Cup app吧。&lt;/p&gt; &lt;p&gt;&lt;a href="http://http//windowsphone.com/s?appid=8801c39f-519c-48a1-a21a-2585ddb851d4"&gt;http://http://windowsphone.com/s?appid=8801c39f-519c-48a1-a21a-2585ddb851d4&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://redirect.zune.net/redirect?type=phoneApp&amp;amp;id=8801c39f-519c-48a1-a21a-2585ddb851d4"&gt;&lt;img src="http://www.wpxap.com/static/image/wpxap/zuned.gif" alt="" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;img alt="" src="http://catalog.zune.net/v3.2/en-US/image/1bc3bd3b-27b2-4ae6-90a9-b83430b15dbf?width=150&amp;amp;height=150&amp;amp;resize=true" width="176" height="293" /&gt;&lt;img alt="" src="http://catalog.zune.net/v3.2/en-US/image/694e298c-c44c-4f31-b95b-4370d3cdb6c3?width=150&amp;amp;height=150&amp;amp;resize=true" width="176" height="293" /&gt;&lt;img alt="" src="http://catalog.zune.net/v3.2/en-US/image/3f28a859-60a5-448a-bd0f-7033847a977b?width=150&amp;amp;height=150&amp;amp;resize=true" width="176" height="293" /&gt;&lt;img alt="" src="http://catalog.zune.net/v3.2/en-US/image/636475c4-00a2-4222-8d7f-444854970ee2?width=150&amp;amp;height=150&amp;amp;resize=true" width="176" height="293" /&gt;&lt;br /&gt;&lt;img alt="" src="http://catalog.zune.net/v3.2/en-US/image/3a4d32b6-3536-4a09-af2b-aa6f4be82ec5?width=150&amp;amp;height=150&amp;amp;resize=true" width="178" height="297" /&gt;&lt;img alt="" src="http://catalog.zune.net/v3.2/en-US/image/4a394db1-a5c2-411f-8e33-80832e821e07?width=150&amp;amp;height=150&amp;amp;resize=true" width="178" height="296" /&gt;&lt;img alt="" src="http://catalog.zune.net/v3.2/en-US/image/6f87ae12-2869-402e-b4f3-cd0d3f17acbf?width=150&amp;amp;height=150&amp;amp;resize=true" width="178" height="296" /&gt;&lt;img alt="" src="http://catalog.zune.net/v3.2/en-US/image/c9b4ee8d-a843-430a-842c-e4add468a802?width=150&amp;amp;height=150&amp;amp;resize=true" width="178" height="296" /&gt; &lt;/p&gt;&lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://http//windowsphone.com/s?appid=8801c39f-519c-48a1-a21a-2585ddb851d4"&gt;http://http://windowsphone.com/s?appid=8801c39f-519c-48a1-a21a-2585ddb851d4&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://redirect.zune.net/redirect?type=phoneApp&amp;amp;id=8801c39f-519c-48a1-a21a-2585ddb851d4"&gt;&lt;img src="http://www.wpxap.com/static/image/wpxap/zuned.gif" alt="" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;任何建议都welcome，谢谢！&lt;/p&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/procoder/aggbug/2227861.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/procoder/archive/2011/10/28/WIndows-Phone-Idle-Mode.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/procoder/archive/2011/08/24/Bing-Maps-Control-for-WPF-and-Surface2.html</id><title type="text">Bing Maps控件 for WPF和Surface 2</title><summary type="text">之前我们在Surface2上使用Bing map的时候，不得不使用WebControl+Bing Maps Silverlight Control的方式来完成，现在微软终于发布了Bing Maps WPF Control。我们可以使用原生的Bing Maps控件了。</summary><published>2011-08-24T03:01:00Z</published><updated>2011-08-24T03:01:00Z</updated><author><name>Jake Lin</name><uri>http://www.cnblogs.com/procoder/</uri></author><link rel="alternate" href="http://www.cnblogs.com/procoder/archive/2011/08/24/Bing-Maps-Control-for-WPF-and-Surface2.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/procoder/archive/2011/08/24/Bing-Maps-Control-for-WPF-and-Surface2.html"/><content type="html">&lt;p&gt;&lt;strong&gt;背景&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;之前我们在Surface2上使用Bing map的时候，不得不使用WebControl+Bing Maps Silverlight Control的方式来完成，现在微软终于发布了&lt;a href="http://www.bing.com/community/site_blogs/b/maps/archive/2011/08/22/announcing-the-bing-maps-wpf-control.aspx?wa=wsignin1.0"&gt;Bing Maps WPF Control&lt;/a&gt;。我们可以使用原生的Bing Maps控件了。&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;下载Bing Maps WPF Control&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;请到&lt;a title="http://www.microsoft.com/download/en/details.aspx?id=27165" href="http://www.microsoft.com/download/en/details.aspx?id=27165"&gt;http://www.microsoft.com/download/en/details.aspx?id=27165&lt;/a&gt;下载并安装&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;如何使用Bing Maps WPF Control&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;下面演示如何在Surface2项目中使用Bing Maps WPF Control。&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;下载并安装Surface2 sdk&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;如果没有安装Surface2 sdk，请在&lt;a href="http://www.microsoft.com/download/en/details.aspx?displaylang=en&amp;amp;id=26716"&gt;http://www.microsoft.com/download/en/details.aspx?displaylang=en&amp;amp;id=26716&lt;/a&gt;进行下载安装。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;创建Surface2项目&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;创建一个Surface2的项目&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/procoder/201108/201108241050123476.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/procoder/201108/201108241050163604.png" width="393" height="273" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;引用Microsoft.Maps.MapControl.WPF.dll&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;增加对Microsoft.Maps.MapControl.WPF.dll的引用，该DLL可能位于&lt;strong&gt;Program Files&lt;/strong&gt;或者&lt;strong&gt;Program Files (x86)&lt;/strong&gt;下，例如C:\Program Files (x86)\Bing Maps WPF Control\Beta\Libraries&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/procoder/201108/201108241050201604.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/procoder/201108/201108241050247271.png" width="440" height="367" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;增加XML命名空间&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;在Xmal文件中增加对Microsoft.Maps.MapControl.WPF引用的命名空间&lt;/p&gt;  &lt;pre &gt;&lt;span style="color: red"&gt;xmlns&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: red"&gt;m&lt;/span&gt;&lt;span style="color: blue"&gt;="clr-namespace:Microsoft.Maps.MapControl.WPF;assembly=Microsoft.Maps.MapControl.WPF"&#xD;
&lt;/span&gt;&lt;/pre&gt;&#xD;
&#xD;
&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;strong&gt;增加Map标签&lt;/strong&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;在内容网格（content grid）上增加一个Map标签，如下所示&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&#xD;
&#xD;
&#xD;
&#xD;
&#xD;
&#xD;
&#xD;
&#xD;
&#xD;
&lt;pre &gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;s&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;SurfaceWindow &lt;/span&gt;&lt;span style="color: red"&gt;x&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: red"&gt;Class&lt;/span&gt;&lt;span style="color: blue"&gt;="SurfaceApplicationBingMaps.SurfaceWindow1"&#xD;
    &lt;/span&gt;&lt;span style="color: red"&gt;xmlns&lt;/span&gt;&lt;span style="color: blue"&gt;="http://schemas.microsoft.com/winfx/2006/xaml/presentation"&#xD;
    &lt;/span&gt;&lt;span style="color: red"&gt;xmlns&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: red"&gt;x&lt;/span&gt;&lt;span style="color: blue"&gt;="http://schemas.microsoft.com/winfx/2006/xaml"&#xD;
    &lt;/span&gt;&lt;span style="color: red"&gt;xmlns&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: red"&gt;s&lt;/span&gt;&lt;span style="color: blue"&gt;="http://schemas.microsoft.com/surface/2008"&#xD;
    &lt;/span&gt;&lt;span style="color: red"&gt;xmlns&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: red"&gt;m&lt;/span&gt;&lt;span style="color: blue"&gt;="clr-namespace:Microsoft.Maps.MapControl.WPF;assembly=Microsoft.Maps.MapControl.WPF"&#xD;
    &lt;/span&gt;&lt;span style="color: red"&gt;Title&lt;/span&gt;&lt;span style="color: blue"&gt;="SurfaceApplicationBingMaps"&#xD;
    &amp;gt;&#xD;
  &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Grid&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
        &lt;font style="background-color: #ffff00"&gt;&amp;lt;&lt;/font&gt;&lt;/span&gt;&lt;font style="background-color: #ffff00"&gt;&lt;span style="color: #a31515"&gt;m&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;Map&lt;/span&gt;&lt;/font&gt;&lt;span style="color: blue"&gt;&lt;font style="background-color: #ffff00"&gt;/&amp;gt;&lt;/font&gt;&#xD;
    &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Grid&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;s&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;SurfaceWindow&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
&lt;/span&gt;&lt;/pre&gt;&#xD;
&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;现在启动一下程序，我们已经看到Bing Map了。&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/procoder/201108/201108241050399590.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/procoder/201108/201108241050516907.png" width="946" height="506" /&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;与其他Bing Maps控件一样，需要一个key把中间的版权信息去掉。这个key是免费申请的，可以参考我之前制作的视频。&lt;/p&gt;&#xD;
&#xD;
&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&#xD;
  &lt;p&gt;&lt;a href="http://www.cnblogs.com/procoder/archive/2010/12/06/Silverlight-for-Windows-Phone-Webcasts.html"&gt;MSDN webcast《Silverlight for Windows Phone开发》系列视频&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;/blockquote&gt;&#xD;
&#xD;
&lt;p&gt;&lt;strong&gt;&lt;a href="https://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032474384&amp;amp;Culture=zh-CN"&gt;Silverlight for Windows Phone 开发系列课程(15)：Bing Maps控件&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;把key放到&lt;span style="color: red"&gt;CredentialsProvider&lt;/span&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;pre &gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;m&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;Map  &lt;/span&gt;&lt;span style="color: red"&gt;CredentialsProvider&lt;/span&gt;&lt;span style="color: blue"&gt;="请输入你的key" /&amp;gt;&#xD;
&lt;/span&gt;&lt;/pre&gt;&#xD;
&#xD;
&#xD;
&lt;p&gt;如下所示，增加了key以后，中间的版权信息就消失了。&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/procoder/201108/20110824105104536.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/procoder/201108/20110824105123441.png" width="966" height="517" /&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;strong&gt;操控Bing Maps控件&lt;/strong&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;幸运的是操控Bing Maps控件的方式与Bing Maps WPF与Silverlight和Windows Phone版本的一样，详情可以参考我的视频&lt;a href="https://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032474384&amp;amp;Culture=zh-CN"&gt;Silverlight for Windows Phone 开发系列课程(15)：Bing Maps控件&lt;/a&gt;，下面简单演示一下如何操控Bing Maps控件。&lt;/p&gt;&#xD;
&#xD;
&lt;pre &gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;m&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;Map  &lt;/span&gt;&lt;span style="color: red"&gt;CredentialsProvider&lt;/span&gt;&lt;span style="color: blue"&gt;="请输入你的key"  &lt;/span&gt;&lt;span style="color: red"&gt;Mode&lt;/span&gt;&lt;span style="color: blue"&gt;="AerialWithLabels" &lt;/span&gt;&lt;span style="color: red"&gt;Center&lt;/span&gt;&lt;span style="color: blue"&gt;="37.806029,-122.407007" &lt;/span&gt;&lt;span style="color: red"&gt;ZoomLevel&lt;/span&gt;&lt;span style="color: blue"&gt;="16" /&amp;gt;&#xD;
&#xD;
&lt;/span&gt;&lt;/pre&gt;&#xD;
&#xD;
&#xD;
&lt;p&gt;在上面的Xmal中，我把地图的Mode（显示模式，一个为卫星图，公路图等），中心点和缩放大小进行了修改，效果如下所示：&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/procoder/201108/201108241052088685.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/procoder/201108/201108241052366269.png" width="966" height="521" /&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;广告时间，更多的操作请参考我之前制作的视频。&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;strong&gt;地图服务&lt;/strong&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;地图服务主要支持根据经纬度查询地址，根据地址查询经纬度，根据起始点和终点计算路线等。Bing Maps WPF控件的地图服务与Silverlight和Windows Phone上使用的版本一样，因为都是同一个WCF服务，所以请参考我的视频，调用地图服务部分。&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;strong&gt;在Surface2上的演示&lt;/strong&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;实际上这个控件支持鼠标操作，例如滚动鼠标中间的转轮时会缩放地图。但是在Surface2上没有鼠标，平常我使用支持多点触碰的屏幕进行测试，但是如果没有多点触摸屏，我们也使用Surface2的sdk来模拟Pinch-to-Zoom（缩放）操作。下面讲述如何模拟该操作。&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;首先启动Surface Input Simulator，如下图&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/procoder/201108/201108241052392069.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/procoder/201108/201108241052428150.png" width="136" height="414" /&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;后点击&lt;a href="http://images.cnblogs.com/cnblogs_com/procoder/201108/201108241052443002.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/procoder/201108/201108241052451441.png" width="29" height="27" /&gt;&lt;/a&gt;按钮，这样鼠标操作就转变成touch操作了。首先在使用鼠标左键点击要放置手指的地方，手指变成红色，然后点击右键，手机会贴在该位置上，我存放了4个手指（模拟除大拇指以外的手指）在地图上，然后拖到第五个手指（模拟大拇指）来继续缩放，surface2支持42个手指同时操作。&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/procoder/201108/20110824105329930.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/procoder/201108/201108241053536436.png" width="834" height="432" /&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;演示到这里，随着Windows 8的发布（一起关注9月份的BUILD大会），基于触摸的程序会越来越流行，Surface sdk把WPF带入触摸的世界，大量地简化我们开发触摸设备的工作。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/procoder/aggbug/2151650.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/procoder/archive/2011/08/24/Bing-Maps-Control-for-WPF-and-Surface2.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/procoder/archive/2011/06/30/Windows-Phone-Mango.html</id><title type="text">Windows Phone 7.1 Mango ROM 安装指南</title><summary type="text">期待已久的Windows Phone 7.1 Mango ROM 终于有了developer测试版。本文讲述安装方法。</summary><published>2011-06-30T04:49:00Z</published><updated>2011-06-30T04:49:00Z</updated><author><name>Jake Lin</name><uri>http://www.cnblogs.com/procoder/</uri></author><link rel="alternate" href="http://www.cnblogs.com/procoder/archive/2011/06/30/Windows-Phone-Mango.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/procoder/archive/2011/06/30/Windows-Phone-Mango.html"/><content type="html">&lt;p&gt;&lt;/p&gt;  &lt;p&gt;期待已久的Windows Phone 7.1 Mango ROM 终于有了developer测试版。下面是安装方法。&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;准备条件&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;一台Windows Phone手机。 &lt;/li&gt;    &lt;li&gt;一台Windows 7电脑。 &lt;/li&gt;    &lt;li&gt;开发者帐号，而且在下列地区。 &lt;/li&gt; &lt;/ul&gt;  &lt;p align="left"&gt;Australia    &lt;br /&gt;Austria     &lt;br /&gt;Belgium&lt;/p&gt;  &lt;p align="left"&gt;Brazil    &lt;br /&gt;Canada     &lt;br /&gt;Denmark&lt;/p&gt;  &lt;p align="left"&gt;Finland    &lt;br /&gt;France     &lt;br /&gt;Germany&lt;/p&gt;  &lt;p align="left"&gt;Great Britain    &lt;br /&gt;Greece     &lt;br /&gt;Ireland&lt;/p&gt;  &lt;p align="left"&gt;Italy    &lt;br /&gt;Luxembourg     &lt;br /&gt;Mexico&lt;/p&gt;  &lt;p align="left"&gt;Netherlands    &lt;br /&gt;New Zealand     &lt;br /&gt;Norway&lt;/p&gt;  &lt;p align="left"&gt;Portugal    &lt;br /&gt;Spain     &lt;br /&gt;Sweden&lt;/p&gt;  &lt;p align="left"&gt;Switzerland    &lt;br /&gt;United States&lt;/p&gt;  &lt;p align="left"&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;strong&gt;下载&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;安装这个ROM是需要&lt;a href="http://www.microsoft.com/download/en/details.aspx?displaylang=en&amp;amp;id=26648"&gt;Windows Phone SDK 7.1 Beta 2&lt;/a&gt;工具。下面是安装方法。&lt;/p&gt;  &lt;p&gt;下载链接&lt;a href="http://www.microsoft.com/download/en/details.aspx?displaylang=en&amp;amp;id=26648"&gt;http://www.microsoft.com/download/en/details.aspx?displaylang=en&amp;amp;id=26648&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/procoder/201106/201106301242439468.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/procoder/201106/201106301242489996.png" width="686" height="467" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;点击下载&amp;#8220;vm_web2.exe&amp;#8221;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;卸载Windows Phone SDK 7.1 &lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;如果你已经安装过7.1的SDK beta工具，安装的时候会提示错误，要先卸载掉。&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/procoder/201106/201106301242514164.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/procoder/201106/201106301242547526.png" width="389" height="453" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/procoder/201106/201106301242557168.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/procoder/201106/201106301242587399.png" width="390" height="155" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;安装 7.1 Beta2&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/procoder/201106/201106301243018252.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/procoder/201106/201106301243054221.png" width="394" height="355" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/procoder/201106/201106301243091063.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/procoder/201106/201106301244071174.png" width="395" height="356" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/procoder/201106/201106301244129194.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/procoder/201106/201106301244155621.png" width="396" height="357" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/procoder/201106/201106301244191000.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/procoder/201106/201106301244223315.png" width="395" height="356" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/procoder/201106/201106301244262599.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/procoder/201106/201106301244338931.png" width="394" height="355" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;完成Survey并下载ROM&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;只有在指定地区的Windows Phone者才收到这个Survey的邀请邮件。&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/procoder/201106/201106301244366131.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/procoder/201106/201106301244396461.png" width="471" height="249" /&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/procoder/201106/201106301244411709.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/procoder/201106/20110630124443860.png" width="466" height="208" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;填写survey&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/procoder/201106/201106301244465825.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/procoder/201106/201106301244491487.png" width="485" height="339" /&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/procoder/201106/201106301244527291.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/procoder/201106/201106301244544524.png" width="512" height="281" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;完成Survey，然后就可以下载ROM了。&lt;/p&gt;  &lt;p&gt;ROM包含了一个PDF文件，详细的描述整个更新过程，按照PDF来做就能更新了。&lt;/p&gt;  &lt;p&gt;在这个PDF文档中，微软一直强调备份数据，因此我也备份了好几次。这个更新是有风险的，可能把手机变砖头，所以大家如果要更新要慎重考虑。&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;祝一切顺利。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/procoder/aggbug/2094361.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/procoder/archive/2011/06/30/Windows-Phone-Mango.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/procoder/archive/2011/04/04/Windows-phone-NoDo-Update.html</id><title type="text">Windows Phone更新NoDo Update最简单的方法</title><summary type="text">本文讲述如何通过最简单的方法更新Windows Phone的NoDo Update</summary><published>2011-04-04T13:25:00Z</published><updated>2011-04-04T13:25:00Z</updated><author><name>Jake Lin</name><uri>http://www.cnblogs.com/procoder/</uri></author><link rel="alternate" href="http://www.cnblogs.com/procoder/archive/2011/04/04/Windows-phone-NoDo-Update.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/procoder/archive/2011/04/04/Windows-phone-NoDo-Update.html"/><content type="html">&#xD;
&lt;p&gt;&lt;strong&gt;下载Update工具&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;根据不同版本下载Update工具&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;x86 Operating System (32 bit)&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://download.microsoft.com/download/1/5/4/15427EAF-AD42-4E4A-8179-9A3C5483E366/WPSupportTool-x86.msi"&gt;Windows Phone Support Tools&lt;/a&gt;    &lt;br /&gt;&lt;a href="http://blog.walshie.me/Share/ChevronWP7.Updater.x86.zip"&gt;ChevronWP7.Updater&lt;/a&gt;    &lt;br /&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;x64 Operating System (64 bit)&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://download.microsoft.com/download/1/5/4/15427EAF-AD42-4E4A-8179-9A3C5483E366/WPSupportTool-amd64.msi"&gt;Windows Phone Support Tools&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blog.walshie.me/Share/ChevronWP7.Updater.x64.zip"&gt;ChevronWP7.Updater&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;先安装Windows Phone Support Tools，这是来自微软的工具。&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;运行ChevronWp7.Updater&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;链接Windows Phone到PC&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;运行ChevronWp7.Updater&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/procoder/201104/201104042121278285.png"&gt;&lt;img style="border: 0px currentColor; padding-top: 0px; padding-right: 0px; padding-left: 0px; display: inline;background-image: none;" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/procoder/201104/201104042121464842.png" width="721" height="365" /&gt;&lt;/a&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/procoder/201104/201104042121547855.png"&gt;&lt;img style="border: 0px currentColor; padding-top: 0px; padding-right: 0px; padding-left: 0px; display: inline;background-image: none;" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/procoder/201104/201104042122259602.png" width="724" height="367" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;下载Update，Windows Phone自动重启。&lt;/p&gt;  &lt;p&gt;&lt;img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/procoder/hd7.png" /&gt;&lt;/p&gt;  &lt;p&gt;等待不到10分钟，更新成功，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;可以在Zune查到更新的版本&lt;/p&gt;  &lt;p&gt;具体版本号如下：&lt;/p&gt;  &lt;p&gt;pre-NoDo (7008)&lt;/p&gt;  &lt;p&gt;NoDo (7355)&lt;/p&gt;  &lt;p&gt;NoDo update 1 (7389)&lt;/p&gt;  &lt;p&gt;NoDo update 2 (7390)&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/procoder/201104/201104042122469549.png"&gt;&lt;img style="border: 0px currentColor; padding-top: 0px; padding-right: 0px; padding-left: 0px; display: inline;background-image: none;" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/procoder/201104/201104042122534679.png" width="929" height="633" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;参考 &lt;a href="http://blog.walshie.me/2011/04/04/so-who-wants-windows-phone-updates-like-right-now/"&gt;http://blog.walshie.me/2011/04/04/so-who-wants-windows-phone-updates-like-right-now/&lt;/a&gt;&lt;/p&gt; &#xD;
&lt;img src="http://www.cnblogs.com/procoder/aggbug/2005415.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/procoder/archive/2011/04/04/Windows-phone-NoDo-Update.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/procoder/archive/2011/03/19/How-to-calculate-distance-between-two-geo-points.html</id><title type="text">计算地球上两点的直线距离</title><summary type="text">本文讲述计算地球上两点的直线距离。</summary><published>2011-03-19T00:41:00Z</published><updated>2011-03-19T00:41:00Z</updated><author><name>Jake Lin</name><uri>http://www.cnblogs.com/procoder/</uri></author><link rel="alternate" href="http://www.cnblogs.com/procoder/archive/2011/03/19/How-to-calculate-distance-between-two-geo-points.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/procoder/archive/2011/03/19/How-to-calculate-distance-between-two-geo-points.html"/><content type="html">&lt;p&gt;我记得以前有人问过我就这个问题，我们自己的程序也有这些计算方法，但是今天发现微软已经为我们直接提供了这个方法，真是短平快。&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;GeoCoordinate的GetDistanceTo&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;参数是GeoCoordinate的对象，用来计算两个GeoCoordinate的距离。 &lt;/p&gt;&lt;img src="http://www.cnblogs.com/procoder/aggbug/1988579.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/procoder/archive/2011/03/19/How-to-calculate-distance-between-two-geo-points.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/procoder/archive/2011/03/11/Windows-Phone-Developer-Tools-January-2011-Update.html</id><title type="text">Windows Phone Developer Tools January 2011 Update全面支持拷贝粘贴功能</title><summary type="text">本文讲述Windows Phone Developer Tools January 2011 Update新功能介绍。</summary><published>2011-03-10T23:00:00Z</published><updated>2011-03-10T23:00:00Z</updated><author><name>Jake Lin</name><uri>http://www.cnblogs.com/procoder/</uri></author><link rel="alternate" href="http://www.cnblogs.com/procoder/archive/2011/03/11/Windows-Phone-Developer-Tools-January-2011-Update.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/procoder/archive/2011/03/11/Windows-Phone-Developer-Tools-January-2011-Update.html"/><content type="html">&lt;p&gt;&lt;strong&gt;下载和安装&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;必须先安装Windows Phone Developer Tools RTM版本，无需安装2010 October update。&lt;/p&gt;&#xD;
&lt;p&gt;下载地址 &lt;br /&gt;&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://www.microsoft.com/downloads/en/details.aspx?FamilyID=49b9d0c5-6597-4313-912a-f0cca9c7d277" target="_blank"&gt;Windows Phone Developer Tools January 2011 Update&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;注意两个文件都要安装。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div multidownload-col="" breakword=""&gt;VS10-KB2486994-x86.exe&lt;/div&gt;&#xD;
&lt;div multidownload-col="" spacing-span=""&gt;763KB&lt;/div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt; &lt;a href="http://www.microsoft.com/downloads/info.aspx?na=46&amp;amp;SrcFamilyId=49B9D0C5-6597-4313-912A-F0CCA9C7D277&amp;amp;SrcDisplayLang=en&amp;amp;u=http%3a%2f%2fdownload.microsoft.com%2fdownload%2f6%2fD%2f6%2f6D66958D-891B-4C0E-BC32-2DFC41917B11%2fVS10-KB2486994-x86.exe"&gt;Download&lt;/a&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div multidownload-col="" breakword=""&gt;WindowsPhoneDeveloperResources_en-US_Patch1.msp&lt;/div&gt;&#xD;
&lt;div multidownload-col="" spacing-span=""&gt;125.7MB&lt;/div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt; &lt;a href="http://www.microsoft.com/downloads/info.aspx?na=46&amp;amp;SrcFamilyId=49B9D0C5-6597-4313-912A-F0CCA9C7D277&amp;amp;SrcDisplayLang=en&amp;amp;u=http%3a%2f%2fdownload.microsoft.com%2fdownload%2f6%2fD%2f6%2f6D66958D-891B-4C0E-BC32-2DFC41917B11%2fWindowsPhoneDeveloperResources_en-US_Patch1.msp"&gt;Download&lt;/a&gt;&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;更新&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;如果这些控件没有放到Pivot和Panorama控件里面，系统会自动引入拷贝粘贴功能，但是如果包含在Pivot和Panorama控件里面，需要重新编译程序。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;Copy and Paste&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;Copy and paste is now enabled on Windows&amp;#174; Phone 7 in the following controls: &lt;/p&gt;&#xD;
&lt;p&gt;System.Windows.Controls.TextBox &lt;/p&gt;&#xD;
&lt;p&gt;System.Windows.Controls.PasswordBox &lt;/p&gt;&#xD;
&lt;p&gt;Text input fields within the Microsoft.Phone.Controls.WebBrowser control.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;其实大部分程序都不需要重新编译就自动支持copy &amp;amp; paste功能了,但是也有下面的例外 &lt;br /&gt;&#xD;
In applications that have pivot or panorama controls that contain text boxes, users can unintentionally change panes when trying to copy text. To prevent this problem, open your application, recompile it, and then resubmit it to the Windows Phone Marketplace. &lt;br /&gt;&#xD;
如果text box放到pivot或者panorama控件里面，需要程序编译，并重新提交。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;还有需要注意的是Copy &amp;amp; Paste只能在模拟器上运行，真实设备需要等NoDo的update。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;Windows Phone Capability Detection Tool和Windows Phone Connect Tool&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;这两个工具我没有感觉到区别。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;Updated Bing Maps Silverlight Control&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;这个好像优化了一些，如果能上youtube，可以看看我的app，里面包含了bing maps。&lt;/p&gt;&#xD;
&lt;object style="height: 344px; width: 425px;"&gt;&#xD;
&lt;param name="movie" value="http://www.youtube.com/v/MrY2VcgwZ-Y" /&gt;&lt;param name="allowFullScreen" value="true" /&gt;&lt;param name="allowScriptAccess" value="always" /&gt;&lt;embed src="http://www.youtube.com/v/MrY2VcgwZ-Y" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="425" height="344"&gt;&lt;/object&gt; &#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div&gt;http://www.youtube.com/watch?v=MrY2VcgwZ-Y&amp;amp;tracker=False&lt;/div&gt;&#xD;
&amp;nbsp;&#xD;
&lt;p&gt;我觉得最大的不同是Povit控件下的bingmap控件的拖动处理，原先的ROM在拖动BingMap控件的时候会转换PovitItem，更新后的版本会变成拖动BingMap的地图。大家可以分别在现实设备和更新了的模拟器上感受他们之间的区别。因为现实设备在更新NoDo之前拖动BingMap控件的时候都会转换PovitItem。要得到新版本的效果只能等NoDo的更新了。现在网络上流传一些NoDo的预览版，OS启动速度，程序启动速度以及resuming的速度都超快，微软这次牛了一把了。&lt;br /&gt;&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;大家也可以下载我的程序试试，trial版本的程序在审批中，估计这几天能上线，这样就能免费下载了。&lt;br /&gt;&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img alt="" src="http://images.cnblogs.com/cnblogs_com/procoder/900_250.png" border="0" /&gt;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;下载地址： &lt;/p&gt;&#xD;
&lt;div&gt;&lt;a target="_blank" href="http://social.zune.net/redirect?type=phoneApp&amp;amp;id=54c08db7-2443-e011-854c-00237de2db9e"&gt;http://social.zune.net/redirect?type=phoneApp&amp;amp;id=54c08db7-2443-e011-854c-00237de2db9e&lt;/a&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div&gt;&lt;a href="http://social.zune.net/redirect?type=phoneApp&amp;amp;id=54c08db7-2443-e011-854c-00237de2db9e" rel="nofollow"&gt;&lt;/a&gt;&lt;/div&gt;&#xD;
&lt;div&gt;另外一个程序，学习Windows Phone开发的利器 WP Webcast&lt;/div&gt;&#xD;
&lt;p&gt;&lt;img alt="" src="http://images.cnblogs.com/cnblogs_com/procoder/900_250w.png" border="0" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;youtube视频如下：&lt;br /&gt;&#xD;
&lt;object style="height: 344px; width: 425px;"&gt;&#xD;
&lt;param name="movie" value="http://www.youtube.com/v/I-AieZpVJx4" /&gt;&lt;param name="allowFullScreen" value="true" /&gt;&lt;param name="allowScriptAccess" value="always" /&gt;&lt;embed src="http://www.youtube.com/v/I-AieZpVJx4" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="425" height="344"&gt;&lt;/object&gt; &#xD;
&lt;br /&gt;&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div&gt;http://www.youtube.com/watch?v=I-AieZpVJx4&amp;amp;tracker=False&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
免费下载地址如下：&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div&gt;&lt;a target="_blank" href="http://social.zune.net/redirect?type=phoneApp&amp;amp;id=ddac45bc-4f3f-e011-854c-00237de2db9e"&gt;http://social.zune.net/redirect?type=phoneApp&amp;amp;id=ddac45bc-4f3f-e011-854c-00237de2db9e&lt;/a&gt;&lt;/div&gt;&#xD;
&lt;br /&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;img src="http://www.cnblogs.com/procoder/aggbug/1969505.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/procoder/archive/2011/03/11/Windows-Phone-Developer-Tools-January-2011-Update.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/procoder/archive/2011/03/03/Windows-Phone-Marketplace-increse-maximum-number-for-free-app.html</id><title type="text">Windows Phone Marketplace免费app的上传数量增加到100个</title><summary type="text">Windows Phone Marketplace免费app的上传数量增加到100个，有利于广告app的发展。</summary><published>2011-03-02T21:58:00Z</published><updated>2011-03-02T21:58:00Z</updated><author><name>Jake Lin</name><uri>http://www.cnblogs.com/procoder/</uri></author><link rel="alternate" href="http://www.cnblogs.com/procoder/archive/2011/03/03/Windows-Phone-Marketplace-increse-maximum-number-for-free-app.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/procoder/archive/2011/03/03/Windows-Phone-Marketplace-increse-maximum-number-for-free-app.html"/><content type="html">&lt;p&gt;&lt;/p&gt;  &lt;p&gt;来自微软的消息,Windows Phone Marketplace免费app的上传数量增加到100个.&lt;/p&gt;  &lt;p&gt;More Free App Submissions   &lt;br /&gt;During the past months we have been working hard to improve our overall Windows Phone Marketplace experience based on the feedback we received from you and our partners. We heard from many of you that you wanted a higher limit on the maximum number of free apps you could submit for free.     &lt;br /&gt;We've heard you and are pleased to announce that we&amp;#8216;ve increased that limit from 5 to 100.     &lt;br /&gt;If you&amp;#8217;re having trouble submitting your free apps, please contact &lt;a href="http://click.email.microsoftemail.com/?qs=6b1dfc64358895acd03faf83ccd0e872b57285a1389758c237efec4db9dc268dfe0d420bdec57f7e"&gt;support&lt;/a&gt;. &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;这对于习惯做广告app的人是好事，我现在还在徘徊，没觉得到底做广告app还是收费app。或者一个程序都做两个版本，反正100个的配额没法用完。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/procoder/aggbug/1969504.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/procoder/archive/2011/03/03/Windows-Phone-Marketplace-increse-maximum-number-for-free-app.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/procoder/archive/2011/03/03/Windows-Phone-Debug-Output.html</id><title type="text">如何把Windows Phone的debug信息输出到Visual Studio的Output窗口</title><summary type="text">本文讲述如何把Windows Phone的debug信息输出到Visual Studio的Output窗口</summary><published>2011-03-02T21:50:00Z</published><updated>2011-03-02T21:50:00Z</updated><author><name>Jake Lin</name><uri>http://www.cnblogs.com/procoder/</uri></author><link rel="alternate" href="http://www.cnblogs.com/procoder/archive/2011/03/03/Windows-Phone-Debug-Output.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/procoder/archive/2011/03/03/Windows-Phone-Debug-Output.html"/><content type="html">&lt;p&gt;在Windows Mobile上输出Debug信息，非常简单，可以直接使用Console.WriteLine，但是Windows Phone上不能使用这个方法了，其实也很简单，也就是一句话。&lt;/p&gt;  &lt;pre &gt;System.Diagnostics.&lt;span style="color: #2b91af;"&gt;Debug&lt;/span&gt;.WriteLine(&lt;span style="color: #a31515;"&gt;"Debug Message"&lt;/span&gt;);&lt;/pre&gt;&#xD;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&#xD;
&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;做法很简单，而且release版本会自动屏蔽了这些信息，非常实用，我在应用程序生命周期的视频中也用过这个方法，下面重点讲述一下为什么需要用这个函数。&#xD;
  &lt;br /&gt;根据自己的经验，原因有两个：&#xD;
&#xD;
  &lt;br /&gt;1.使用MVVM的时候，事件转换成预先定义的Command，这些commands在数据绑定的时候把delegate绑定到xaml上，因此，运行时是不能调试的(debug版本可以)。其实这不是主要原因，或者说根本原因，因为MVVM的一个特征是testable（可测试性），本人非常热爱TDD（单元测试驱动开发），更多的逻辑应该通过单元测试来判断而不是打印debug信息。&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;2.处理tombstone的时候，现在开发Windows Phone 7的程序，很多时间花在tombstone的处理上，我觉得&amp;#8220;tombstone的处理&amp;#8221;成为一个&lt;strong&gt;可用程序&lt;/strong&gt;与一个&lt;strong&gt;好用程序&lt;/strong&gt;的重要区别。目前为止，我觉得单元测试tombstone还是非常困难，因此Debug.WriteLine()成为我的选择。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/procoder/aggbug/1949806.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/procoder/archive/2011/03/03/Windows-Phone-Debug-Output.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/procoder/archive/2011/02/22/first-windows-phone7-update.html</id><title type="text">Windows Phone的第一个更新</title><summary type="text">本文讲述Windows Phone第一更新。</summary><published>2011-02-21T23:17:00Z</published><updated>2011-02-21T23:17:00Z</updated><author><name>Jake Lin</name><uri>http://www.cnblogs.com/procoder/</uri></author><link rel="alternate" href="http://www.cnblogs.com/procoder/archive/2011/02/22/first-windows-phone7-update.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/procoder/archive/2011/02/22/first-windows-phone7-update.html"/><content type="html">&lt;p&gt;&lt;strong&gt;更新出现的问题&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;前两天得到微软的通知准备在美国时间21日作出第一个update，由于受到NDA限制，过了今天才能发布消息。可是这个update还没有带copy &amp;amp; paste。 copy &amp;amp; paste功能已经在开发工具1月更新上加上了，能在模拟器上调试。很多程序基本不需要重编译就自动支持，除非textbox放到panorama控件下。&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;不管怎样毕竟是第一个update，还是非常期待。想在第一时间体验并分享给WP7开发者和爱好者。可是苦等多时，一直没有得到更新通知。不知道什么时候可以更新通知，微软这次真的不给力呀。&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;正常情况下，链接Windows Phone 7到Windows 7。然后打开Zune software，在settings-&amp;gt;UPDATE能看到更新信息，可是我的Zune software不是提示我的手机是最新的，就说没办法链接到更新服务。晕菜......&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/procoder/201102/201102220710048202.png"&gt;&lt;img style="border-width: 0px; display: inline;" title="image" alt="image" src="http://images.cnblogs.com/cnblogs_com/procoder/201102/201102220710069433.png" width="625" border="0" height="428" /&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/procoder/201102/201102220710081743.png"&gt;&lt;img style="border: 0px none; display: inline;" title="image" alt="image" src="http://images.cnblogs.com/cnblogs_com/procoder/201102/20110222071009465.png" width="630" border="0" height="432" /&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;下面讲讲正常update流程，由于我的手机不给力，只能从另外一个mvp的文章偷些图来用了。原文见&lt;a href="http://www.mobilityminded.com/12359/first-windows-phone7-update"&gt;http://www.mobilityminded.com/12359/first-windows-phone7-update&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;如果想得到Upate通知，需要在Windows Phone的Settings &amp;gt; System &amp;gt; Phone Update里面勾上update通知，如下图。&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.mobilityminded.com/2011/02/update1.jpg"&gt;&lt;img title="update1" alt="" src="http://images.mobilityminded.com/2011/02/update1.jpg" width="296" height="497" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;一旦有update通知，手机会提示，可知道这个不是一般的toast notification呢（关于push notification）可以参考我的视频&lt;a href="http://www.cnblogs.com/procoder/archive/2010/12/06/Silverlight-for-Windows-Phone-Webcasts.html"&gt;MSDN webcast《Silverlight for Windows Phone开发》系列视频&lt;/a&gt;。 我们第三方开发人员做不出这个toast出来的，如下图。&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.mobilityminded.com/2011/02/update2.jpg"&gt;&lt;img title="update2" alt="" src="http://images.mobilityminded.com/2011/02/update2.jpg" width="298" height="495" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;然后是链接手机到Windows的电脑，打开Zune Software。点击Upate，就出现下面的一些update画面。&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/procoder/201102/201102220710134769.png"&gt;&lt;img style="border: 0px none; display: inline;" title="image" alt="image" src="http://images.cnblogs.com/cnblogs_com/procoder/201102/201102220710179357.png" width="633" border="0" height="434" /&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/procoder/201102/20110222071020422.png"&gt;&lt;img style="border: 0px none; display: inline;" title="image" alt="image" src="http://images.cnblogs.com/cnblogs_com/procoder/201102/201102220710247517.png" width="639" border="0" height="438" /&gt;&lt;/a&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;a href="http://images.cnblogs.com/cnblogs_com/procoder/201102/201102220710273599.png"&gt;&lt;img style="border: 0px none; display: inline;" title="image" alt="image" src="http://images.cnblogs.com/cnblogs_com/procoder/201102/201102220710318743.png" width="645" border="0" height="442" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/procoder/201102/201102220710343396.png"&gt;&lt;img style="border: 0px none; display: inline;" title="image" alt="image" src="http://images.cnblogs.com/cnblogs_com/procoder/201102/201102220710386032.png" width="652" border="0" height="447" /&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/procoder/201102/201102220710413749.png"&gt;&lt;img style="border: 0px none; display: inline;" title="image" alt="image" src="http://images.cnblogs.com/cnblogs_com/procoder/201102/201102220710452273.png" width="649" border="0" height="445" /&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp; &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/procoder/201102/201102220710472566.png"&gt;&lt;img style="border: 0px none; display: inline;" title="image" alt="image" src="http://images.cnblogs.com/cnblogs_com/procoder/201102/201102220710501396.png" width="647" border="0" height="444" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;更新完毕， 操作系统版本号从7004变成7008只是一个很小的改变，NoDo需要等到下个月的更新了。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;关于更新一些注意点&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;由于更新通知通过一些运营商来发布，因此，如果没有sim卡的手机可能得不到更新通知，或者该运营商没有Windows Phone手机也可能得不到更新通知。据说解决方法是直接打开Zune Software的settings-&amp;gt;UPDATE，强制手机更新，但是我没有成功。&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;更新会使得ChevronWP7失效，如果需要非官方解锁的，最好观望一下。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/procoder/aggbug/1960313.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/procoder/archive/2011/02/22/first-windows-phone7-update.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry></feed>
