<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_陈希章@中国</title><subtitle type="text">:: 心有多宽，路就有多宽 :: | ::http://tech.xizhang.com ::  Microsoft .NET开发人员职业规划和学习路线图:: </subtitle><id>http://feed.cnblogs.com/blog/u/12626/rss</id><updated>2012-05-21T08:42:57Z</updated><author><name>陈希章</name><uri>http://www.cnblogs.com/chenxizhang/</uri></author><generator>feed.cnblogs.com</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/chenxizhang/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/12626/rss"/><entry><id>http://www.cnblogs.com/chenxizhang/archive/2012/05/05/2484637.html</id><title type="text">如何在ViewModel中正确地使用Timer（定时器）</title><summary type="text">内容摘要： 这是我在某个客户那边讲课的时候遇到一个小问题，在ViewModel中创建的一个Timer，并不会被自动停止，即便使用该ViewModel的View已经被关闭了。这个问题的原因在于Timer...</summary><published>2012-05-05T03:43:00Z</published><updated>2012-05-05T03:43:00Z</updated><author><name>陈希章</name><uri>http://www.cnblogs.com/chenxizhang/</uri></author><link rel="alternate" href="http://www.cnblogs.com/chenxizhang/archive/2012/05/05/2484637.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/chenxizhang/archive/2012/05/05/2484637.html"/><content type="html">&lt;p&gt;&lt;strong&gt;内容摘要：&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;这是我在某个客户那边讲课的时候遇到一个小问题，在ViewModel中创建的一个Timer，并不会被自动停止，即便使用该ViewModel的View已经被关闭了。这个问题的原因在于Timer的特殊工作机制，它是运行在一个独立的工作线程的，除非明确地停止他，或者整个程序关闭了，它才会停止。这一讲中，我通过实例重现了这个问题，然后提供了一个可行的解决方法。&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;视频地址：&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.tudou.com/programs/view/uO4b2j0N4L8/"&gt;http://www.tudou.com/programs/view/uO4b2j0N4L8/&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;embed src="http://www.tudou.com/v/uO4b2j0N4L8/&amp;amp;rpid=101037296&amp;amp;resourceId=101037296_05_05_99/v.swf" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" wmode="opaque" width="480" height="400"&gt;&lt;/embed&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;示例代码：&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;备注：该范例使用了MvvmLight作为MVVM框架，请自行安装&lt;/p&gt; &lt;p&gt;&lt;font color="#ff0000"&gt;Model：&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System;&lt;br/&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Diagnostics;&lt;br/&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Linq;&lt;br/&gt;&lt;br/&gt;&lt;span class="kwrd"&gt;namespace&lt;/span&gt; SilverlightApplicationSample&lt;br/&gt;{&lt;br/&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; DataService&lt;br/&gt;    {&lt;br/&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; Customer[] GetCustomers()&lt;br/&gt;        {&lt;br/&gt;&lt;br/&gt;            Debug.WriteLine(&lt;span class="kwrd"&gt;string&lt;/span&gt;.Format(&lt;span class="str"&gt;"[{0}]正在调用数据服务"&lt;/span&gt;,DateTime.Now));&lt;br/&gt;&lt;br/&gt;            var rnd = &lt;span class="kwrd"&gt;new&lt;/span&gt; Random();&lt;br/&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt; Enumerable.Range(1, rnd.Next(100)).Select(x =&amp;gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; Customer()&lt;br/&gt;            {&lt;br/&gt;                CompanyName = &lt;span class="str"&gt;"Company "&lt;/span&gt; + x.ToString()&lt;br/&gt;            }).ToArray();&lt;br/&gt;&lt;br/&gt;        }&lt;br/&gt;    }&lt;br/&gt;&lt;br/&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; Customer&lt;br/&gt;    {&lt;br/&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; CompanyName { get; set; }&lt;br/&gt;    }&lt;br/&gt;}&lt;br/&gt;&amp;nbsp;&lt;font color="#ff0000"&gt;ViewModel：&lt;/font&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System;&lt;br/&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Windows.Threading;&lt;br/&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; GalaSoft.MvvmLight;&lt;br/&gt;&lt;br/&gt;&lt;span class="kwrd"&gt;namespace&lt;/span&gt; SilverlightApplicationSample&lt;br/&gt;{&lt;br/&gt;    &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br/&gt;    &lt;span class="rem"&gt;/// 使用MVVMLight实现的MVVM ViewModel&lt;/span&gt;&lt;br/&gt;    &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br/&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; CustomerWindowViewModel : ViewModelBase&lt;br/&gt;    {&lt;br/&gt;        &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br/&gt;        &lt;span class="rem"&gt;/// 这个方法也不会自动调用&lt;/span&gt;&lt;br/&gt;        &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br/&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Cleanup()&lt;br/&gt;        {&lt;br/&gt;            &lt;span class="kwrd"&gt;base&lt;/span&gt;.Cleanup();&lt;br/&gt;&lt;br/&gt;            timer.Stop();&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt; &lt;br/&gt;&lt;br/&gt;        DispatcherTimer timer = &lt;span class="kwrd"&gt;null&lt;/span&gt;;&lt;br/&gt;&lt;br/&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; CustomerWindowViewModel()&lt;br/&gt;        {&lt;br/&gt;            &lt;span class="rem"&gt;//正常情况下的绑定&lt;/span&gt;&lt;br/&gt;            &lt;span class="rem"&gt;//Customers = DataService.GetCustomers();&lt;/span&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;            &lt;span class="rem"&gt;//使用定时器调用服务&lt;/span&gt;&lt;br/&gt;            timer = &lt;span class="kwrd"&gt;new&lt;/span&gt; DispatcherTimer();&lt;br/&gt;&lt;br/&gt;            timer.Interval = TimeSpan.FromSeconds(1);&lt;br/&gt;            timer.Tick += (o, a) =&amp;gt;&lt;br/&gt;            {&lt;br/&gt;                Customers = DataService.GetCustomers();&lt;br/&gt;            };&lt;br/&gt;&lt;br/&gt;            timer.Start();&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        &lt;span class="kwrd"&gt;private&lt;/span&gt; Customer[] _Customers;&lt;br/&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; Customer[] Customers&lt;br/&gt;        {&lt;br/&gt;            get { &lt;span class="kwrd"&gt;return&lt;/span&gt; _Customers; }&lt;br/&gt;            set&lt;br/&gt;            {&lt;br/&gt;                &lt;span class="kwrd"&gt;if&lt;/span&gt; (_Customers != &lt;span class="kwrd"&gt;value&lt;/span&gt;)&lt;br/&gt;                {&lt;br/&gt;                    _Customers = &lt;span class="kwrd"&gt;value&lt;/span&gt;;&lt;br/&gt;                    RaisePropertyChanged(&lt;span class="str"&gt;"Customers"&lt;/span&gt;);&lt;br/&gt;                }&lt;br/&gt;            }&lt;br/&gt;        }&lt;br/&gt;    }&lt;br/&gt;}&lt;br/&gt;&lt;p&gt;&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre{font-size: small;color: black;font-family: consolas, "Courier New", courier, monospace;background-color: #ffffff;/*white-space: pre;*/}.csharpcode pre { margin: 0em; }.csharpcode .rem { color: #008000; }.csharpcode .kwrd { color: #0000ff; }.csharpcode .str { color: #006080; }.csharpcode .op { color: #0000c0; }.csharpcode .preproc { color: #cc6633; }.csharpcode .asp { background-color: #ffff00; }.csharpcode .html { color: #800000; }.csharpcode .attr { color: #ff0000; }.csharpcode .alt {background-color: #f4f4f4;width: 100%;margin: 0em;}.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;font color="#ff0000"&gt;View：&lt;/font&gt;&lt;/p&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;controls:ChildWindow&lt;/span&gt; &lt;span class="attr"&gt;x:Class&lt;/span&gt;&lt;span class="kwrd"&gt;="SilverlightApplicationSample.CustomerWindow"&lt;/span&gt;&lt;br/&gt;                      &lt;span class="attr"&gt;xmlns&lt;/span&gt;&lt;span class="kwrd"&gt;="http://schemas.microsoft.com/winfx/2006/xaml/presentation"&lt;/span&gt;&lt;br/&gt;                      &lt;span class="attr"&gt;xmlns:x&lt;/span&gt;&lt;span class="kwrd"&gt;="http://schemas.microsoft.com/winfx/2006/xaml"&lt;/span&gt;&lt;br/&gt;                      &lt;span class="attr"&gt;xmlns:controls&lt;/span&gt;&lt;span class="kwrd"&gt;="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls"&lt;/span&gt;&lt;br/&gt;                      &lt;span class="attr"&gt;Width&lt;/span&gt;&lt;span class="kwrd"&gt;="400"&lt;/span&gt;&lt;br/&gt;                      &lt;span class="attr"&gt;Height&lt;/span&gt;&lt;span class="kwrd"&gt;="300"&lt;/span&gt;&lt;br/&gt;                      &lt;span class="attr"&gt;Title&lt;/span&gt;&lt;span class="kwrd"&gt;="CustomerWindow"&lt;/span&gt;&lt;br/&gt;                      &lt;span class="attr"&gt;xmlns:local&lt;/span&gt;&lt;span class="kwrd"&gt;="clr-namespace:SilverlightApplicationSample"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br/&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;controls:ChildWindow.DataContext&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br/&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;local:CustomerWindowViewModel&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;local:CustomerWindowViewModel&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br/&gt;    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;controls:ChildWindow.DataContext&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br/&gt;    &lt;br/&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Grid&lt;/span&gt; &lt;span class="attr"&gt;x:Name&lt;/span&gt;&lt;span class="kwrd"&gt;="LayoutRoot"&lt;/span&gt;&lt;br/&gt;          &lt;span class="attr"&gt;Margin&lt;/span&gt;&lt;span class="kwrd"&gt;="2"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br/&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Grid.RowDefinitions&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br/&gt;            &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;RowDefinition&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;br/&gt;            &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;RowDefinition&lt;/span&gt; &lt;span class="attr"&gt;Height&lt;/span&gt;&lt;span class="kwrd"&gt;="Auto"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;br/&gt;        &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Grid.RowDefinitions&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;ListBox&lt;/span&gt; &lt;span class="attr"&gt;ItemsSource&lt;/span&gt;&lt;span class="kwrd"&gt;="{Binding Customers}"&lt;/span&gt;&lt;br/&gt;                 &lt;span class="attr"&gt;DisplayMemberPath&lt;/span&gt;&lt;span class="kwrd"&gt;="CompanyName"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br/&gt;        &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;ListBox&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br/&gt;&lt;br/&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Button&lt;/span&gt; &lt;span class="attr"&gt;x:Name&lt;/span&gt;&lt;span class="kwrd"&gt;="CancelButton"&lt;/span&gt;&lt;br/&gt;                &lt;span class="attr"&gt;Content&lt;/span&gt;&lt;span class="kwrd"&gt;="Cancel"&lt;/span&gt;&lt;br/&gt;                &lt;span class="attr"&gt;Click&lt;/span&gt;&lt;span class="kwrd"&gt;="CancelButton_Click"&lt;/span&gt;&lt;br/&gt;                &lt;span class="attr"&gt;Width&lt;/span&gt;&lt;span class="kwrd"&gt;="75"&lt;/span&gt;&lt;br/&gt;                &lt;span class="attr"&gt;Height&lt;/span&gt;&lt;span class="kwrd"&gt;="23"&lt;/span&gt;&lt;br/&gt;                &lt;span class="attr"&gt;HorizontalAlignment&lt;/span&gt;&lt;span class="kwrd"&gt;="Right"&lt;/span&gt;&lt;br/&gt;                &lt;span class="attr"&gt;Margin&lt;/span&gt;&lt;span class="kwrd"&gt;="0,12,0,0"&lt;/span&gt;&lt;br/&gt;                &lt;span class="attr"&gt;Grid&lt;/span&gt;.&lt;span class="attr"&gt;Row&lt;/span&gt;&lt;span class="kwrd"&gt;="1"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;br/&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Button&lt;/span&gt; &lt;span class="attr"&gt;x:Name&lt;/span&gt;&lt;span class="kwrd"&gt;="OKButton"&lt;/span&gt;&lt;br/&gt;                &lt;span class="attr"&gt;Content&lt;/span&gt;&lt;span class="kwrd"&gt;="OK"&lt;/span&gt;&lt;br/&gt;                &lt;span class="attr"&gt;Click&lt;/span&gt;&lt;span class="kwrd"&gt;="OKButton_Click"&lt;/span&gt;&lt;br/&gt;                &lt;span class="attr"&gt;Width&lt;/span&gt;&lt;span class="kwrd"&gt;="75"&lt;/span&gt;&lt;br/&gt;                &lt;span class="attr"&gt;Height&lt;/span&gt;&lt;span class="kwrd"&gt;="23"&lt;/span&gt;&lt;br/&gt;                &lt;span class="attr"&gt;HorizontalAlignment&lt;/span&gt;&lt;span class="kwrd"&gt;="Right"&lt;/span&gt;&lt;br/&gt;                &lt;span class="attr"&gt;Margin&lt;/span&gt;&lt;span class="kwrd"&gt;="0,12,79,0"&lt;/span&gt;&lt;br/&gt;                &lt;span class="attr"&gt;Grid&lt;/span&gt;.&lt;span class="attr"&gt;Row&lt;/span&gt;&lt;span class="kwrd"&gt;="1"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;br/&gt;    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Grid&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br/&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;controls:ChildWindow&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre{font-size: small;color: black;font-family: consolas, "Courier New", courier, monospace;background-color: #ffffff;/*white-space: pre;*/}.csharpcode pre { margin: 0em; }.csharpcode .rem { color: #008000; }.csharpcode .kwrd { color: #0000ff; }.csharpcode .str { color: #006080; }.csharpcode .op { color: #0000c0; }.csharpcode .preproc { color: #cc6633; }.csharpcode .asp { background-color: #ffff00; }.csharpcode .html { color: #800000; }.csharpcode .attr { color: #ff0000; }.csharpcode .alt {background-color: #f4f4f4;width: 100%;margin: 0em;}.csharpcode .lnum { color: #606060; }&lt;/style&gt;&amp;nbsp;&amp;nbsp;Page：&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Windows;&lt;br/&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Windows.Controls;&lt;br/&gt;&lt;br/&gt;&lt;span class="kwrd"&gt;namespace&lt;/span&gt; SilverlightApplicationSample&lt;br/&gt;{&lt;br/&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;partial&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; MainPage : UserControl&lt;br/&gt;    {&lt;br/&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; MainPage()&lt;br/&gt;        {&lt;br/&gt;            InitializeComponent();&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        &lt;br/&gt;&lt;br/&gt;        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Button_Click(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, RoutedEventArgs e)&lt;br/&gt;        {&lt;br/&gt;            var window = &lt;span class="kwrd"&gt;new&lt;/span&gt; CustomerWindow();&lt;br/&gt;            window.Closed += (o, a) =&amp;gt;&lt;br/&gt;            {&lt;br/&gt;                var vm = window.DataContext &lt;span class="kwrd"&gt;as&lt;/span&gt; CustomerWindowViewModel;&lt;br/&gt;                vm.Cleanup();&lt;br/&gt;            };&lt;br/&gt;&lt;br/&gt;            window.Show();&lt;br/&gt;        }&lt;br/&gt;    }&lt;br/&gt;}&lt;br/&gt;&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre{font-size: small;color: black;font-family: consolas, "Courier New", courier, monospace;background-color: #ffffff;/*white-space: pre;*/}.csharpcode pre { margin: 0em; }.csharpcode .rem { color: #008000; }.csharpcode .kwrd { color: #0000ff; }.csharpcode .str { color: #006080; }.csharpcode .op { color: #0000c0; }.csharpcode .preproc { color: #cc6633; }.csharpcode .asp { background-color: #ffff00; }.csharpcode .html { color: #800000; }.csharpcode .attr { color: #ff0000; }.csharpcode .alt {background-color: #f4f4f4;width: 100%;margin: 0em;}.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre{font-size: small;color: black;font-family: consolas, "Courier New", courier, monospace;background-color: #ffffff;/*white-space: pre;*/}.csharpcode pre { margin: 0em; }.csharpcode .rem { color: #008000; }.csharpcode .kwrd { color: #0000ff; }.csharpcode .str { color: #006080; }.csharpcode .op { color: #0000c0; }.csharpcode .preproc { color: #cc6633; }.csharpcode .asp { background-color: #ffff00; }.csharpcode .html { color: #800000; }.csharpcode .attr { color: #ff0000; }.csharpcode .alt {background-color: #f4f4f4;width: 100%;margin: 0em;}.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;img src="http://www.cnblogs.com/chenxizhang/aggbug/2484637.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/chenxizhang/archive/2012/05/05/2484637.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/chenxizhang/archive/2012/04/23/2466967.html</id><title type="text">可复用的WPF或者Silverlight应用程序和组件设计(5)&amp;mdash;&amp;mdash;行为级别</title><summary type="text">内容摘要 上一讲中，我们探讨了在控件通过定义样式和模板，提供外观级别的复用性。外观级别指的是控件的一种显示效果，但行为是更加关注在用户交互这个层面。行为（Behavior）是在某个特定条件下触发(Tr...</summary><published>2012-04-23T11:24:00Z</published><updated>2012-04-23T11:24:00Z</updated><author><name>陈希章</name><uri>http://www.cnblogs.com/chenxizhang/</uri></author><link rel="alternate" href="http://www.cnblogs.com/chenxizhang/archive/2012/04/23/2466967.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/chenxizhang/archive/2012/04/23/2466967.html"/><content type="html">&lt;p&gt;&lt;strong&gt;内容摘要&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;上一讲中，我们探讨了在控件通过定义样式和模板，提供外观级别的复用性。外观级别指的是控件的一种显示效果，但行为是更加关注在用户交互这个层面。行为（Behavior）是在某个特定条件下触发(Trigger)的一个或者多个操作（Action)。行为大量使用在Expression Blend设计界面的过程中，他提供了无代码实现交互性的可能性，而且把很多常用的操作，封装起来，提供了更好的复用性。&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;视频地址&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.tudou.com/programs/view/FHLhaAlZwlA/"&gt;http://www.tudou.com/programs/view/FHLhaAlZwlA/&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;embed src="http://www.tudou.com/v/FHLhaAlZwlA/&amp;amp;rpid=101037296&amp;amp;resourceId=101037296_05_05_99/v.swf" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" wmode="opaque" width="480" height="400"&gt;&lt;/embed&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/chenxizhang/aggbug/2466967.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/chenxizhang/archive/2012/04/23/2466967.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/chenxizhang/archive/2012/04/23/2466963.html</id><title type="text">可复用的WPF或者Silverlight应用程序和组件设计(4)&amp;mdash;&amp;mdash;外观级别</title><summary type="text">内容摘要 前面我花了三讲的时间，探讨了WPF和Silverlight可复用应用程序设计的三个层面，分别是应用程序级别，组件级别，控件级别。这一讲我们将一起来深入到控件内部，如果同一组控件，我们希望给他...</summary><published>2012-04-23T11:18:00Z</published><updated>2012-04-23T11:18:00Z</updated><author><name>陈希章</name><uri>http://www.cnblogs.com/chenxizhang/</uri></author><link rel="alternate" href="http://www.cnblogs.com/chenxizhang/archive/2012/04/23/2466963.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/chenxizhang/archive/2012/04/23/2466963.html"/><content type="html">&lt;p&gt;&lt;strong&gt;内容摘要&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;前面我花了三讲的时间，探讨了WPF和Silverlight可复用应用程序设计的三个层面，分别是应用程序级别，组件级别，控件级别。这一讲我们将一起来深入到控件内部，如果同一组控件，我们希望给他们提供不同的界面外观，以实现更加广泛的复用。&lt;/p&gt; &lt;p&gt;在这一讲中，我们将重点探讨样式（Style)和模板(Template)，并且会结合资源(Resource)来讲课。&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;视频地址&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.tudou.com/programs/view/2MwjKwTijeE/"&gt;http://www.tudou.com/programs/view/2MwjKwTijeE/&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;embed src="http://www.tudou.com/v/2MwjKwTijeE/&amp;amp;rpid=101037296&amp;amp;resourceId=101037296_05_05_99/v.swf" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" wmode="opaque" width="480" height="400"&gt;&lt;/embed&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/chenxizhang/aggbug/2466963.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/chenxizhang/archive/2012/04/23/2466963.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/chenxizhang/archive/2012/04/23/2466957.html</id><title type="text">可复用的WPF或者Silverlight应用程序和组件设计(3)&amp;mdash;&amp;mdash;控件级别</title><summary type="text">内容摘要 这一讲，我将探讨控件级别的复用性设计。我会讲解WPF和Silverlight中内置的控件，以及他们的一些内部组成部分和继承关系。 WPF和Silverlight作为一种主要作为界面开发的开发...</summary><published>2012-04-23T11:13:00Z</published><updated>2012-04-23T11:13:00Z</updated><author><name>陈希章</name><uri>http://www.cnblogs.com/chenxizhang/</uri></author><link rel="alternate" href="http://www.cnblogs.com/chenxizhang/archive/2012/04/23/2466957.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/chenxizhang/archive/2012/04/23/2466957.html"/><content type="html">&lt;p&gt;&lt;strong&gt;内容摘要&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;这一讲，我将探讨控件级别的复用性设计。我会讲解WPF和Silverlight中内置的控件，以及他们的一些内部组成部分和继承关系。&lt;/p&gt; &lt;p&gt;WPF和Silverlight作为一种主要作为界面开发的开发框架，我们在使用他们做开发的时候，会用到各种各样的控件，或者出于某些原因，我们还会编写自定义控件或者用户控件。控件从一开始就是为了复用而设计的，这一讲我将带领大家更好地理解这一点。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;视频地址&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.tudou.com/programs/view/IXywBFf6eyU/"&gt;http://www.tudou.com/programs/view/IXywBFf6eyU/&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;embed src="http://www.tudou.com/v/IXywBFf6eyU/&amp;amp;rpid=101037296&amp;amp;resourceId=101037296_05_05_99/v.swf" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" wmode="opaque" width="480" height="400"&gt;&lt;/embed&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/chenxizhang/aggbug/2466957.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/chenxizhang/archive/2012/04/23/2466957.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/chenxizhang/archive/2012/04/18/2455560.html</id><title type="text">可复用的WPF或者Silverlight应用程序和组件设计(2)——组件级别</title><summary type="text">内容摘要 这一讲，我继续展开讲解可复用的WPF或者Silverlight应用程序和组件设计，我将侧重在组件可复用设计这个层面。 这一讲的内容将包括下面几点 如何实现组件级别的复用性 动态加载反射技术...</summary><published>2012-04-18T08:50:00Z</published><updated>2012-04-18T08:50:00Z</updated><author><name>陈希章</name><uri>http://www.cnblogs.com/chenxizhang/</uri></author><link rel="alternate" href="http://www.cnblogs.com/chenxizhang/archive/2012/04/18/2455560.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/chenxizhang/archive/2012/04/18/2455560.html"/><content type="html">&lt;p&gt;&lt;strong&gt;内容摘要&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;这一讲，我继续展开讲解可复用的WPF或者Silverlight应用程序和组件设计，我将侧重在组件可复用设计这个层面。&lt;/p&gt; &lt;p&gt;这一讲的内容将包括下面几点&lt;/p&gt; &lt;p&gt;&lt;font color="#ff0000"&gt;如何实现组件级别的复用性&lt;/font&gt;&lt;/p&gt; &lt;ol&gt; &lt;li&gt;动态加载&lt;br /&gt;反射技术(Reflection)&lt;br /&gt;&lt;a href="http://www.cnblogs.com/chenxizhang/archive/2009/12/17/1626717.html"&gt;http://www.cnblogs.com/chenxizhang/archive/2009/12/17/1626717.html&lt;/a&gt;&lt;/li&gt; &lt;li&gt;Prism框架&lt;br /&gt;&lt;a href="http://compositewpf.codeplex.com/"&gt;http://compositewpf.codeplex.com/&lt;/a&gt;&lt;br /&gt;MEF(Managed Extensibility Framework)&lt;br /&gt;Unity&lt;/li&gt; &lt;li&gt;Windows Forms&lt;br /&gt;&lt;a href="http://www.cnblogs.com/chenxizhang/archive/2011/08/15/2139317.html"&gt;http://www.cnblogs.com/chenxizhang/archive/2011/08/15/2139317.html&lt;/a&gt; &lt;/li&gt;&lt;/ol&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;视频地址&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.tudou.com/my/tui/details/?id=1334737230829994"&gt;http://www.tudou.com/my/tui/details/?id=1334737230829994&lt;/a&gt;&lt;br /&gt;&lt;embed src="http://www.tudou.com/v/kkTX7SsHI94/&amp;amp;rpid=101037296&amp;amp;resourceId=101037296_05_05_99/v.swf" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" wmode="opaque" width="480" height="400"&gt;&lt;/embed&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/chenxizhang/aggbug/2455560.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/chenxizhang/archive/2012/04/18/2455560.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/chenxizhang/archive/2012/04/18/2455393.html</id><title type="text">可复用的WPF或者Silverlight应用程序和组件设计(1)&amp;mdash;&amp;mdash;应用程序级别</title><summary type="text">内容摘要 这一讲我讲解了什么是“可复用的设计”，以及具体的五个层面。 应用程序级别的复用性 组件级别的复用性 控件复用性 外观的复用性 行为的复用性 然后，我详细展开介绍了在应用程序级别，如何实现W...</summary><published>2012-04-18T07:38:00Z</published><updated>2012-04-18T07:38:00Z</updated><author><name>陈希章</name><uri>http://www.cnblogs.com/chenxizhang/</uri></author><link rel="alternate" href="http://www.cnblogs.com/chenxizhang/archive/2012/04/18/2455393.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/chenxizhang/archive/2012/04/18/2455393.html"/><content type="html">&lt;p&gt;&lt;strong&gt;内容摘要&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;这一讲我讲解了什么是“可复用的设计”，以及具体的五个层面。&lt;/p&gt; &lt;ol&gt; &lt;li&gt;应用程序级别的复用性&lt;/li&gt; &lt;li&gt;组件级别的复用性&lt;/li&gt; &lt;li&gt;控件复用性&lt;/li&gt; &lt;li&gt;外观的复用性&lt;/li&gt; &lt;li&gt;行为的复用性&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;然后，我详细展开介绍了在应用程序级别，如何实现WPF和Silverlight的可复用设计。WPF很类似于Windows Forms应用程序，可以通过在Main方法中添加参数的方式来实现可复用的设计，而Silverlight则比较特殊，因为它是嵌入在网页中，所以可以在网页里面提供参数的方式来实现可复用的设计&lt;/p&gt; &lt;p&gt;&lt;strong&gt;视频地址&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.tudou.com/programs/view/_IUdX7onK-U/"&gt;http://www.tudou.com/programs/view/_IUdX7onK-U/&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;embed src="http://www.tudou.com/v/_IUdX7onK-U/&amp;amp;rpid=101037296&amp;amp;resourceId=101037296_05_05_99/v.swf" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" wmode="opaque" width="480" height="400"&gt;&lt;/embed&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/chenxizhang/aggbug/2455393.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/chenxizhang/archive/2012/04/18/2455393.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/chenxizhang/archive/2012/04/14/2446926.html</id><title type="text">使用Project Linker实现多个项目中代码文件的链接</title><summary type="text">内容摘要 如果用过WPF和Silverlight开发的朋友一定会有这个体会，我们很多时候都希望他们之间能共享代码，因为毕竟很类似的。但因为运行时的不一样，默认情况下Silverlight是不能复用WP...</summary><published>2012-04-14T03:49:00Z</published><updated>2012-04-14T03:49:00Z</updated><author><name>陈希章</name><uri>http://www.cnblogs.com/chenxizhang/</uri></author><link rel="alternate" href="http://www.cnblogs.com/chenxizhang/archive/2012/04/14/2446926.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/chenxizhang/archive/2012/04/14/2446926.html"/><content type="html">&lt;p&gt;&lt;strong&gt;内容摘要&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;如果用过WPF和Silverlight开发的朋友一定会有这个体会，我们很多时候都希望他们之间能共享代码，因为毕竟很类似的。但因为运行时的不一样，默认情况下Silverlight是不能复用WPF的程序集的。以前的做法是我们可以通过手工添加链接的方式来实现，我这里有一篇博客说明这个做法（&lt;a href="http://www.cnblogs.com/chenxizhang/archive/2010/10/09/1846781.html"&gt;http://www.cnblogs.com/chenxizhang/archive/2010/10/09/1846781.html&lt;/a&gt;） ，这一讲我讲解了使用一个Project Linker工具来自动实现项目之间的链接。&lt;br&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;工具下载地址&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;a title="http://visualstudiogallery.msdn.microsoft.com/5e730577-d11c-4f2e-8e2b-cbb87f76c044/" href="http://visualstudiogallery.msdn.microsoft.com/5e730577-d11c-4f2e-8e2b-cbb87f76c044/"&gt;http://visualstudiogallery.msdn.microsoft.com/5e730577-d11c-4f2e-8e2b-cbb87f76c044/&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;视频地址&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.tudou.com/programs/view/19aZQ1fp_jQ/"&gt;http://www.tudou.com/programs/view/19aZQ1fp_jQ/&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;embed src="http://www.tudou.com/v/19aZQ1fp_jQ/&amp;amp;rpid=101037296&amp;amp;resourceId=101037296_05_05_99/v.swf" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" wmode="opaque" width="480" height="400"&gt;&lt;/embed&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/chenxizhang/aggbug/2446926.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/chenxizhang/archive/2012/04/14/2446926.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/chenxizhang/archive/2012/04/14/2446782.html</id><title type="text">理解Prism中MVVM的Command与CommandParameter</title><summary type="text">内容摘要 接上一讲（http://www.cnblogs.com/chenxizhang/archive/2012/04/13/2446415.html），这一讲中我使用Prism做了演示和比较。Pr...</summary><published>2012-04-14T01:45:00Z</published><updated>2012-04-14T01:45:00Z</updated><author><name>陈希章</name><uri>http://www.cnblogs.com/chenxizhang/</uri></author><link rel="alternate" href="http://www.cnblogs.com/chenxizhang/archive/2012/04/14/2446782.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/chenxizhang/archive/2012/04/14/2446782.html"/><content type="html">&lt;p&gt;&lt;strong&gt;内容摘要&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;接上一讲（&lt;a href="http://www.cnblogs.com/chenxizhang/archive/2012/04/13/2446415.html"&gt;http://www.cnblogs.com/chenxizhang/archive/2012/04/13/2446415.html&lt;/a&gt;），这一讲中我使用Prism做了演示和比较。Prism不仅仅是一个MVVM框架，它还包含其他的模块。在MVVM这个层面，Prism有些特殊性（Command绑定有特殊语法），这也是我这一讲的主要内容。&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Prism的下载链接&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;a title="http://compositewpf.codeplex.com/" href="http://compositewpf.codeplex.com/"&gt;http://compositewpf.codeplex.com/&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;视频地址&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.tudou.com/programs/view/72Ag1kQt1RA/"&gt;http://www.tudou.com/programs/view/72Ag1kQt1RA/&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;embed src="http://www.tudou.com/v/72Ag1kQt1RA/&amp;amp;rpid=101037296&amp;amp;resourceId=101037296_05_05_99/v.swf" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" wmode="opaque" width="480" height="400"&gt;&lt;/embed&gt;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;示例代码&lt;/strong&gt;&lt;/p&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Window&lt;/span&gt; &lt;span class="attr"&gt;x:Class&lt;/span&gt;&lt;span class="kwrd"&gt;="WPFPrismMvvm.MainWindow"&lt;/span&gt;&lt;br/&gt;        &lt;span class="attr"&gt;xmlns&lt;/span&gt;&lt;span class="kwrd"&gt;="http://schemas.microsoft.com/winfx/2006/xaml/presentation"&lt;/span&gt;&lt;br/&gt;        &lt;span class="attr"&gt;xmlns:x&lt;/span&gt;&lt;span class="kwrd"&gt;="http://schemas.microsoft.com/winfx/2006/xaml"&lt;/span&gt;&lt;br/&gt;        &lt;span class="attr"&gt;Title&lt;/span&gt;&lt;span class="kwrd"&gt;="MainWindow"&lt;/span&gt;&lt;br/&gt;        &lt;span class="attr"&gt;Height&lt;/span&gt;&lt;span class="kwrd"&gt;="350"&lt;/span&gt;&lt;br/&gt;        &lt;span class="attr"&gt;xmlns:local&lt;/span&gt;&lt;span class="kwrd"&gt;="clr-namespace:WPFPrismMvvm"&lt;/span&gt;&lt;br/&gt;        &lt;span class="attr"&gt;xmlns:cmd&lt;/span&gt;&lt;span class="kwrd"&gt;="clr-namespace:Microsoft.Practices.Prism.Commands;assembly=Microsoft.Practices.Prism"&lt;/span&gt;&lt;br/&gt;        &lt;span class="attr"&gt;Width&lt;/span&gt;&lt;span class="kwrd"&gt;="525"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br/&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Window.DataContext&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br/&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;local:MainWindowViewModel&lt;/span&gt; &lt;span class="attr"&gt;UserName&lt;/span&gt;&lt;span class="kwrd"&gt;="chenxizhang"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;local:MainWindowViewModel&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br/&gt;    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Window.DataContext&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br/&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Grid&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br/&gt;&lt;br/&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;StackPanel&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br/&gt;&lt;br/&gt;            &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;TextBox&lt;/span&gt; &lt;span class="attr"&gt;Text&lt;/span&gt;&lt;span class="kwrd"&gt;="{Binding UserName,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;TextBox&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br/&gt;&lt;br/&gt;            &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Button&lt;/span&gt; &lt;span class="attr"&gt;Content&lt;/span&gt;&lt;span class="kwrd"&gt;="Show"&lt;/span&gt;&lt;br/&gt;                    &lt;span class="attr"&gt;cmd:Click&lt;/span&gt;.&lt;span class="attr"&gt;Command&lt;/span&gt;&lt;span class="kwrd"&gt;="{Binding ShowCommand}"&lt;/span&gt;&lt;br/&gt;                    &lt;span class="attr"&gt;cmd:Click&lt;/span&gt;.&lt;span class="attr"&gt;CommandParameter&lt;/span&gt;&lt;span class="kwrd"&gt;="{Binding UserName}"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Button&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br/&gt;        &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;StackPanel&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br/&gt;    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Grid&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br/&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Window&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br/&gt;&lt;p&gt;&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre{font-size: small;color: black;font-family: consolas, "Courier New", courier, monospace;background-color: #ffffff;/*white-space: pre;*/}.csharpcode pre { margin: 0em; }.csharpcode .rem { color: #008000; }.csharpcode .kwrd { color: #0000ff; }.csharpcode .str { color: #006080; }.csharpcode .op { color: #0000c0; }.csharpcode .preproc { color: #cc6633; }.csharpcode .asp { background-color: #ffff00; }.csharpcode .html { color: #800000; }.csharpcode .attr { color: #ff0000; }.csharpcode .alt {background-color: #f4f4f4;width: 100%;margin: 0em;}.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;/p&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System;&lt;br/&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Collections.Generic;&lt;br/&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Linq;&lt;br/&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Text;&lt;br/&gt;&lt;br/&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; Microsoft.Practices.Prism.ViewModel;&lt;br/&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; Microsoft.Practices.Prism.Commands;&lt;br/&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Windows.Input;&lt;br/&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Windows;&lt;br/&gt;&lt;br/&gt;&lt;span class="kwrd"&gt;namespace&lt;/span&gt; WPFPrismMvvm&lt;br/&gt;{&lt;br/&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; MainWindowViewModel:NotificationObject&lt;br/&gt;    {&lt;br/&gt;&lt;br/&gt;        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; _UserName;&lt;br/&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; UserName&lt;br/&gt;        {&lt;br/&gt;            get { &lt;span class="kwrd"&gt;return&lt;/span&gt; _UserName; }&lt;br/&gt;            set&lt;br/&gt;            {&lt;br/&gt;                &lt;span class="kwrd"&gt;if&lt;/span&gt; (_UserName != &lt;span class="kwrd"&gt;value&lt;/span&gt;)&lt;br/&gt;                {&lt;br/&gt;                    _UserName = &lt;span class="kwrd"&gt;value&lt;/span&gt;;&lt;br/&gt;                    RaisePropertyChanged(&lt;span class="str"&gt;"UserName"&lt;/span&gt;);&lt;br/&gt;                }&lt;br/&gt;            }&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; ICommand ShowCommand&lt;br/&gt;        {&lt;br/&gt;            get&lt;br/&gt;            {&lt;br/&gt;                &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; DelegateCommand&amp;lt;&lt;span class="kwrd"&gt;string&lt;/span&gt;&amp;gt;(&lt;br/&gt;                    (user) =&amp;gt;&lt;br/&gt;                    {&lt;br/&gt;                        MessageBox.Show(user);&lt;br/&gt;                    }, (user) =&amp;gt; {&lt;br/&gt;                        &lt;span class="kwrd"&gt;return&lt;/span&gt; !&lt;span class="kwrd"&gt;string&lt;/span&gt;.IsNullOrEmpty(user);&lt;br/&gt;                    });&lt;br/&gt;&lt;br/&gt;            }&lt;br/&gt;        }&lt;br/&gt;    }&lt;br/&gt;}&lt;br/&gt;&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre{font-size: small;color: black;font-family: consolas, "Courier New", courier, monospace;background-color: #ffffff;/*white-space: pre;*/}.csharpcode pre { margin: 0em; }.csharpcode .rem { color: #008000; }.csharpcode .kwrd { color: #0000ff; }.csharpcode .str { color: #006080; }.csharpcode .op { color: #0000c0; }.csharpcode .preproc { color: #cc6633; }.csharpcode .asp { background-color: #ffff00; }.csharpcode .html { color: #800000; }.csharpcode .attr { color: #ff0000; }.csharpcode .alt {background-color: #f4f4f4;width: 100%;margin: 0em;}.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;img src="http://www.cnblogs.com/chenxizhang/aggbug/2446782.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/chenxizhang/archive/2012/04/14/2446782.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/chenxizhang/archive/2012/04/13/2446415.html</id><title type="text">MVVM实践中的Command与CommandParameter的使用</title><summary type="text">内容摘要 这一讲，我在原先一篇博客文章（http://www.cnblogs.com/chenxizhang/archive/2011/10/01/2197786.html）基础上，针对MVVM中Co...</summary><published>2012-04-13T14:09:00Z</published><updated>2012-04-13T14:09:00Z</updated><author><name>陈希章</name><uri>http://www.cnblogs.com/chenxizhang/</uri></author><link rel="alternate" href="http://www.cnblogs.com/chenxizhang/archive/2012/04/13/2446415.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/chenxizhang/archive/2012/04/13/2446415.html"/><content type="html">&lt;p&gt;&lt;strong&gt;内容摘要&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;这一讲，我在原先一篇博客文章（&lt;a href="http://www.cnblogs.com/chenxizhang/archive/2011/10/01/2197786.html"&gt;http://www.cnblogs.com/chenxizhang/archive/2011/10/01/2197786.html&lt;/a&gt;）基础上，针对MVVM中Command的使用做了演示和讲解。灵活的数据绑定，和命令绑定，是MVVM的核心精神，善加这两个功能，将大大地简化我们的应用程序开发，提供更加合理的代码架构。可以这么说，如果你在做WPF,Silverlight或者相关的开发，你是必须要了解MVVM的。但是至于你使用具体哪一个框架，倒不是那么重要的，他们基本都很类似。&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;视频地址&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.tudou.com/programs/view/SZXSes10MD0/"&gt;http://www.tudou.com/programs/view/SZXSes10MD0/&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;embed src="http://www.tudou.com/v/SZXSes10MD0/&amp;amp;rpid=101037296&amp;amp;resourceId=101037296_05_05_99/v.swf" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" wmode="opaque" width="480" height="400"&gt;&lt;/embed&gt;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;示例代码&lt;/strong&gt;&lt;/p&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Windows;&lt;br/&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Windows.Input;&lt;br/&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; GalaSoft.MvvmLight;&lt;br/&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; GalaSoft.MvvmLight.Command;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;span class="kwrd"&gt;namespace&lt;/span&gt; WpfMVVM&lt;br/&gt;{&lt;br/&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; MainWindowViewModel:ViewModelBase&lt;br/&gt;    {&lt;br/&gt;&lt;br/&gt;        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; _UserName;&lt;br/&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; UserName&lt;br/&gt;        {&lt;br/&gt;            get { &lt;span class="kwrd"&gt;return&lt;/span&gt; _UserName; }&lt;br/&gt;            set&lt;br/&gt;            {&lt;br/&gt;                &lt;span class="kwrd"&gt;if&lt;/span&gt; (_UserName != &lt;span class="kwrd"&gt;value&lt;/span&gt;)&lt;br/&gt;                {&lt;br/&gt;                    _UserName = &lt;span class="kwrd"&gt;value&lt;/span&gt;;&lt;br/&gt;                    RaisePropertyChanged(&lt;span class="str"&gt;"UserName"&lt;/span&gt;);&lt;br/&gt;                }&lt;br/&gt;            }&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; ICommand ShowCommand&lt;br/&gt;        {&lt;br/&gt;            get&lt;br/&gt;            {&lt;br/&gt;                &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; RelayCommand&amp;lt;&lt;span class="kwrd"&gt;string&lt;/span&gt;&amp;gt;(&lt;br/&gt;                    (user) =&amp;gt;&lt;br/&gt;                    {&lt;br/&gt;                        MessageBox.Show(user);&lt;br/&gt;                    }, (user) =&amp;gt; {&lt;br/&gt;                        &lt;span class="kwrd"&gt;return&lt;/span&gt; !&lt;span class="kwrd"&gt;string&lt;/span&gt;.IsNullOrEmpty(user);&lt;br/&gt;                    });&lt;br/&gt;&lt;br/&gt;            }&lt;br/&gt;        }&lt;br/&gt;    }&lt;br/&gt;}&lt;br/&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Window&lt;/span&gt; &lt;span class="attr"&gt;x:Class&lt;/span&gt;&lt;span class="kwrd"&gt;="WpfMVVM.MainWindow"&lt;/span&gt;&lt;br/&gt;        &lt;span class="attr"&gt;xmlns&lt;/span&gt;&lt;span class="kwrd"&gt;="http://schemas.microsoft.com/winfx/2006/xaml/presentation"&lt;/span&gt;&lt;br/&gt;        &lt;span class="attr"&gt;xmlns:x&lt;/span&gt;&lt;span class="kwrd"&gt;="http://schemas.microsoft.com/winfx/2006/xaml"&lt;/span&gt;&lt;br/&gt;        &lt;span class="attr"&gt;Title&lt;/span&gt;&lt;span class="kwrd"&gt;="MainWindow"&lt;/span&gt;&lt;br/&gt;        &lt;span class="attr"&gt;xmlns:local&lt;/span&gt;&lt;span class="kwrd"&gt;="clr-namespace:WpfMVVM"&lt;/span&gt;&lt;br/&gt;        &lt;span class="attr"&gt;Height&lt;/span&gt;&lt;span class="kwrd"&gt;="350"&lt;/span&gt;&lt;br/&gt;        &lt;span class="attr"&gt;Width&lt;/span&gt;&lt;span class="kwrd"&gt;="525"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br/&gt;&lt;br/&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Window.DataContext&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br/&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;local:MainWindowViewModel&lt;/span&gt; &lt;span class="attr"&gt;UserName&lt;/span&gt;&lt;span class="kwrd"&gt;="chenxizhang"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;local:MainWindowViewModel&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br/&gt;    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Window.DataContext&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br/&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Grid&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br/&gt;&lt;br/&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;StackPanel&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br/&gt;&lt;br/&gt;            &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;TextBox&lt;/span&gt; &lt;span class="attr"&gt;Text&lt;/span&gt;&lt;span class="kwrd"&gt;="{Binding UserName,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;TextBox&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br/&gt;&lt;br/&gt;            &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Button&lt;/span&gt; &lt;span class="attr"&gt;Content&lt;/span&gt;&lt;span class="kwrd"&gt;="Show"&lt;/span&gt;&lt;br/&gt;                    &lt;span class="attr"&gt;Command&lt;/span&gt;&lt;span class="kwrd"&gt;="{Binding ShowCommand}"&lt;/span&gt;&lt;br/&gt;                    &lt;span class="attr"&gt;CommandParameter&lt;/span&gt;&lt;span class="kwrd"&gt;="{Binding UserName}"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Button&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br/&gt;        &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;StackPanel&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br/&gt;&lt;br/&gt;    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Grid&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br/&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Window&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br/&gt;&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre{font-size: small;color: black;font-family: consolas, "Courier New", courier, monospace;background-color: #ffffff;/*white-space: pre;*/}.csharpcode pre { margin: 0em; }.csharpcode .rem { color: #008000; }.csharpcode .kwrd { color: #0000ff; }.csharpcode .str { color: #006080; }.csharpcode .op { color: #0000c0; }.csharpcode .preproc { color: #cc6633; }.csharpcode .asp { background-color: #ffff00; }.csharpcode .html { color: #800000; }.csharpcode .attr { color: #ff0000; }.csharpcode .alt {background-color: #f4f4f4;width: 100%;margin: 0em;}.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;img src="http://www.cnblogs.com/chenxizhang/aggbug/2446415.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/chenxizhang/archive/2012/04/13/2446415.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/chenxizhang/archive/2012/04/11/2442737.html</id><title type="text">Windows Desktop开发第一章（共四讲）</title><summary type="text">这一章分四讲介绍了Windows Desktop开发的一些基本概念。分别是 第一讲：简介课程和第一章介绍 视频： http://www.tudou.com/programs/view/5miggPYk...</summary><published>2012-04-11T09:40:00Z</published><updated>2012-04-11T09:40:00Z</updated><author><name>陈希章</name><uri>http://www.cnblogs.com/chenxizhang/</uri></author><link rel="alternate" href="http://www.cnblogs.com/chenxizhang/archive/2012/04/11/2442737.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/chenxizhang/archive/2012/04/11/2442737.html"/><content type="html">&lt;p&gt;这一章分四讲介绍了Windows Desktop开发的一些基本概念。分别是&lt;/p&gt; &lt;p&gt;&lt;strong&gt;第一讲：简介课程和第一章介绍&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;视频：&lt;/p&gt; &lt;p&gt;&lt;a title="http://www.tudou.com/programs/view/5miggPYk_Dg/" href="http://www.tudou.com/programs/view/5miggPYk_Dg/"&gt;http://www.tudou.com/programs/view/5miggPYk_Dg/&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;embed src="http://www.tudou.com/v/5miggPYk_Dg/&amp;amp;rpid=101037296&amp;amp;resourceId=101037296_05_05_99/v.swf" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" wmode="opaque" width="480" height="400"&gt;&lt;/embed&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;第二讲：Windows 桌面开发的技术&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1.GUI(图形化用户界面）:Windows Forms和WPF&lt;br&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; 2.CUI(命令行用户界面）:Console（控制台）&lt;br&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; 思考的问题：&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 当用户双击那个EXE的时候，到底是怎么运行起来的？&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 3.（无用户界面）Windows Service（服务）&lt;br&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; 4.WINDOWS 8会不会改变桌面开发的模式&lt;/p&gt; &lt;p&gt;视频&lt;/p&gt; &lt;p&gt;&lt;a title="http://www.tudou.com/programs/view/69NCSDR3MLE/" href="http://www.tudou.com/programs/view/69NCSDR3MLE/"&gt;http://www.tudou.com/programs/view/69NCSDR3MLE/&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;embed src="http://www.tudou.com/v/69NCSDR3MLE/&amp;amp;rpid=101037296&amp;amp;resourceId=101037296_05_05_99/v.swf" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" wmode="opaque" width="480" height="400"&gt;&lt;/embed&gt;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;第三讲：Windows Forms与WPF的比较（GUI)&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 程序结构&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 呈现机制&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Windows Forms(GDI+,2D)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WPF(GDI+ 2D,DirectX 3D==&amp;gt;Wrapper)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 编译机制&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 尤其注意界面元素的编译行为&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WPF:XAML=》BAML(Binary)&lt;/p&gt; &lt;p&gt;视频&lt;/p&gt; &lt;p&gt;&lt;a title="http://www.tudou.com/programs/view/Vm6F0EZeb74/" href="http://www.tudou.com/programs/view/Vm6F0EZeb74/"&gt;http://www.tudou.com/programs/view/Vm6F0EZeb74/&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;embed src="http://www.tudou.com/v/Vm6F0EZeb74/&amp;amp;rpid=101037296&amp;amp;resourceId=101037296_05_05_99/v.swf" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" wmode="opaque" width="480" height="400"&gt;&lt;/embed&gt;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;br&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;第四讲：设计模式和框架在Windows Desktop中的应用&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; MVC,MVP,MVVM&lt;/p&gt; &lt;p&gt;视频&lt;br&gt;&lt;a title="http://www.tudou.com/programs/view/jFq5FRpEsOU/" href="http://www.tudou.com/programs/view/jFq5FRpEsOU/"&gt;http://www.tudou.com/programs/view/jFq5FRpEsOU/&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;embed src="http://www.tudou.com/v/jFq5FRpEsOU/&amp;amp;rpid=101037296&amp;amp;resourceId=101037296_05_05_99/v.swf" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" wmode="opaque" width="480" height="400"&gt;&lt;/embed&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/chenxizhang/aggbug/2442737.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/chenxizhang/archive/2012/04/11/2442737.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry></feed>
