<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_Ringgo Yao</title><subtitle type="text">几年前追求完美，几近苛刻；几年后才发现，当初最不完美的那个人，其实是自己。</subtitle><id>http://feed.cnblogs.com/blog/u/68464/rss</id><updated>2012-05-22T02:56:04Z</updated><author><name>Ringgo.Yao</name><uri>http://www.cnblogs.com/626498301/</uri></author><generator>feed.cnblogs.com</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/626498301/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/68464/rss"/><entry><id>http://www.cnblogs.com/626498301/archive/2012/05/22/2512958.html</id><title type="text">Silverlight中使用MVVM(9)-绑定Enum类型数据</title><summary type="text">Silverlight中使用MVVM(1)--基础 Silverlight中使用MVVM(2)—提高 Silverlight中使用MVVM(3)—进阶 Silverlight中使用MVVM(4)—演练 Silverlight中使用MVVM(5)-Command II Silverlight中使用MVVM(6):AutoComplteBox的异步过滤 Silverlight中使用MVVM(7):DataGrid中触发Button的Click事件 Silverlight中使用MVVM(8)-使用AttachedProperty关闭ChildWindow 在实际开发程序的过程中,不乏处...</summary><published>2012-05-22T02:55:00Z</published><updated>2012-05-22T02:55:00Z</updated><author><name>Ringgo.Yao</name><uri>http://www.cnblogs.com/626498301/</uri></author><link rel="alternate" href="http://www.cnblogs.com/626498301/archive/2012/05/22/2512958.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/626498301/archive/2012/05/22/2512958.html"/><content type="html">&lt;p&gt;&lt;a href="http://www.cnblogs.com/626498301/archive/2010/08/17/1801475.html"&gt;&lt;font color="#0000ff"&gt;Silverlight中使用MVVM(1)--基础&lt;/font&gt;&lt;/a&gt;&lt;font color="#0000ff"&gt; &lt;/font&gt; &lt;p&gt;&lt;a href="http://www.cnblogs.com/626498301/archive/2010/08/18/1802204.html"&gt;&lt;font color="#0000ff"&gt;Silverlight中使用MVVM(2)—提高&lt;/font&gt;&lt;/a&gt;&lt;font color="#0000ff"&gt; &lt;/font&gt; &lt;p&gt;&lt;a href="http://www.cnblogs.com/626498301/archive/2010/08/19/1802974.html"&gt;&lt;font color="#0000ff"&gt;Silverlight中使用MVVM(3)—进阶&lt;/font&gt;&lt;/a&gt;&lt;font color="#0000ff"&gt; &lt;/font&gt; &lt;p&gt;&lt;a href="http://www.cnblogs.com/626498301/archive/2010/08/20/1804155.html"&gt;&lt;font color="#0000ff"&gt;Silverlight中使用MVVM(4)—演练&lt;/font&gt;&lt;/a&gt;&lt;font color="#0000ff"&gt; &lt;/font&gt; &lt;p&gt;&lt;a href="http://www.cnblogs.com/626498301/archive/2011/03/07/1973274.html"&gt;&lt;font color="#0000ff"&gt;Silverlight中使用MVVM(5)-Command II&lt;/font&gt;&lt;/a&gt;&lt;font color="#0000ff"&gt; &lt;/font&gt; &lt;p&gt;&lt;a href="http://www.cnblogs.com/626498301/archive/2011/03/30/1999549.html"&gt;&lt;font color="#0000ff"&gt;Silverlight中使用MVVM(6):AutoComplteBox的异步过滤&lt;/font&gt;&lt;/a&gt;&lt;font color="#0000ff"&gt; &lt;/font&gt; &lt;p&gt;&lt;a href="http://www.cnblogs.com/626498301/archive/2012/02/02/2335439.html"&gt;&lt;font color="#0000ff"&gt;Silverlight中使用MVVM(7):DataGrid中触发Button的Click事件&lt;/font&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.cnblogs.com/626498301/archive/2012/04/30/2476955.html"&gt;&lt;font color="#0000ff"&gt;Silverlight中使用MVVM(8)-使用AttachedProperty关闭ChildWindow&lt;/font&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 在实际开发程序的过程中,不乏处理枚举类型的情形, 比如在Code-Behind的方式下处理RadionButton是很容易的,但是如果在纯MVVM模式下通过绑定的方式&lt;/p&gt; &lt;p&gt;可能需要你花费不少的时间,本文提供MVVM模式下处理RadionButton与枚举类型绑定的一种方式:&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 首先看张效果图:&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;a href="http://images.cnblogs.com/cnblogs_com/626498301/201205/201205221054457221.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/626498301/201205/201205221054455551.png" width="244" height="73"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 我们要做的事情很简单,就是将枚举的属性值绑定到RadioButton上,有了本系列前面几篇文章的基础,我相信建立一个MVVM的框架已经了然于心了,所以本篇的重点集中&lt;/p&gt; &lt;p&gt;在ViewModel和View中.&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 首先我们构建一个枚举类型,ViewModel代码如下:&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;div id="codeSnippetWrapper"&gt; &lt;div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&lt;!--CRLF--&gt; public class ShellViewModel :PropertyChangedBase,IShell&lt;!--CRLF--&gt;  {&lt;!--CRLF--&gt;      private SwapDuteType _currentSwapOffDuteType;&lt;!--CRLF--&gt;      public SwapDuteType CurrentSwapOffDuteType&lt;!--CRLF--&gt;      {&lt;!--CRLF--&gt;          get { return _currentSwapOffDuteType; }&lt;!--CRLF--&gt;          set { _currentSwapOffDuteType = value;&lt;!--CRLF--&gt;              NotifyOfPropertyChange(() =&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;CurrentSwapOffDuteType );&lt;!--CRLF--&gt;          }&lt;!--CRLF--&gt;      }&lt;!--CRLF--&gt;      public ShellViewModel()&lt;!--CRLF--&gt;      {&lt;!--CRLF--&gt;          _currentSwapOffDuteType = SwapDuteType.TM;&lt;!--CRLF--&gt;      }&lt;!--CRLF--&gt;   }&lt;!--CRLF--&gt;  public enum SwapDuteType&lt;!--CRLF--&gt;    {&lt;!--CRLF--&gt;      TM, AM,PM&lt;!--CRLF--&gt;    }&lt;!--CRLF--&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ViewModel中仅仅创建了一个枚举类型的属性,我们在View中放3个RadionButton:&lt;/p&gt;&lt;div id="codeSnippetWrapper"&gt;&lt;div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;RadioButton&lt;/span&gt;  &lt;span style="color: #ff0000"&gt;x:Name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="tm"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;GroupName&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="t"&lt;/span&gt;&lt;!--CRLF--&gt;                   &lt;span style="color: #ff0000"&gt;IsChecked&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="{Binding CurrentSwapOffDuteType, ConverterParameter=TM, Converter={StaticResource EnumConverter}, Mode=TwoWay}"&lt;/span&gt; &lt;!--CRLF--&gt;                   &lt;span style="color: #ff0000"&gt;IsThreeState&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="False"&lt;/span&gt;    &lt;span style="color: #ff0000"&gt;Content&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="全天"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;VerticalAlignment&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="Center"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Margin&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="5,0"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;RadioButton&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;RadioButton&lt;/span&gt;  &lt;span style="color: #ff0000"&gt;x:Name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="am"&lt;/span&gt;  &lt;span style="color: #ff0000"&gt;IsThreeState&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="False"&lt;/span&gt;  &lt;span style="color: #ff0000"&gt;GroupName&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="a"&lt;/span&gt; &lt;!--CRLF--&gt;                &lt;span style="color: #ff0000"&gt;IsChecked&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="{Binding CurrentSwapOffDuteType, ConverterParameter=AM, Converter={StaticResource EnumConverter}, Mode=TwoWay}"&lt;/span&gt;&lt;!--CRLF--&gt;                &lt;span style="color: #ff0000"&gt;Content&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="上午"&lt;/span&gt;  &lt;span style="color: #ff0000"&gt;VerticalAlignment&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="Center"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Margin&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="5,0"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;RadioButton&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;RadioButton&lt;/span&gt; &lt;span style="color: #ff0000"&gt;x:Name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="pm"&lt;/span&gt;  &lt;span style="color: #ff0000"&gt;GroupName&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="p"&lt;/span&gt; &lt;!--CRLF--&gt;                            &lt;span style="color: #ff0000"&gt;IsChecked&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="{Binding CurrentSwapOffDuteType, ConverterParameter=PM, Converter={StaticResource EnumConverter}, Mode=TwoWay}"&lt;/span&gt;&lt;!--CRLF--&gt;            &lt;span style="color: #ff0000"&gt;IsThreeState&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="False"&lt;/span&gt;    &lt;span style="color: #ff0000"&gt;Content&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="下午"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;VerticalAlignment&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="Center"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Margin&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="5,0"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 关键的地方在于我们用的Converter, 这里其实主要是关于Enum.Parse()的使用:&lt;/p&gt;&lt;div id="codeSnippetWrapper"&gt;&lt;div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public class EnumConverter : IValueConverter&lt;!--CRLF--&gt;   {&lt;!--CRLF--&gt;       public object Convert(object value, Type targetType, object parameter, CultureInfo culture)&lt;!--CRLF--&gt;       {&lt;!--CRLF--&gt;           if (value == null || parameter == null)&lt;!--CRLF--&gt;               return value;&lt;!--CRLF--&gt;&amp;nbsp;&lt;!--CRLF--&gt;           return value.ToString() == parameter.ToString();&lt;!--CRLF--&gt;       }&lt;!--CRLF--&gt;&amp;nbsp;&lt;!--CRLF--&gt;       public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)&lt;!--CRLF--&gt;       {&lt;!--CRLF--&gt;           if (value == null || parameter == null)&lt;!--CRLF--&gt;               return value;&lt;!--CRLF--&gt;           return Enum.Parse(targetType, (String)parameter, true);&lt;!--CRLF--&gt;       }&lt;!--CRLF--&gt;   }&lt;!--CRLF--&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 这样我们就完成了最基本的View/ViewModel的内容,本系列前几篇都是以RelayCommand的方式处理View与ViewModel的联系,大约1年前我写了关于介绍Caliburn的几篇入门文章,&lt;/p&gt;&lt;p&gt;此后一直关注这个框架,但是由于当时产品已经初有成效,所以并未在实际的项目中采用,而现在它的精简版本Caliburn.Mirco甚至超越了Caliburn本身,随着产品的稳定,我也开始着手改善产品的架构.&lt;/p&gt;&lt;p&gt;自然不会在原来的源代码上修改了,毕竟思想不完全一样,否则反而会得不偿失.目前是倾向于使用Caliburn.Mirco重构客户端的代码,至少目前主要用到的特性比如Conventions,Actions都是挺不错的.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp; 因此本文源码中使用Cailburn.Mirco作为MVVM的框架,包括本系列的后续教程都会在此基础上,顺便会涉及该框架的一些使用.&amp;nbsp;&amp;nbsp; &lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp; &lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp; 源码下载:&lt;a href="http://files.cnblogs.com/626498301/EnumInMVVM.rar" target="_blank"&gt;&lt;font color="#0000ff"&gt;EnumInMVVM.rar&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/626498301/aggbug/2512958.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/626498301/archive/2012/05/22/2512958.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/626498301/archive/2012/04/30/2476955.html</id><title type="text">Silverlight中使用MVVM(8)-使用AttachedProperty关闭ChildWindow</title><summary type="text">Silverlight中使用MVVM(1)--基础 Silverlight中使用MVVM(2)—提高 Silverlight中使用MVVM(3)—进阶 Silverlight中使用MVVM(4)—演练 Silverlight中使用MVVM(5)-Command II Silverlight中使用MVVM(6):AutoComplteBox的异步过滤 Silverlight中使用MVVM(7):DataGrid中触发Button的Click事件 在使用MVVM的应用程序过程中，有时候你会发现尽管一些代码在Codebehind方式非常方便，但是有时项目组为了统一开发流程，需要成员...</summary><published>2012-04-30T07:41:00Z</published><updated>2012-04-30T07:41:00Z</updated><author><name>Ringgo.Yao</name><uri>http://www.cnblogs.com/626498301/</uri></author><link rel="alternate" href="http://www.cnblogs.com/626498301/archive/2012/04/30/2476955.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/626498301/archive/2012/04/30/2476955.html"/><content type="html">&lt;p&gt;&lt;a href="http://www.cnblogs.com/626498301/archive/2010/08/17/1801475.html"&gt;&lt;font color="#0000ff"&gt;Silverlight中使用MVVM(1)--基础&lt;/font&gt;&lt;/a&gt;  &lt;p&gt;&lt;a href="http://www.cnblogs.com/626498301/archive/2010/08/18/1802204.html"&gt;&lt;font color="#0000ff"&gt;Silverlight中使用MVVM(2)—提高&lt;/font&gt;&lt;/a&gt;  &lt;p&gt;&lt;a href="http://www.cnblogs.com/626498301/archive/2010/08/19/1802974.html"&gt;&lt;font color="#0000ff"&gt;Silverlight中使用MVVM(3)—进阶&lt;/font&gt;&lt;/a&gt;  &lt;p&gt;&lt;a href="http://www.cnblogs.com/626498301/archive/2010/08/20/1804155.html"&gt;&lt;font color="#0000ff"&gt;Silverlight中使用MVVM(4)—演练&lt;/font&gt;&lt;/a&gt;  &lt;p&gt;&lt;a href="http://www.cnblogs.com/626498301/archive/2011/03/07/1973274.html"&gt;&lt;font color="#0000ff"&gt;Silverlight中使用MVVM(5)-Command II&lt;/font&gt;&lt;/a&gt;  &lt;p&gt;&lt;a href="http://www.cnblogs.com/626498301/archive/2011/03/30/1999549.html"&gt;&lt;font color="#0000ff"&gt;Silverlight中使用MVVM(6):AutoComplteBox的异步过滤&lt;/font&gt;&lt;/a&gt;  &lt;p&gt;&lt;a href="http://www.cnblogs.com/626498301/archive/2012/02/02/2335439.html"&gt;&lt;font color="#0000ff"&gt;Silverlight中使用MVVM(7):DataGrid中触发Button的Click事件&lt;/font&gt;&lt;/a&gt;  &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 在使用MVVM的应用程序过程中，有时候你会发现尽管一些代码在Codebehind方式非常方便，但是有时项目组为了统一开发流程，需要成员遵循严格的MVVM模式，你不得不去多了解一些知识，比如我博客中提到的&lt;a href="http://www.cnblogs.com/626498301/archive/2011/12/08/2280482.html" target="_blank"&gt;&lt;font color="#0000ff"&gt;Behavior的使用&lt;/font&gt;&lt;/a&gt;.  &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 本文主要解决如何在MVVM模式下关闭一个ChildWindow，在Codebehind中只需要this.DialogResult = false这行代码就可以解决，本文给出一种使用  &lt;p&gt;附加属性解决这个问题的思路:&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 11px"&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; ChildwindowDialogResult&lt;br/&gt;    {&lt;br/&gt;        &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;readonly&lt;/span&gt; DependencyProperty DialogResultProperty =&lt;br/&gt;            DependencyProperty.RegisterAttached("&lt;span style="color: #8b0000"&gt;DialogResult&lt;/span&gt;", &lt;span style="color: #0000ff"&gt;typeof&lt;/span&gt;(Boolean?), &lt;span style="color: #0000ff"&gt;typeof&lt;/span&gt;(ChildwindowDialogResult),&lt;br/&gt;                                                &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; PropertyMetadata(OnSetDialogResultCallback));&lt;br/&gt;        &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; SetDialogResult(ChildWindow childWindow, Boolean? dialogResult)&lt;br/&gt;        {&lt;br/&gt;            childWindow.SetValue(DialogResultProperty, dialogResult);&lt;br/&gt;        }&lt;br/&gt;        &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; Boolean? GetDialogResult(ChildWindow childWindow)&lt;br/&gt;        {&lt;br/&gt;            &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; childWindow.GetValue(DialogResultProperty) &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; Boolean?;&lt;br/&gt;        }&lt;br/&gt;        &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; OnSetDialogResultCallback(DependencyObject dependencyObject,&lt;br/&gt;                                                      DependencyPropertyChangedEventArgs e)&lt;br/&gt;        {&lt;br/&gt;            var childWindow = dependencyObject &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; ChildWindow;&lt;br/&gt;            &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (childWindow != &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;) childWindow.DialogResult = e.NewValue &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;bool&lt;/span&gt;?;&lt;br/&gt;        }&lt;br/&gt;    }&lt;/pre&gt;&lt;font face="Verdana"&gt;   定义了一个&lt;/font&gt;DialogResultProperty，关于附加属性的概念我就不多说了，如果不清楚，去MSDN上找一下。  使用方法如下：&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 11px"&gt;&amp;lt;controls:ChildWindow&lt;br/&gt;    xmlns:AttachPropertyInMVVM="&lt;span style="color: #8b0000"&gt;clr-namespace:AttachPropertyInMVVM&lt;/span&gt;" &lt;br/&gt;    x:Class="&lt;span style="color: #8b0000"&gt;AttachPropertyInMVVM.Views.ChildView&lt;/span&gt;"&lt;br/&gt;           &lt;br/&gt;    AttachPropertyInMVVM:ChildwindowDialogResult.DialogResult="&lt;span style="color: #8b0000"&gt;{Binding DialogResult,Mode=OneWay}&lt;/span&gt;"/&amp;gt;&lt;/pre&gt;&lt;p&gt;&amp;nbsp; 将该属性绑定至ViewModel中定义的DialogResult属性就可以了，具体View与ViewModel如何交互，请参考下面的源码。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp; 代码下载：&lt;a href="http://files.cnblogs.com/626498301/BehavirWithAttachProperty.rar" target="_blank"&gt;&lt;font color="#0000ff"&gt;AttachPropertyInMVVM&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/626498301/aggbug/2476955.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/626498301/archive/2012/04/30/2476955.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/626498301/archive/2012/03/09/2387104.html</id><title type="text">Silverlight:如何打包Theme</title><summary type="text">Silverlight企业级开发中,项目中会出现大量的Style资源文件,如何将这些XAML文件打包成dll,以满足动态改变Theme的需求呢?通过参考Toolkit的源码中有关Theme.dll 的实现方式,本文将详细叙述这一过程: 1.创建一个Silverlight Class Library,命名为BlackColorTheme. 2.创建需要的ResourceDictionary 这里创建了ButtonStyle.xaml,HyperlinkButton.xaml2个文件,Build Action设置为Resource 以ButtonStyle为例,我们设置点简单的样...</summary><published>2012-03-09T02:19:00Z</published><updated>2012-03-09T02:19:00Z</updated><author><name>Ringgo.Yao</name><uri>http://www.cnblogs.com/626498301/</uri></author><link rel="alternate" href="http://www.cnblogs.com/626498301/archive/2012/03/09/2387104.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/626498301/archive/2012/03/09/2387104.html"/><content type="html">&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Silverlight企业级开发中,项目中会出现大量的Style资源文件,如何将这些XAML文件打包成dll,以满足动态改变Theme的需求呢?通过参考Toolkit的源码中有关Theme.dll&lt;/p&gt; &lt;p&gt;的实现方式,本文将详细叙述这一过程:&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1.创建一个Silverlight&amp;nbsp; Class Library,命名为BlackColorTheme.&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2.创建需要的ResourceDictionary &lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;a href="http://images.cnblogs.com/cnblogs_com/626498301/201203/20120309101845795.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/626498301/201203/201203091018471186.png" width="244" height="194"&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 这里创建了ButtonStyle.xaml,HyperlinkButton.xaml2个文件,Build Action设置为Resource&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 以ButtonStyle为例,我们设置点简单的样式:&lt;/p&gt; &lt;div id="codeSnippetWrapper"&gt; &lt;div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;ResourceDictionary&lt;/span&gt;&lt;!--CRLF--&gt;    &lt;span style="color: #ff0000"&gt;xmlns&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="http://schemas.microsoft.com/winfx/2006/xaml/presentation"&lt;/span&gt; &lt;!--CRLF--&gt;    &lt;span style="color: #ff0000"&gt;xmlns:x&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="http://schemas.microsoft.com/winfx/2006/xaml"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Style&lt;/span&gt; &lt;span style="color: #ff0000"&gt;TargetType&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="Button"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;x:Key&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="DefaultButtonStyle"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;        &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Setter&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Property&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="Background"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Value&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="Black"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;Setter&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;        &lt;!--CRLF--&gt;    &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;Style&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Style&lt;/span&gt; &lt;span style="color: #ff0000"&gt;TargetType&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="Button"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;BasedOn&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="{StaticResource DefaultButtonStyle}"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;ResourceDictionary&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 3.创建一个Theme.xaml,将我们的样式文件引入&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;a href="http://images.cnblogs.com/cnblogs_com/626498301/201203/201203091018479725.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/626498301/201203/201203091018487466.png" width="244" height="208"&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Build Action仍需要设置为Resource,Theme.xaml的内容如下:&lt;/p&gt;&lt;div id="codeSnippetWrapper"&gt;&lt;div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;ResourceDictionary&lt;/span&gt;&lt;!--CRLF--&gt;    &lt;span style="color: #ff0000"&gt;xmlns&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="http://schemas.microsoft.com/winfx/2006/xaml/presentation"&lt;/span&gt; &lt;!--CRLF--&gt;    &lt;span style="color: #ff0000"&gt;xmlns:x&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="http://schemas.microsoft.com/winfx/2006/xaml"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;ResourceDictionary.MergedDictionaries&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;        &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;ResourceDictionary&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Source&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="/BlackColorTheme;component/ButtonStyle.xaml"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;ResourceDictionary&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;        &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;ResourceDictionary&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Source&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="/BlackColorTheme;component/HyperlinkButton.xaml"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;ResourceDictionary&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;    &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;ResourceDictionary.MergedDictionaries&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;ResourceDictionary&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 4.创建一个BlackColorTheme.cs文件,继承System.Windows.Controls.Theming.Toolkit.Theme类&lt;/p&gt;&lt;div id="codeSnippetWrapper"&gt;&lt;div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; BlackColorTheme : Theme&lt;!--CRLF--&gt;{&lt;!--CRLF--&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; Uri ThemeResourceUri = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Uri(&lt;span style="color: #006080"&gt;"/BlackColorTheme;component/Theme.xaml"&lt;/span&gt;, UriKind.RelativeOrAbsolute);&lt;!--CRLF--&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; BlackColorTheme()&lt;!--CRLF--&gt;        : &lt;span style="color: #0000ff"&gt;base&lt;/span&gt;(ThemeResourceUri)&lt;!--CRLF--&gt;    {&lt;!--CRLF--&gt;&amp;nbsp;&lt;!--CRLF--&gt;    }&lt;!--CRLF--&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;bool&lt;/span&gt; GetIsApplicationTheme(Application app)&lt;!--CRLF--&gt;    {&lt;!--CRLF--&gt;        &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; GetApplicationThemeUri(app) == ThemeResourceUri;&lt;!--CRLF--&gt;    }&lt;!--CRLF--&gt;&amp;nbsp;&lt;!--CRLF--&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; SetIsApplicationTheme(Application app, &lt;span style="color: #0000ff"&gt;bool&lt;/span&gt; &lt;span style="color: #0000ff"&gt;value&lt;/span&gt;)&lt;!--CRLF--&gt;    {&lt;!--CRLF--&gt;        SetApplicationThemeUri(app, ThemeResourceUri);&lt;!--CRLF--&gt;    }&lt;!--CRLF--&gt;  }&lt;!--CRLF--&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 到这一步,我们已经创建完成了将松散的XAML文件打包成dll,具体如何使用创建好的主题,如果不熟悉这方面的操作,请参考我的这篇文章:&lt;a href="http://www.cnblogs.com/626498301/archive/2010/08/13/1799008.html" target="_blank"&gt;&lt;font color="#0000ff"&gt;Silverlight主题设置&lt;/font&gt;&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://www.cnblogs.com/626498301/aggbug/2387104.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/626498301/archive/2012/03/09/2387104.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/626498301/archive/2012/03/06/2381593.html</id><title type="text">Silverlight控件-Slider</title><summary type="text">本篇主要分享关于Slider应用上的一点问题, 相信你看完演示后,已经知道本文的意图了. 在实际开发中,我们需要Slider根据我们设置的SmallChange进行ValueChange.SDK的Slider即使设置了SmallChange属性, 但是在拖动Thumb时,仍会显示实际的Value.显然不能够满足我们的需求,这就需要我们手动去修改Slider. 我相信最初使用Slider的人会和我遇到一样的问题,希望本篇的做法能提供给各位一些思路. 我的做法重写OnValueChanged事件,直接贴出改造后的代码: public class RoundSlider : Sl...</summary><published>2012-03-06T03:36:00Z</published><updated>2012-03-06T03:36:00Z</updated><author><name>Ringgo.Yao</name><uri>http://www.cnblogs.com/626498301/</uri></author><link rel="alternate" href="http://www.cnblogs.com/626498301/archive/2012/03/06/2381593.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/626498301/archive/2012/03/06/2381593.html"/><content type="html">&lt;object data="data:application/x-oleobject;base64,QfXq3+HzJEysrJnDBxUISgAJAACuUgAAAz4AAAAAAAAAAAAAAAAAAAAAAABmAAAAaAB0AHQAcAA6AC8ALwBmAGkAbABlAHMALgBjAG4AYgBsAG8AZwBzAC4AYwBvAG0ALwB3AGUAYgBhAGIAYwBkAC8AUwBpAGwAdgBlAHIAbABpAGcAaAB0ADQAMAAuAHgAYQBwAAAAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//AAABAAAAAAAAAAAAAAAAAAAAGAAAADQALgAwAC4ANQAwADQAMAAxAC4AMAAAAAoAAAB0AHIAdQBlAAAAAAAAAAAAAAAAAAAA" width="800" height="600" type="application/x-silverlight-2"&gt;  &lt;param name="source" value="http://files.cnblogs.com/626498301/RoundSlider.xap" /&gt;  &lt;param name="minRuntimeVersion" value="4.0.50401.0" /&gt;  &lt;param name="autoUpgrade" value="true" /&gt;  &lt;param name="EnableHtmlAccess" value="true" /&gt;  &lt;a href="http://go.microsoft.com/fwlink/?LinkID=149156&amp;amp;v=4.0.50401.0" style="text-decoration: none"&gt; &lt;img src="http://go.microsoft.com/fwlink/?LinkId=161376" alt="Get Microsoft Silverlight" style="border-style: none" /&gt; &lt;/a&gt;&lt;/object&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp; 本篇主要分享关于Slider应用上的一点问题, 相信你看完演示后,已经知道本文的意图了.&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp; 在实际开发中,我们需要Slider根据我们设置的SmallChange进行ValueChange.SDK的Slider即使设置了SmallChange属性, &lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp; 但是在拖动Thumb时,仍会显示实际的Value.显然不能够满足我们的需求,这就需要我们手动去修改Slider.&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp; 我相信最初使用Slider的人会和我遇到一样的问题,希望本篇的做法能提供给各位一些思路.&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp; 我的做法重写OnValueChanged事件,直接贴出改造后的代码: &lt;/p&gt; &lt;div id="codeSnippetWrapper"&gt; &lt;div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&amp;nbsp; public class RoundSlider : Slider, INotifyPropertyChanged&lt;!--CRLF--&gt;&amp;nbsp;&amp;nbsp; {&lt;!--CRLF--&gt;    public event PropertyChangedEventHandler PropertyChanged&lt;span style="color: #008000"&gt;;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #008000"&gt;    public void NotifyPropertyChanged(string propertyName)&lt;/span&gt;&lt;!--CRLF--&gt;    {&lt;!--CRLF--&gt;        &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (PropertyChanged != null)&lt;!--CRLF--&gt;        {&lt;!--CRLF--&gt;            PropertyChanged(this, new PropertyChangedEventArgs(propertyName))&lt;span style="color: #008000"&gt;;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #008000"&gt;        }&lt;/span&gt;&lt;!--CRLF--&gt;    }   &lt;!--CRLF--&gt;    public double RoundValue&lt;!--CRLF--&gt;    {&lt;!--CRLF--&gt;        get { &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; (SmallChange == 0 ? Value : Math.Round(Value / SmallChange) * SmallChange)&lt;span style="color: #008000"&gt;; }&lt;/span&gt;&lt;!--CRLF--&gt;    }&lt;!--CRLF--&gt;    bool _busy=&lt;span style="color: #0000ff"&gt;false&lt;/span&gt;&lt;span style="color: #008000"&gt;;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #008000"&gt;    double _discreteValue;&lt;/span&gt;&lt;!--CRLF--&gt;   &lt;!--CRLF--&gt;    protected override void OnValueChanged(double oldValue, double newValue)&lt;!--CRLF--&gt;    {&lt;!--CRLF--&gt;        &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (!_busy)&lt;!--CRLF--&gt;        {&lt;!--CRLF--&gt;            _busy = &lt;span style="color: #0000ff"&gt;true&lt;/span&gt;&lt;span style="color: #008000"&gt;;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #008000"&gt;            if (SmallChange != 0)&lt;/span&gt;&lt;!--CRLF--&gt;            {&lt;!--CRLF--&gt;                double newDiscreteValue = Math.Round(newValue / SmallChange) * SmallChange&lt;span style="color: #008000"&gt;;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #008000"&gt;                if (newDiscreteValue != _discreteValue)&lt;/span&gt;&lt;!--CRLF--&gt;                {&lt;!--CRLF--&gt;                    Value = newDiscreteValue&lt;span style="color: #008000"&gt;;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #008000"&gt;                    base.OnValueChanged(_discreteValue, newDiscreteValue);&lt;/span&gt;&lt;!--CRLF--&gt;                    _discreteValue = newDiscreteValue&lt;span style="color: #008000"&gt;;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #008000"&gt;                }&lt;/span&gt;&lt;!--CRLF--&gt;            }&lt;!--CRLF--&gt;            &lt;span style="color: #0000ff"&gt;else&lt;/span&gt;&lt;!--CRLF--&gt;            {&lt;!--CRLF--&gt;                base.OnValueChanged(oldValue, newValue)&lt;span style="color: #008000"&gt;;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #008000"&gt;            }&lt;/span&gt;&lt;!--CRLF--&gt;            _busy = &lt;span style="color: #0000ff"&gt;false&lt;/span&gt;&lt;span style="color: #008000"&gt;;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #008000"&gt;        }&lt;/span&gt;&lt;!--CRLF--&gt;        NotifyPropertyChanged(&lt;span style="color: #006080"&gt;"RoundValue"&lt;/span&gt;)&lt;span style="color: #008000"&gt;;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #008000"&gt;    }&lt;/span&gt;&lt;!--CRLF--&gt;}&lt;!--CRLF--&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 通过RoundValue属性得到我们期望的结果,具体的逻辑也很简单,希望本篇能提供给需要的朋友小小的帮助.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/p&gt;&lt;img src="http://www.cnblogs.com/626498301/aggbug/2381593.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/626498301/archive/2012/03/06/2381593.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/626498301/archive/2012/02/02/2335439.html</id><title type="text">Silverlight中使用MVVM(7):DataGrid中触发Button的Click事件</title><summary type="text">Silverlight中使用MVVM(1)--基础 Silverlight中使用MVVM(2)—提高 Silverlight中使用MVVM(3)—进阶 Silverlight中使用MVVM(4)—演练 Silverlight中使用MVVM(5)-Command II Silverlight中使用MVVM(6):AutoComplteBox的异步过滤 毕业后忽然觉得什么地方都要用钱, 这半年除了工作上,业余时间做了些小活,因此没有什么时间静下心来分享一些东西了,生活压力山大啊. 这篇文章分享MVVM中常见的一个问题,相信在实际运用MVVM的朋友一定会遇到这种问题. &lt;...</summary><published>2012-02-02T02:45:00Z</published><updated>2012-02-02T02:45:00Z</updated><author><name>Ringgo.Yao</name><uri>http://www.cnblogs.com/626498301/</uri></author><link rel="alternate" href="http://www.cnblogs.com/626498301/archive/2012/02/02/2335439.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/626498301/archive/2012/02/02/2335439.html"/><content type="html">&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;a href="http://www.cnblogs.com/626498301/archive/2010/08/17/1801475.html"&gt;&lt;font color="#0000ff"&gt;Silverlight中使用MVVM(1)--基础&lt;/font&gt;&lt;/a&gt; &lt;p&gt;&lt;font color="#0000ff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;a href="http://www.cnblogs.com/626498301/archive/2010/08/18/1802204.html"&gt;&lt;font color="#0000ff"&gt;Silverlight中使用MVVM(2)—提高&lt;/font&gt;&lt;/a&gt; &lt;p&gt;&lt;font color="#0000ff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;a href="http://www.cnblogs.com/626498301/archive/2010/08/19/1802974.html"&gt;&lt;font color="#0000ff"&gt;Silverlight中使用MVVM(3)—进阶&lt;/font&gt;&lt;/a&gt; &lt;p&gt;&lt;font color="#0000ff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;a href="http://www.cnblogs.com/626498301/archive/2010/08/20/1804155.html"&gt;&lt;font color="#0000ff"&gt;Silverlight中使用MVVM(4)—演练&lt;/font&gt;&lt;/a&gt; &lt;p&gt;&lt;font color="#0000ff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;a href="http://www.cnblogs.com/626498301/archive/2011/03/07/1973274.html"&gt;&lt;font color="#0000ff"&gt;Silverlight中使用MVVM(5)-Command II&lt;/font&gt;&lt;/a&gt; &lt;p&gt;&lt;font color="#0000ff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;a href="http://www.cnblogs.com/626498301/archive/2011/03/30/1999549.html"&gt;&lt;font color="#0000ff"&gt;Silverlight中使用MVVM(6):AutoComplteBox的异步过滤&lt;/font&gt;&lt;/a&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 毕业后忽然觉得什么地方都要用钱, 这半年除了工作上,业余时间做了些小活,因此没有什么时间静下心来分享一些东西了,生活压力山大啊. &lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 这篇文章分享MVVM中常见的一个问题,相信在实际运用MVVM的朋友一定会遇到这种问题.&amp;nbsp; &lt;/p&gt; &lt;div id="codeSnippetWrapper"&gt; &lt;div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 99.73%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; height: 178px; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&lt;span style="color: #0000ff"&gt;   &amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;sdk:DataGridTemplateColumn&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Header&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="功能"&lt;/span&gt;  &lt;span style="color: #ff0000"&gt;Width&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="Auto"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;     &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;sdk:DataGridTemplateColumn.CellTemplate&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;         &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;DataTemplate&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;             &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;StackPanel&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Orientation&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="Horizontal"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;                 &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Button&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Content&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="删除"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Margin&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="10,0"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Command&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="{Binding ShowCommand}"&lt;/span&gt;  &lt;span style="color: #ff0000"&gt;Height&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="24"&lt;/span&gt; &lt;!--CRLF--&gt;                        &lt;span style="color: #ff0000"&gt;HorizontalAlignment&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="Left"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;VerticalAlignment&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="Center"&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;                 &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;Button&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;             &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;StackPanel&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;         &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;DataTemplate&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;     &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;sdk:DataGridTemplateColumn.CellTemplate&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&amp;nbsp; &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;sdk:DataGridTemplateColumn&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 在CellTemplate中的Button与ViewModel中的Command属性绑定时.你会发现Button无法触发这个事件&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 如何处理这种情况呢,我的做法是这样的:&lt;/p&gt;&lt;div id="codeSnippetWrapper"&gt;&lt;div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&lt;span style="color: #0000ff"&gt;   public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; DataContextProxy:TriggerAction&amp;lt;DependencyObject&amp;gt;&lt;!--CRLF--&gt;  {&lt;!--CRLF--&gt;      &lt;span style="color: #0000ff"&gt;protected&lt;/span&gt; &lt;span style="color: #0000ff"&gt;override&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; Invoke(&lt;span style="color: #0000ff"&gt;object&lt;/span&gt; parameter)&lt;!--CRLF--&gt;      {&lt;!--CRLF--&gt;          var parent = &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.AssociatedObject &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; DependencyObject;&lt;!--CRLF--&gt;          var fe = &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.AssociatedObject &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; FrameworkElement;&lt;!--CRLF--&gt;          &lt;span style="color: #0000ff"&gt;while&lt;/span&gt; (parent != &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;)&lt;!--CRLF--&gt;          {&lt;!--CRLF--&gt;              &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (parent.GetType() == &lt;span style="color: #0000ff"&gt;typeof&lt;/span&gt;(DataGrid))&lt;!--CRLF--&gt;              {&lt;!--CRLF--&gt;                  var context = parent &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; DataGrid;&lt;!--CRLF--&gt;                  fe.DataContext = context.DataContext;&lt;!--CRLF--&gt;                  &lt;span style="color: #0000ff"&gt;break&lt;/span&gt;;&lt;!--CRLF--&gt;              }&lt;!--CRLF--&gt;              parent = VisualTreeHelper.GetParent(parent) &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; DependencyObject;&lt;!--CRLF--&gt;          }&lt;!--CRLF--&gt;&amp;nbsp;&lt;!--CRLF--&gt;      }&lt;!--CRLF--&gt;&amp;nbsp; }&lt;!--CRLF--&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 继承一个TriggerAction,具体的原理就不叙述了,Button引用这个TriggerAction ,不要忘了System.Windows.Interactivity这个dll噢^^&lt;/p&gt;&lt;div id="codeSnippetWrapper"&gt;&lt;div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 99.92%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; height: 135px; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&lt;span style="color: #0000ff"&gt;      &amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Button&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Content&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="删除"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Margin&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="10,0"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Command&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="{Binding ShowCommand}"&lt;/span&gt;  &lt;span style="color: #ff0000"&gt;Height&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="24"&lt;/span&gt; &lt;!--CRLF--&gt;            &lt;span style="color: #ff0000"&gt;HorizontalAlignment&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="Left"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;VerticalAlignment&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="Center"&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;              &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;i:Interaction.Triggers&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;                  &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;i:EventTrigger&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;                      &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;local:DataContextProxy&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;                  &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;i:EventTrigger&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;              &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;i:Interaction.Triggers&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;      &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;Button&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 这样就可以了.另外一种方式可以参考:&lt;a href="http://stackoverflow.com/questions/4396203/how-to-fire-event-from-button-inside-datagrid-in-silverlight-and-mvvm" target="_blank"&gt;stackOverFlow&lt;/a&gt;.如何取舍就由各位自己分析比较吧.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 示例下载:&lt;a href="http://files.cnblogs.com/626498301/DataGridWithButton.rar" target="_blank"&gt;&lt;font color="#0000ff"&gt;DataGridWithButton.rar&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/626498301/aggbug/2335439.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/626498301/archive/2012/02/02/2335439.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/626498301/archive/2011/12/08/2280482.html</id><title type="text">Behavior:FocusOnEvent</title><summary type="text">最近一段时间,被各种事情困扰,博客一直没有更新,今天分享一个简单的技巧. 加载页面时,需要Focus某个TextBox,在CodeBehind下这很容易实现,如果采用MVVM模式时,这是与ViewModel无关的,但是可以用Behavior实现. 这里需要用到TargetedTriggerAction&lt;T&gt;,这个T需要是一个Control,因为这样才可以Focus: public class FocusOnEvent : TargetedTriggerAction&lt;Control&gt; { protected override void Invoke(object...</summary><published>2011-12-08T03:42:00Z</published><updated>2011-12-08T03:42:00Z</updated><author><name>Ringgo.Yao</name><uri>http://www.cnblogs.com/626498301/</uri></author><link rel="alternate" href="http://www.cnblogs.com/626498301/archive/2011/12/08/2280482.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/626498301/archive/2011/12/08/2280482.html"/><content type="html">&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 最近一段时间,被各种事情困扰,博客一直没有更新,今天分享一个简单的技巧.&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 加载页面时,需要Focus某个TextBox,在CodeBehind下这很容易实现,如果采用MVVM模式时,这是与ViewModel无关的,但是可以用Behavior实现.&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 这里需要用到TargetedTriggerAction&amp;lt;T&amp;gt;,这个T需要是一个Control,因为这样才可以Focus:&lt;/p&gt; &lt;div id="codeSnippetWrapper"&gt; &lt;div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&lt;span style="color: #0000ff"&gt;   public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; FocusOnEvent : TargetedTriggerAction&amp;lt;Control&amp;gt;  &lt;!--CRLF--&gt;   {&lt;!--CRLF--&gt;       &lt;span style="color: #0000ff"&gt;protected&lt;/span&gt; &lt;span style="color: #0000ff"&gt;override&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; Invoke(&lt;span style="color: #0000ff"&gt;object&lt;/span&gt; o)&lt;!--CRLF--&gt;       {&lt;!--CRLF--&gt;           HtmlPage.Plugin.Focus();&lt;!--CRLF--&gt;           Target.Focus();&lt;!--CRLF--&gt;       }&lt;!--CRLF--&gt;   }&lt;!--CRLF--&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 我们可以给它添加一个DefaultTrigger,在Loaded事件中进行触发&lt;/p&gt;&lt;div id="codeSnippetWrapper"&gt;&lt;div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 99.44%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; height: 16px; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;[DefaultTrigger(&lt;span style="color: #0000ff"&gt;typeof&lt;/span&gt;(FrameworkElement), &lt;span style="color: #0000ff"&gt;typeof&lt;/span&gt;(EventTrigger), &lt;span style="color: #006080"&gt;"Loaded"&lt;/span&gt;)] &lt;!--CRLF--&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; 现在Behavior定义好了,在UI上引用该Behavior&lt;/p&gt;&lt;div id="codeSnippetWrapper"&gt;&lt;div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;i:Interaction.Triggers&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;i:EventTrigger&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;        &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;local:FocusOnEvent&lt;/span&gt; &lt;span style="color: #ff0000"&gt;TargetName&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="textBox1"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;    &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;i:EventTrigger&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;i:Interaction.Triggers&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp; 这样当页面加载成功后,textBox1就会被设为默认焦点的Control.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp; 这篇就到这里,希望对你有所帮助.&lt;/p&gt;&lt;img src="http://www.cnblogs.com/626498301/aggbug/2280482.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/626498301/archive/2011/12/08/2280482.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/626498301/archive/2011/09/05/2167473.html</id><title type="text">OOB模式下Exit事件的处理</title><summary type="text">在Silverlight中,当用户退出程序时,我们一般需要在Exit事件中保存用户的相关资料,本文主要讲述在OOB模式下的解决方案. 按照一般的思路,在程序退出时,我们会在Exit事件中与服务器交互,如下代码: private void Application_Exit(object sender, EventArgs e) { TestClient proxy=new TestClient(); proxy.SaveWorkCompleted += (obj,arg) =&gt; { }; proxy.SaveWorkAsync(); } 但是,调试下来你会发现,根本没有...</summary><published>2011-09-05T06:19:00Z</published><updated>2011-09-05T06:19:00Z</updated><author><name>Ringgo.Yao</name><uri>http://www.cnblogs.com/626498301/</uri></author><link rel="alternate" href="http://www.cnblogs.com/626498301/archive/2011/09/05/2167473.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/626498301/archive/2011/09/05/2167473.html"/><content type="html">&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 在Silverlight中,当用户退出程序时,我们一般需要在Exit事件中保存用户的相关资料,本文主要讲述在OOB模式下的解决方案.&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 按照一般的思路,在程序退出时,我们会在Exit事件中与服务器交互,如下代码:&lt;/p&gt; &lt;div id="codeSnippetWrapper"&gt; &lt;div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 98.3%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; height: 102px; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&amp;nbsp; private void Application_Exit(object sender, EventArgs e)&lt;!--CRLF--&gt;&amp;nbsp; {&lt;!--CRLF--&gt;    TestClient proxy=new TestClient();&lt;!--CRLF--&gt;    proxy.SaveWorkCompleted += (obj,arg) =&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt; { };&lt;!--CRLF--&gt;    proxy.SaveWorkAsync();&lt;!--CRLF--&gt;&amp;nbsp; }&lt;!--CRLF--&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 但是,调试下来你会发现,根本没有执行proxy.SaveWorkCompleted,经过查找资料确认在Exit()中是不支持WCF的.见MSDN:&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp; &lt;a href="http://images.cnblogs.com/cnblogs_com/626498301/201109/20110905141914389.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/626498301/201109/201109051419185561.png" width="640" height="124"&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 经过一番搜索,在OOB模式下,我们可以用Closing方式进行处理:&lt;/p&gt;&lt;div id="codeSnippetWrapper"&gt;&lt;div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;public partial class MainPage : UserControl&lt;!--CRLF--&gt;{&lt;!--CRLF--&gt;    public MainPage()&lt;!--CRLF--&gt;    {&lt;!--CRLF--&gt;        InitializeComponent();&lt;!--CRLF--&gt;        if(App.Current.IsRunningOutOfBrowser)&lt;!--CRLF--&gt;        {&lt;!--CRLF--&gt;            App.Current.MainWindow.Closing += MainWindowClosing;&lt;!--CRLF--&gt;        }&lt;!--CRLF--&gt;    }&lt;!--CRLF--&gt;&amp;nbsp;&lt;!--CRLF--&gt;    private bool _isLoginOut=false;&lt;!--CRLF--&gt;     void MainWindowClosing(object sender, System.ComponentModel.ClosingEventArgs e)&lt;!--CRLF--&gt;    {&lt;!--CRLF--&gt;        if(!_isLoginOut)&lt;!--CRLF--&gt;        {&lt;!--CRLF--&gt;            e.Cancel = true;&lt;!--CRLF--&gt;            TestClient proxy = new TestClient();&lt;!--CRLF--&gt;            proxy.SaveWorkCompleted += (obj, arg) =&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;                                           {&lt;!--CRLF--&gt;                                               _isLoginOut = true;&lt;!--CRLF--&gt;                                               App.Current.MainWindow.Close();&lt;!--CRLF--&gt;                                           };&lt;!--CRLF--&gt;            proxy.SaveWorkAsync();&lt;!--CRLF--&gt;        }&lt;!--CRLF--&gt;    }&lt;!--CRLF--&gt;}&lt;!--CRLF--&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp; 当用户点击OOB窗口的关闭按钮时,会首先触发Closing事件,执行时首先会取消当前的Exit事件,即e.Cancel=true,当WCF执行完后,调用App.Current.MainWindow.Close()关闭程序&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp; 不过用这种方式,你需要提升OOB的权限,否则在执行App.Current.MainWindow.Close()时会报出安全异常&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp; &lt;a href="http://images.cnblogs.com/cnblogs_com/626498301/201109/201109051419199215.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/626498301/201109/201109051419219447.png" width="644" height="129"&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;&amp;nbsp; 提升OOB权限,意味着需要对xap进行签名,用户安装时将看到这个界面,@~@.没办法,上帝给你开了一扇门,也会关个门的.&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/626498301/201109/201109051419236646.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/626498301/201109/201109051419241238.png" width="244" height="79"&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt; 那么还有一种情况,是调用ChildWindow或者导航时,导致Closing不触发,具体的情景我就不叙述了.关键的代码是将ManinWindow保存&lt;/p&gt;&lt;div id="codeSnippetWrapper"&gt;&lt;div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;public static object _mainFrame;&lt;!--CRLF--&gt;public MainPage()&lt;!--CRLF--&gt;{&lt;!--CRLF--&gt;    InitializeComponent();&lt;!--CRLF--&gt;    &lt;!--CRLF--&gt;    if(App.Current.IsRunningOutOfBrowser)&lt;!--CRLF--&gt;    {&lt;!--CRLF--&gt;        _mainFrame = App.Current.MainWindow;&lt;!--CRLF--&gt;        App.Current.MainWindow.Closing += MainWindowClosing;&lt;!--CRLF--&gt;    }&lt;!--CRLF--&gt;}&lt;!--CRLF--&gt;&lt;/div&gt;&lt;/div&gt;&amp;nbsp; 尽管Silverlight5 RC已经出来,作为从SL1.0开始跟进的开发者,依然觉得SL还有许多地方可以再完善一点,限制再少一点.&lt;img src="http://www.cnblogs.com/626498301/aggbug/2167473.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/626498301/archive/2011/09/05/2167473.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/626498301/archive/2011/08/31/2160331.html</id><title type="text">Silverlight-开源VerticalMenu控件</title><summary type="text">最近需要用Silverlight实现一个类似Web的悬浮菜单,在网上没有找到需要的资源,本来准备自己实现一个,恰巧看到中国人寿的Silverlight平台上的菜单与自已的想法大致吻合,于是决定参考其做法. 因为中国人寿的Silverlight项目采用了动态加载的方式,在html页面无法直接找到xap地址,要先用Spy找到它的xap包, 通过视觉树的方式,找到VerticalMenu,这样就可以快速定位到该控件所使用的dll了 反编译出dll后,分析一下代码,发现和自己预想采用TranslateTransform的思路是一致的, 具体做法通过MouseEnter/MouseLeave...</summary><published>2011-08-31T01:47:00Z</published><updated>2011-08-31T01:47:00Z</updated><author><name>Ringgo.Yao</name><uri>http://www.cnblogs.com/626498301/</uri></author><link rel="alternate" href="http://www.cnblogs.com/626498301/archive/2011/08/31/2160331.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/626498301/archive/2011/08/31/2160331.html"/><content type="html">&lt;div width="100" height="50"&gt;&lt;object data="data:application/x-oleobject;base64,QfXq3+HzJEysrJnDBxUISgAJAACuUgAAAz4AAAAAAAAAAAAAAAAAAAAAAABmAAAAaAB0AHQAcAA6AC8ALwBmAGkAbABlAHMALgBjAG4AYgBsAG8AZwBzAC4AYwBvAG0ALwB3AGUAYgBhAGIAYwBkAC8AUwBpAGwAdgBlAHIAbABpAGcAaAB0ADQAMAAuAHgAYQBwAAAAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//AAABAAAAAAAAAAAAAAAAAAAAGAAAADQALgAwAC4ANQAwADQAMAAxAC4AMAAAAAoAAAB0AHIAdQBlAAAAAAAAAAAAAAAAAAAA" width="800" height="600" type="application/x-silverlight-2"&gt; &lt;param name="source" value="http://files.cnblogs.com/626498301/CustomeVerticalMenu.xap" /&gt; &lt;param name="minRuntimeVersion" value="4.0.50401.0" /&gt; &lt;param name="autoUpgrade" value="true" /&gt; &lt;param name="EnableHtmlAccess" value="true" /&gt; &lt;a href="http://go.microsoft.com/fwlink/?LinkID=149156&amp;amp;v=4.0.50401.0" style="text-decoration: none"&gt; &lt;img src="http://go.microsoft.com/fwlink/?LinkId=161376" alt="Get Microsoft Silverlight" style="border-style: none" /&gt; &lt;/a&gt;&lt;/object&gt; &lt;p&gt;&lt;/p&gt;&lt;/div&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 最近需要用Silverlight实现一个类似Web的悬浮菜单,在网上没有找到需要的资源,本来准备自己实现一个,恰巧看到中国人寿的Silverlight平台上的菜单与自已的想法大致吻合,于是决定参考其做法.&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 因为中国人寿的Silverlight项目采用了动态加载的方式,在html页面无法直接找到xap地址,要先用Spy找到它的xap包, 通过视觉树的方式,找到VerticalMenu,这样就可以快速定位到该控件所使用的dll了&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;a href="http://images.cnblogs.com/cnblogs_com/626498301/201108/201108310947198426.png"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/626498301/201108/201108310947211133.png" width="644" height="312"&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 反编译出dll后,分析一下代码,发现和自己预想采用TranslateTransform的思路是一致的, 具体做法通过MouseEnter/MouseLeave事件控制容器StankPanel的相对坐标.&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;a href="http://images.cnblogs.com/cnblogs_com/626498301/201108/201108310947222411.png"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/626498301/201108/201108310947243132.png" width="640" height="352"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 但是由于它在控件逻辑中将样式写死,无法直接使用, 所以自己将反编译的代码改动了下,可以进行样式设置.具体的代码就不贴了,熟悉Silverlight自定义控件做法的人很快就能看明白.将其发布出来,供需要的朋友参考下,或许会有帮助.不过示例没有采用MVVM的方式去做,同时希望感兴趣的朋友时间充裕的前提下,能对其进一步扩展,使其支持其它三个方向的悬浮.&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 代码下载:&lt;a href="http://files.cnblogs.com/626498301/CustomeVerticalMenu.rar" target="_blank"&gt;&lt;font color="#0000ff"&gt;CustomeVerticalMenu.rar&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/626498301/aggbug/2160331.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/626498301/archive/2011/08/31/2160331.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/626498301/archive/2011/08/08/2130896.html</id><title type="text">简单的CircularLoader制作</title><summary type="text">年初曾写过一篇如何用Blend制作简单的加载动画,微软提供Blend这个套件,确实大大方便了程序员处理一些的简单的美工设计问题,这篇文章将简要的描述 如何使用Blend制作一个Circular Loader的简要步骤,没有太深奥的编程知识,只要对Blend有所熟悉,就能按照下面的流程简单的进行处理. 首先看看我们制作的效果图: 这张效果图是不是做Silverlight的朋友很熟悉呢?接下来详细讲解制作流程 1.创建一个UserControl,命名为userControl,为了能自适应浏览器,将根元素Grid替换为ViewBox. 2.添加一个椭圆到舞台中,将其转换为PathListBox 3.</summary><published>2011-08-08T06:01:00Z</published><updated>2011-08-08T06:01:00Z</updated><author><name>Ringgo.Yao</name><uri>http://www.cnblogs.com/626498301/</uri></author><link rel="alternate" href="http://www.cnblogs.com/626498301/archive/2011/08/08/2130896.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/626498301/archive/2011/08/08/2130896.html"/><content type="html">&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 年初曾写过一篇如何用&lt;a href="http://www.cnblogs.com/626498301/archive/2011/03/11/1980598.html" target="_blank"&gt;&lt;font color="#0000ff"&gt;Blend制作简单的加载动画&lt;/font&gt;&lt;/a&gt;,微软提供Blend这个套件,确实大大方便了程序员处理一些的简单的美工设计问题,这篇文章将简要的描述&lt;/p&gt; &lt;p&gt;如何使用Blend制作一个Circular Loader的简要步骤,没有太深奥的编程知识,只要对Blend有所熟悉,就能按照下面的流程简单的进行处理.&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 首先看看我们制作的效果图:&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;a href="http://images.cnblogs.com/cnblogs_com/626498301/201108/201108081358159156.png"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/626498301/201108/20110808135817910.png" width="240" height="206"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 这张效果图是不是做Silverlight的朋友很熟悉呢?接下来详细讲解制作流程&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1.创建一个UserControl,命名为userControl,为了能自适应浏览器,将根元素Grid替换为ViewBox.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;a href="http://images.cnblogs.com/cnblogs_com/626498301/201108/201108081358192074.png"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/626498301/201108/201108081358319358.png" width="541" height="480"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2.添加一个椭圆到舞台中,将其转换为PathListBox&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;a href="http://images.cnblogs.com/cnblogs_com/626498301/201108/201108081359414993.png"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/626498301/201108/201108081359497789.png" width="640" height="328"&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 3.在PathListBox中添加8个Ellipse,XAML代码如下所示:&lt;/p&gt; &lt;div id="codeSnippetWrapper"&gt; &lt;div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 99.67%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; height: 17px; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&lt;span style="color: #0000ff"&gt;    &amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Ellipse&lt;/span&gt; &lt;span style="color: #ff0000"&gt;x:Name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="ellipse1"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Fill&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="{Binding Foreground, ElementName=userControl}"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Opacity&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="0.3"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Height&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="20"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Width&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="20"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 4.设置PathListBox的属性,这里如果对PathListBox不熟悉,建议先看下相关资料.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;a href="http://images.cnblogs.com/cnblogs_com/626498301/201108/201108081359505738.png"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/626498301/201108/201108081400019532.png" width="640" height="261"&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 5.添加一个StoryBoard,命名为LoadAnimation,这里作为简单的介绍,只对PathListBox中的8个Ellipse的Visible属性进行修改,并将LoadAnimation的RepeatBehavior改为Forever &lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;a href="http://images.cnblogs.com/cnblogs_com/626498301/201108/201108081400118476.png"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/626498301/201108/201108081400138278.png" width="314" height="480"&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp; &lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 6.动画完成后,添加一个ControlStoryboardAction至UserControl中.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;a href="http://images.cnblogs.com/cnblogs_com/626498301/201108/201108081400153586.png"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/626498301/201108/201108081400171403.png" width="640" height="303"&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 这样就可以运行后就可以看到效果了.不过当你点击PathListBox时,会发现它的视觉状态不是那么美好.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp; &lt;a href="http://images.cnblogs.com/cnblogs_com/626498301/201108/201108081400232794.png"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/626498301/201108/201108081400235760.png" width="240" height="200"&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 7进入其模板 &lt;a href="http://images.cnblogs.com/cnblogs_com/626498301/201108/201108081400265462.png"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/626498301/201108/201108081400274774.png" width="640" height="180"&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp; 8.对Selected状态进行设置即可.&lt;/p&gt;&lt;div id="codeSnippetWrapper"&gt;&lt;div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 99.14%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; height: 21px; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&lt;span style="color: #008000"&gt;&amp;lt;!--&amp;lt;DoubleAnimation Duration="0" To="0" Storyboard.TargetProperty="Opacity" Storyboard.TargetName="fillColor2"/&amp;gt;—&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp; 这样,这个Circular Loader就制作好了,使用很简单,放在MainPage中看看效果:&lt;/p&gt;&lt;div id="codeSnippetWrapper"&gt;&lt;div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 99.66%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; height: 22px; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;my:PathListBox&lt;/span&gt; &lt;span style="color: #ff0000"&gt;HorizontalAlignment&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="Center"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;VerticalAlignment&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="Center"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;x:Name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="pathListBox1"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Foreground&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="BlueViolet"&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 因为不是讲Blend的基础运用,所以文中很多地方的细节都是一笔带过,文章开头已经说明,需要对Blend有一定基础熟悉程度,虽然仅仅是一个Circular Loader,也用到了Silverlight中Grid,ViewBox的布局,基础的动画&lt;/p&gt;&lt;p&gt;概念等,示例的动画效果不是那么流畅,可以根据自己的要求修改调整,那么在源码中,还有一个通过Canvas进行布局的,做法则更简单,给有兴趣的朋友参考下.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &lt;/p&gt;&lt;p&gt;&amp;nbsp; 下载地址:&lt;a href="http://files.cnblogs.com/626498301/CircularLoader.rar" target="_blank"&gt;&lt;font color="#0000ff"&gt;CircularLoader.rar&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/626498301/aggbug/2130896.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/626498301/archive/2011/08/08/2130896.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/626498301/archive/2011/08/01/2123487.html</id><title type="text">DataTrigger在DataGrid中的简单应用</title><summary type="text">大约一个月没写新的博文,最近一阵子确实很忙,刚过去的7月,或许是人生中又一个转折点,让我对未来 在时间的积累中增加了几分期待。这篇文章主要简单介绍下DataTrigger这个概念，熟悉WPF的人应该对这个 再熟悉不过了，在Silverlight中应用DataTrigger确实不多用，今天这篇文章简单的介绍一下在DataGrid中 使用DataTrigger。 当我们使用DataGrid绑定到数据源时，一般需要进行数据的呈现方式进行额外的修改，比如在下图中， 我们将类型User绑定到DataGrid中,如果我们需要对其中的IsManger呈现方式以更加友好化的呈现方式去做, 比如当False时.</summary><published>2011-08-01T02:23:00Z</published><updated>2011-08-01T02:23:00Z</updated><author><name>Ringgo.Yao</name><uri>http://www.cnblogs.com/626498301/</uri></author><link rel="alternate" href="http://www.cnblogs.com/626498301/archive/2011/08/01/2123487.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/626498301/archive/2011/08/01/2123487.html"/><content type="html">&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 大约一个月没写新的博文,最近一阵子确实很忙,刚过去的7月,或许是人生中又一个转折点,让我对未来&lt;/p&gt; &lt;p&gt;在时间的积累中增加了几分期待。这篇文章主要简单介绍下DataTrigger这个概念，熟悉WPF的人应该对这个&lt;/p&gt; &lt;p&gt;再熟悉不过了，在Silverlight中应用DataTrigger确实不多用，今天这篇文章简单的介绍一下在DataGrid中&lt;/p&gt; &lt;p&gt;使用DataTrigger。&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 当我们使用DataGrid绑定到数据源时，一般需要进行数据的呈现方式进行额外的修改，比如在下图中，&lt;/p&gt; &lt;p&gt;我们将类型User绑定到DataGrid中,如果我们需要对其中的IsManger呈现方式以更加友好化的呈现方式去做,&lt;/p&gt; &lt;p&gt;比如当False时,显示为General,为True时,显示Advanced,一般的做法是用Converter去进行值转换,但是这种方式的缺&lt;/p&gt; &lt;p&gt;点在于,一次只能对一个值进行转换,比如说当我需要General时,字体显示为红色,随着这种需求的增加,不得不为每个转换写&lt;/p&gt; &lt;p&gt;一个Converter,而且类似此类的Converter重用性都不是很好,不是一种好的做法.&lt;/p&gt; &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/626498301/201108/201108011022527006.png"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/626498301/201108/201108011022577416.png" width="240" height="98"&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 那么在这种情况下,我们可以使用DataTrigger进行处理,数据触发器可以由任意的.NET类型触发,而不仅仅由依赖属性触发&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;a href="http://images.cnblogs.com/cnblogs_com/626498301/201108/20110801102258348.png"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/626498301/201108/201108011022599660.png" width="240" height="91"&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 那么借助DataTrigger和Blend里的ChangePropertyAction,我们就可以省去写Converter的过程,一旦熟练,你会越来越倾&lt;/p&gt; &lt;p&gt;向用这样的方式做数据呈现&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 关键的XAML代码:&lt;/p&gt; &lt;div id="codeSnippetWrapper"&gt; &lt;div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;sdk:DataGridTemplateColumn&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Width&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="*"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Header&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="Leval"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;sdk:DataGridTemplateColumn.CellTemplate&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;DataTemplate&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;        &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;StackPanel&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;        &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;TextBlock&lt;/span&gt; &lt;span style="color: #ff0000"&gt;x:Name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="txtLeval"&lt;/span&gt; &lt;!--CRLF--&gt;            &lt;span style="color: #ff0000"&gt;Text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="No Leval Information"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;HorizontalAlignment&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="Center"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;VerticalAlignment&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="Center"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;        &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;i:Interaction.Triggers&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;            &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;ei:DataTrigger&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Binding&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="{Binding IsManager}"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Value&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="True"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;                &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;ei:ChangePropertyAction&lt;/span&gt; &lt;span style="color: #ff0000"&gt;TargetObject&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="{Binding ElementName=txtLeval}"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;TargetName&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="Text"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;PropertyName&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="Text"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Value&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="Advanced"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;                    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;ei:ChangePropertyAction&lt;/span&gt; &lt;span style="color: #ff0000"&gt;TargetObject&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="{Binding ElementName=txtLeval}"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;TargetName&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="Foreground"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;PropertyName&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="Foreground"&lt;/span&gt;  &lt;span style="color: #ff0000"&gt;Value&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="Red"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;            &lt;!--CRLF--&gt;            &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;ei:DataTrigger&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;            &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;ei:DataTrigger&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Binding&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="{Binding IsManager}"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Value&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="False"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;                &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;ei:ChangePropertyAction&lt;/span&gt; &lt;span style="color: #ff0000"&gt;TargetObject&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="{Binding ElementName=txtLeval}"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;TargetName&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="Text"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;PropertyName&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="Text"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Value&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="General"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;            &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;ei:DataTrigger&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;        &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;i:Interaction.Triggers&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;        &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;StackPanel&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;    &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;DataTemplate&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;sdk:DataGridTemplateColumn.CellTemplate&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;    &lt;!--CRLF--&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;sdk:DataGridTemplateColumn&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 那么关于DataTrigger,再延伸一点内容,上面的XAML表示当IsManager为true/false时的属性更改,相当于逻辑"或",比如,使用下面的XAML代码:&lt;/p&gt;&lt;div id="codeSnippetWrapper"&gt;&lt;div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;ei:DataTrigger&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Binding&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="{Binding IsManager}"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Value&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="True"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;ei:ChangePropertyAction&lt;/span&gt; &lt;span style="color: #ff0000"&gt;TargetObject&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="{Binding ElementName=txtLeval}"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;TargetName&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="Text"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;PropertyName&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="Text"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Value&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="Advanced"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;        &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;ei:ChangePropertyAction&lt;/span&gt; &lt;span style="color: #ff0000"&gt;TargetObject&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="{Binding ElementName=txtLeval}"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;TargetName&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="Foreground"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;PropertyName&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="Foreground"&lt;/span&gt;  &lt;span style="color: #ff0000"&gt;Value&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="Red"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;    &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;ei:DataTrigger&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;   &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;ei:DataTrigger&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Binding&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="{Binding IsManager}"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Value&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="True"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;      &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;ei:ChangePropertyAction&lt;/span&gt; &lt;span style="color: #ff0000"&gt;TargetObject&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="{Binding ElementName=txtLeval}"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;TargetName&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="Foreground"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;PropertyName&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="Foreground"&lt;/span&gt;  &lt;span style="color: #ff0000"&gt;Value&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="Blue"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;   &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;ei:DataTrigger&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp; 当有多个触发器有相互冲突的Setter时,将由最后一个获胜,在上面的情况中,Advanced最终显示为蓝色,而不是红色.&lt;/p&gt;&lt;p&gt;&amp;nbsp; 这篇文章主要介绍了DataTrigger的一般性概念,具体操作Blend配合使用ChangePropertyAction就不详细的说明了,希望这篇文章能够提供给做Sl的朋友一些思路.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp; 代码下载:&lt;a href="http://files.cnblogs.com/626498301/DataTriggersInDataGrid.rar" target="_blank"&gt;&lt;font color="#0000ff"&gt;DataTriggersInDataGrid.rar&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/626498301/aggbug/2123487.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/626498301/archive/2011/08/01/2123487.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry></feed>
