<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_咖喱块</title><subtitle type="text">记录是为了更好的忘却</subtitle><id>http://feed.cnblogs.com/blog/u/36766/rss</id><updated>2011-03-10T16:22:14Z</updated><author><name>Curry</name><uri>http://www.cnblogs.com/Curry/</uri></author><generator>CNBlogs BlogServer</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/Curry/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/36766/rss"/><entry><id>http://www.cnblogs.com/Curry/archive/2011/03/11/BamlViewer.html</id><title type="text">BamlViewer修改</title><summary type="text">在读Microsoft Live Labs Pivot 中exe的时候，发现他的generic.baml读不了，于是到http://reflectoraddins.codeplex.com/wikipage?title=BamlViewer中下载了源码修改。其实源码中还有两处遗漏的，没有修补，因为没法找到对应的XAML，也不知道修复的对不对，所以就未修复。另外还调整了XAML输出的格式。因为感觉老的界面挺难看，所以参考了http://stylesexplorer.codeplex.com/的代码进行了修改，发现他用的是SharpDevelop中TextEditor控件，控件虽好，但那个是2.2</summary><published>2011-03-10T16:21:00Z</published><updated>2011-03-10T16:21:00Z</updated><author><name>Curry</name><uri>http://www.cnblogs.com/Curry/</uri></author><link rel="alternate" href="http://www.cnblogs.com/Curry/archive/2011/03/11/BamlViewer.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/Curry/archive/2011/03/11/BamlViewer.html"/><content type="html">&lt;p&gt;在读Microsoft Live Labs Pivot 中exe的时候，发现他的generic.baml读不了，于是到&lt;a href="http://reflectoraddins.codeplex.com/wikipage?title=BamlViewer"&gt;http://reflectoraddins.codeplex.com/wikipage?title=BamlViewer&lt;/a&gt;中下载了源码修改。&lt;/p&gt;&#xD;
&lt;p&gt;其实源码中还有两处遗漏的，没有修补，因为没法找到对应的XAML，也不知道修复的对不对，所以就未修复。另外还调整了XAML输出的格式。&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;因为感觉老的界面挺难看，所以参考了&lt;a href="http://stylesexplorer.codeplex.com/"&gt;http://stylesexplorer.codeplex.com/&lt;/a&gt;的代码进行了修改，发现他用的是&lt;a href="http://www.sharpdevelop.net/opensource/sd/"&gt;SharpDevelop&lt;/a&gt;中TextEditor控件，控件虽好，但那个是2.2版本的里面的代码确实不太好看和4.0的比较起来。颜色也比较难改，只好修改了源文件。&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;经过一个下午的阅读终于搞懂了TextEditor控件的原理，就是解析每个字符，然后参照XML给的规格绘色，4.0看了下代码比之前好很多，但不知道原理有没改变。因为这个原因所以多了ICSharpCode.TextEditor.dll，它要和Reflector.BamlViewer.dll放在同一目录下。我同时给出源文件和需要安装的文件。&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;strong&gt;可惜查找高亮显示没有做，以后有时间一定补上。&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/Curry/201103/201103110021041207.png"&gt;&lt;img height="632" width="1159" src="http://images.cnblogs.com/cnblogs_com/Curry/201103/201103110021053583.png" alt="image" border="0" title="image" style="display: inline; border: 0px;" /&gt;&lt;/a&gt; &lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;a href="http://files.cnblogs.com/Curry/BamlViewer(Source).rar"&gt;源文件下载&lt;/a&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;a href="http://files.cnblogs.com/Curry/BamlViewer(Curry).rar"&gt;DLL下载&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/Curry/aggbug/1980338.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/Curry/archive/2011/03/11/BamlViewer.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/Curry/archive/2010/12/22/WPFLiquid.html</id><title type="text">生活就是这么狗血——WPF粒子小记</title><summary type="text">今天看到了一篇博客，不应该说昨天，作者用了HTML5去实现，老实说本来不想凑热闹，可看了有位兄弟sandcu用SL实现了遍，不过感觉速度并不理想，想来这种粒子效果自己还未用WPF实现过，顺便看看WPF到底性能如何，随着手痒了下面的悲剧也发生了。 1.因为闲的慌，我看了Flash的效果比较好，于是直接拿了Flash的代码来改，结果浪费了N多时间在上面，Flash的Random是从0到1的小数C#里的是整数的，开始效果就是达不，到后来报错才知道，郁闷了半天。 2. 我是用WriteableBitmap这个类来实现坐标点颜色的写入，可老是说我数组越界，弄了半天才知道是row和colum和x,y坐标的</summary><published>2010-12-21T18:56:00Z</published><updated>2010-12-21T18:56:00Z</updated><author><name>Curry</name><uri>http://www.cnblogs.com/Curry/</uri></author><link rel="alternate" href="http://www.cnblogs.com/Curry/archive/2010/12/22/WPFLiquid.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/Curry/archive/2010/12/22/WPFLiquid.html"/><content type="html">&lt;p&gt;今天看到了一篇&lt;a href="http://www.cnblogs.com/hongru/archive/2010/12/21/1912820.html"&gt;博客&lt;/a&gt;，不应该说昨天，作者用了HTML5去实现，老实说本来不想凑热闹，可看了有位兄弟&lt;a href="http://www.cnblogs.com/sandcu/archive/2010/12/21/1913039.html"&gt;sandcu&lt;/a&gt;用SL实现了遍，不过感觉速度并不理想，想来这种粒子效果自己还未用WPF实现过，顺便看看WPF到底性能如何，随着手痒了下面的悲剧也发生了。&lt;/p&gt;&#xD;
&lt;p&gt;1.因为闲的慌，我看了Flash的效果比较好，于是直接拿了Flash的代码来改，结果浪费了N多时间在上面，Flash的Random是从0到1的小数C#里的是整数的，开始效果就是达不，到后来报错才知道，郁闷了半天。&lt;/p&gt;&#xD;
&lt;p&gt;2. 我是用WriteableBitmap这个类来实现坐标点颜色的写入，可老是说我数组越界，弄了半天才知道是row和colum和x,y坐标的关系弄错了，应该是row = y,x = colum.&lt;/p&gt;&#xD;
&lt;p&gt;3.想FPS检测更准确，于是把&lt;a href="http://blogs.msdn.com/jgoldb/archive/2008/09/26/etw-event-tracing-in-wpf.aspx"&gt;ETW Event Tracing in WPF&lt;/a&gt;中的东西直接抄过来，结果发现他在UAC状态下一定要管理员启动不说，在我的项目里面还不能用，只能自己山寨。&lt;/p&gt;&#xD;
&lt;p&gt;4.花我最长时间最后也没搞定的，我图像的背景不得不是黑色的，为什么？因为我不知道怎么换成其他的，就算是我把背景画了一遍可还是有黑色东西来干扰（见图一），似乎没有clear(color)类似这样基本的函数调用，总之我是没找到怎么设置背景色；上一次的东西也无法清除，我搞不懂为什么会变成黑色。SL倒是查到有篇可以清理，按照这种情况看可能SL的运行效率比WPF还要好？WPF团队早就在&amp;ldquo;淫光&amp;rdquo;中那乐不思蜀了。&lt;a href="http://nokola.com/blog/post/2009/11/11/Best-Way-To-Clear-WriteableBitmap.aspx"&gt;http://nokola.com/blog/post/2009/11/11/Best-Way-To-Clear-WriteableBitmap.aspx&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;5.除了精神上摧残外，肉体也让我受不了，房间内有嗡嗡的吵杂声让我几经崩溃，也找不到声音来源，怀疑是隔壁或是外面马路上的施工，忙了半天连澡都没戏。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;小结：&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;虽然我坚信成功来源于坚持，可还是需要良道吉日的，感觉很费，早上还要上班，我的天啊。算了睡前安慰下，WPF的呈现速度还过的去，中间滚轮支持定点放大缩小，没怎么做用的是默认的，右键可以返回到原来的样子，其他的就是左键点住拖拖试试了。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/Curry/201012/201012220255332003.png"&gt;&lt;img style="display: inline; border-width: 0px;" title="image" src="http://images.cnblogs.com/cnblogs_com/Curry/201012/201012220255415812.png" border="0" alt="image" width="785" height="618" /&gt;&lt;/a&gt; （图一如果不是背景，水滴留过的地方就会有黑色）&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/Curry/201012/201012220255447401.png"&gt;&lt;img style="display: inline; border-width: 0px;" title="image" src="http://images.cnblogs.com/cnblogs_com/Curry/201012/201012220255476057.png" border="0" alt="image" width="793" height="626" /&gt;&lt;/a&gt; （图二只能是黑色）&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://files.cnblogs.com/Curry/Liquid.rar"&gt;附件下载&lt;/a&gt;：希望好心人能帮我解决下背景问题&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;______________________&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;后记：（原来附件还是有问题未修改）&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;感谢各位的支持，特别是&lt;a href="http://www.cnblogs.com/Rex/"&gt;地狱门神&lt;/a&gt;和&lt;a href="http://www.cnblogs.com/Clingingboy/"&gt;Clingingboy&lt;/a&gt;。&lt;/p&gt;&#xD;
&lt;p&gt;1.确实如地狱门神所说，背景问题是由于我的Long类型超出界限，影响到其他的格子所致。修改如下既可&lt;/p&gt;&#xD;
&lt;p&gt;byte* pBackBuffer = (byte*)_writeableBitmap.BackBuffer;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;br /&gt;// Find the address of the pixel to draw.    &lt;br /&gt;pBackBuffer += row * _writeableBitmap.BackBufferStride;    &lt;br /&gt;pBackBuffer += column * 4;    &lt;br /&gt;pBackBuffer[0] = color.B;    &lt;br /&gt;pBackBuffer[1] = color.G;    &lt;br /&gt;pBackBuffer[2] = color.R;    &lt;br /&gt;pBackBuffer[3] = color.A;&lt;/p&gt;&#xD;
&lt;p&gt;就是把_writeableBitmap.BackBuffer当成byte*来扫描，应该说是位图中的基本操作了，惭愧惭愧。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;2.Clingingboy给我另一种思路，也可以说是换了另外一套API来实现，感觉比用指针操作还快而且还不需要把项目设成unsafe编译，这API应该可以用于SL。&lt;/p&gt;&#xD;
&lt;p&gt;这种方法是使用WritePixels这个方法来实现。我把他给我项目又修改了下，完全用这个方法还省却了自己的锁定和表示更新操作。&lt;/p&gt;&#xD;
&lt;p&gt;当然你也可以用两种方法一起来在操作，这样的话背景是图画也是可以的，如把图片的点保存为一个数组，WritePixels每次用这个数组当背景刷新，用指针操作来抒写Water点。&lt;/p&gt;&#xD;
&lt;p&gt;当然我这份是最简单的谁让我这么懒呢。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://files.cnblogs.com/Curry/Clingingboy_Liquid.rar"&gt;修改后附件&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/Curry/aggbug/1913323.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/Curry/archive/2010/12/22/WPFLiquid.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/Curry/archive/2010/05/05/1728096.html</id><title type="text">程序员面对分歧和难题应当具备的态度【转】</title><summary type="text">能力不是最重要的，态度才是决定因素。程序员由于幼年受虐，缺乏异性关爱，以及鲜与人类交流等特殊原因，滋生了很多心理疾病，点一盏明灯，照亮这些阴暗角落，愿大家健康茁壮成长。1、在没有能力之前，不要过分追求代码完美，完成全部功能才是目标。写完美代码的关键，是对问题有没有完美深入的理解，而不是什么设计模式。2、发表意见前，请三思，对没有做过的工作，千万不要说&amp;ldquo;这个很简单，XX一下就好了&amp;rdq...</summary><published>2010-05-05T07:31:00Z</published><updated>2010-05-05T07:31:00Z</updated><author><name>Curry</name><uri>http://www.cnblogs.com/Curry/</uri></author><link rel="alternate" href="http://www.cnblogs.com/Curry/archive/2010/05/05/1728096.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/Curry/archive/2010/05/05/1728096.html"/><content type="html">&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;" id="_mcePaste"&gt;&amp;nbsp;能力不是最重要的，态度才是决定因素。程序员由于幼年受虐，缺乏异性关爱，以及鲜与人类交流等特殊原因，滋生了很多心理疾病，点一盏明灯，照亮这些阴暗角落，愿大家健康茁壮成长。&lt;/div&gt;&#xD;
&lt;div style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;" id="_mcePaste"&gt;&lt;/div&gt;&#xD;
&lt;div style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;" id="_mcePaste"&gt;1、在没有能力之前，不要过分追求代码完美，完成全部功能才是目标。写完美代码的关键，是对问题有没有完美深入的理解，而不是什么设计模式。&lt;/div&gt;&#xD;
&lt;div style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;" id="_mcePaste"&gt;&lt;/div&gt;&#xD;
&lt;div style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;" id="_mcePaste"&gt;2、发表意见前，请三思，对没有做过的工作，千万不要说&amp;ldquo;这个很简单，XX一下就好了&amp;rdquo;，既然这样那你自己去XX吧。&lt;/div&gt;&#xD;
&lt;div style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;" id="_mcePaste"&gt;&lt;/div&gt;&#xD;
&lt;div style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;" id="_mcePaste"&gt;3、不要轻易否定其他同事的工作成果，特别是有多年工作经验的同仁，最忌讳推倒重来，除非自己真的具备完整经验，否则自己就是下一个被别人推倒的人。&lt;/div&gt;&#xD;
&lt;div style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;" id="_mcePaste"&gt;&lt;/div&gt;&#xD;
&lt;div style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;" id="_mcePaste"&gt;4、多学习专业知识。比如图形、AI、机械、企业管理等。毕竟代码只是这些专业知识的实现载体。很多微电子专业的人写的媒体播放器比计算机专业的好，而数学专业的人写的编译器比计算机专业的强。&lt;/div&gt;&#xD;
&lt;div style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;" id="_mcePaste"&gt;&lt;/div&gt;&#xD;
&lt;div style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;" id="_mcePaste"&gt;5、忌讳自我感觉过于良好。自信和自大，奋进和激进仅一线之隔，不要失去理智。&lt;/div&gt;&#xD;
&lt;div style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;" id="_mcePaste"&gt;&lt;/div&gt;&#xD;
&lt;div style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;" id="_mcePaste"&gt;6、用合适的方法解决问题，问题有多大，解决方案就有多大，千万别嫌弃别人方法土，人家很土，但很靠谱。&amp;nbsp;&lt;/div&gt;&#xD;
&lt;div style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;" id="_mcePaste"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;写给自己看的。&lt;/div&gt;&#xD;
&lt;div style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;" id="_mcePaste"&gt;&lt;/div&gt;&#xD;
&lt;div style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;" id="_mcePaste"&gt;原文地址 http://www.cnblogs.com/effulgent/archive/2009/12/08/1619413.html&lt;/div&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&#xD;
&amp;nbsp;能力不是最重要的，态度才是决定因素。&lt;/strong&gt;程序员由于幼年受虐，缺乏异性关爱，以及鲜与人类交流等特殊原因，滋生了很多心理疾病，点一盏明灯，照亮这些阴暗角落，愿大家健康茁壮成长。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;br /&gt;1、在没有能力之前，不要过分追求代码完美，完成全部功能才是目标。写完美代码的关键，&lt;strong&gt;是对问题有没有完美深入的理解&lt;/strong&gt;，而不是什么设计模式。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;br /&gt;2、发表意见前，请三思，对没有做过的工作，千万不要说&amp;ldquo;这个很简单，XX一下就好了&amp;rdquo;，既然这样那你自己去XX吧。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;br /&gt;3、不要轻易否定其他同事的工作成果，特别是有多年工作经验的同仁，最忌讳推倒重来，除非自己真的具备完整经验，否则自己就是下一个被别人推倒的人。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;br /&gt;4、多学习专业知识。比如图形、AI、机械、企业管理等。毕竟代码只是这些专业知识的实现载体。很多微电子专业的人写的媒体播放器比计算机专业的好，而数学专业的人写的编译器比计算机专业的强。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;br /&gt;5、忌讳自我感觉过于良好。自信和自大，奋进和激进仅一线之隔，不要失去理智。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;br /&gt;6、用合适的方法解决问题，&lt;strong&gt;问题有多大，解决方案就有多大&lt;/strong&gt;，千万别嫌弃别人方法土，人家很土，但很靠谱。&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;写给自己看的。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;br /&gt;原文地址 http://www.cnblogs.com/effulgent/archive/2009/12/08/1619413.html&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;补充：以上观点都是建立在相当的&lt;b&gt;自信&lt;/b&gt;基础上。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/Curry/aggbug/1728096.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/Curry/archive/2010/05/05/1728096.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/Curry/archive/2010/04/02/LineChart.html</id><title type="text">用WPF山寨折线图，抄？是狠狠的抄</title><summary type="text">对于没有美术细胞的我来说，抄袭人家的设计或是创意是再平常不过的事，我承认这很无耻，如果在伟大“天朝”的教育体系下还可能升级为道德上的沦丧，毕竟人家搞个东西也不容易，可任务在身，只好下策，脸皮总是在生存以后才拿上台面的。所以也就不避讳了，俺就是抄的。</summary><published>2010-04-02T02:21:00Z</published><updated>2010-04-02T02:21:00Z</updated><author><name>Curry</name><uri>http://www.cnblogs.com/Curry/</uri></author><link rel="alternate" href="http://www.cnblogs.com/Curry/archive/2010/04/02/LineChart.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/Curry/archive/2010/04/02/LineChart.html"/><content type="html">&lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 对于没有美术细胞的我来说，抄袭人家的设计或是创意是再平常不过的事，我承认这很无耻，如果在伟大“天朝”的教育体系下还可能升级为道德上的沦丧，毕竟人家搞个东西也不容易，可任务在身，只好下策，脸皮总是在生存以后才拿上台面的。所以也就不避讳了，俺就是抄的。&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;a href="http://images.cnblogs.com/cnblogs_com/Curry/WindowsLiveWriter/WPF_A71E/2010032418543844_2.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; margin-left: 0px; border-top: 0px; margin-right: 0px; border-right: 0px" title="2010032418543844" border="0" alt="2010032418543844" src="http://images.cnblogs.com/cnblogs_com/Curry/WindowsLiveWriter/WPF_A71E/2010032418543844_thumb.jpg" width="767" height="221" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 该图抄袭自 万仓一黍 的&lt;a href="http://www.cnblogs.com/grenet/archive/2010/03/24/1694166.html"&gt;在winform中运用FusionCharts图表（一）&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;一.抄袭模式&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&amp;#160; &lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 尽管样式要抄袭，可代码不能抄袭，因为没有源码^ – ^ 。首先我们先从使用者的角度出发，作为使用者，我希望怎么来使用控件，而且要考虑到WPF的一些特性。线条可以一个个数组给，和传统的控件一样。可我认为这并不符合WPF的组装特性，每个线条可以是自由控制的，可粗可细，可虚线可实线。&lt;/p&gt;  &lt;p&gt;如效果为这样的图：&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/Curry/WindowsLiveWriter/WPF_A71E/image_18.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; margin-left: 0px; border-top: 0px; margin-right: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/Curry/WindowsLiveWriter/WPF_A71E/image_thumb_8.png" width="705" height="116" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;可以是这样的设计，也就是每个控件自己是一层，和其它控件没有直接联系。就连底面也是可以自由搭配的。&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/Curry/WindowsLiveWriter/WPF_A71E/image_4.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; margin-left: 0px; border-top: 0px; margin-right: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/Curry/WindowsLiveWriter/WPF_A71E/image_thumb_1.png" width="155" height="240" /&gt;&lt;/a&gt; &lt;a href="http://images.cnblogs.com/cnblogs_com/Curry/WindowsLiveWriter/WPF_A71E/image_6.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; margin-left: 0px; border-top: 0px; margin-right: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/Curry/WindowsLiveWriter/WPF_A71E/image_thumb_2.png" width="150" height="240" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;使用还有个就是代码的书写，那么在XAML中单个的控件就可以写成这样&lt;/p&gt;  &lt;pre &gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Sample&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;LineChart &lt;/span&gt;&lt;span style="color: red"&gt;LineColor&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;Orange&amp;quot; &lt;/span&gt;&lt;span style="color: red"&gt;LineThickness&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;20&amp;quot; &lt;/span&gt;&lt;span style="color: red"&gt;Datas&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;{&lt;/span&gt;&lt;span style="color: #a31515"&gt;Binding &lt;/span&gt;&lt;span style="color: red"&gt;Items&lt;/span&gt;&lt;span style="color: blue"&gt;}&amp;quot; /&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&#xD;
&lt;p&gt;如若要实现多个拼接，把控件放到&lt;strong&gt;可以层叠的容器&lt;/strong&gt;当中就可以了，比如Grid.如果你的数据是集合形式的，还可以借助ItemsControl这样的集合控件。&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 这里可能已经有人看出来抄袭的是WPF装饰器的模式和概念。&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&amp;#160;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;strong&gt;二.抄袭图形&lt;/strong&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&amp;#160;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 初步设想不错，可还不够灵活，假设每个点的样式可以更改而不仅仅是这种默认的白点，如根据喜好可以设置五角星，小红旗，这怎么办？一般情况下我们会为控件再添加个点的模板属性；在这里我又踟蹰了很久，是否真的需要这么的“一步到位”？在几年前，我曾听说装修现在有个观点叫做“轻装修，重装饰”，就是建好一个架子，里面的东西是可以由着喜好、心情、季节随意搭配。所以我更倾向于控件首先能实现一些比较简单的功能，可如果要更高级的功能和效果应该可以附加上的，毕竟有时候一开始也很难知道用户的喜好，加上有时候时间紧迫就只能先留下框架，以后有机会再讨价还价索要时间。&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 产品功能暂时可以延期，却不能老是跳票，“永远的毁灭公爵”绝不是好榜样。&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 对每个点进行模板，设置每个点实际的位置，很容易让我们想到使用ItemsControl,做个放置位置的Panel就可以了， 当然很明显我们并不需要那么多的功能，只要求每个点都能设置一个模板，那么好吧，依葫芦画瓢来个ItemTemplate、ItemTemplateSelector、ItemStringFormat属性，只需要在初始化的时候声明个UIElementCollection变量，在数据存放以后为数据new个性模板就成，如GetContainerForItemOverride()方法。&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 在这种条件下做个层，可以轻松的看到类似这样的效果，当然音符是我再次发挥抄袭特长的结果，具体的可以看&lt;a href="http://xamlbase.com/free-icons.php"&gt;http://xamlbase.com/free-icons.php&lt;/a&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/Curry/WindowsLiveWriter/WPF_A71E/image_8.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; margin-left: 0px; border-top: 0px; margin-right: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/Curry/WindowsLiveWriter/WPF_A71E/image_thumb_3.png" width="732" height="155" /&gt;&lt;/a&gt; &lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;对于层来说，还可以有很多的发挥，如下：&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/Curry/WindowsLiveWriter/WPF_A71E/image_10.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; margin-left: 0px; border-top: 0px; margin-right: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/Curry/WindowsLiveWriter/WPF_A71E/image_thumb_4.png" width="526" height="156" /&gt;&lt;/a&gt; &lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;对这种应用也可以手到擒来：&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/Curry/WindowsLiveWriter/WPF_A71E/image_14.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; margin-left: 0px; border-top: 0px; margin-right: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/Curry/WindowsLiveWriter/WPF_A71E/image_thumb_6.png" width="724" height="142" /&gt;&lt;/a&gt; &lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;不要惊讶，WPF是有API的，使用CombinedGeometry然后用GeometryCombineMode.Exclude就可以了。&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;因为底色也可以随意混搭，所以加个水印、Logo,背景提示语之类的也不是什么难事。&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;对于以上的所谓“创意”，当然是抄袭的，参见各大网站统计图。&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&amp;#160;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;strong&gt;三.抄袭代码&lt;/strong&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&amp;#160;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;strong&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/strong&gt;项目经理有要求图上的所有线条比例要统一，这个要求很合乎常理，可我们的线条都是单独的一个控件，你也许会说让后端计算出一个最大值绑定一下不就OK了，但一般控件都可以达到的效果，凭什么就要让业务干预，毕竟我们分层的原则是UI和业务分离，虽然有时候会有些妥协，但我们也要尽可能的做大完善，水平不就是在这样的“苛责”中进步的么？&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&amp;#160;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;strong&gt;感觉不错的抄法&lt;/strong&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;▲名字抄袭&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 做为前端人员，可能希望只要设置一个属性就可以完成，其实它的目的就是为了功能的附加，感觉有点像ToolTipService吧，那么我们的名字就叫&lt;span style="color: red"&gt;LineChartService&lt;/span&gt;。&lt;/p&gt;&#xD;
&#xD;
&lt;pre &gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Sample&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;LineChart &lt;/span&gt;&lt;span style="color: red"&gt;LineColor&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;Orange&amp;quot; &lt;/span&gt;&lt;span style="color: #a31515"&gt;Sample&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: red"&gt;LineChartService.GroupName&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;group1&amp;quot; &lt;/span&gt;&lt;span style="color: red"&gt;LineThickness&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;2&amp;quot; &lt;/span&gt;&lt;span style="color: red"&gt;Datas&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;{&lt;/span&gt;&lt;span style="color: #a31515"&gt;Binding &lt;/span&gt;&lt;span style="color: red"&gt;Items&lt;/span&gt;&lt;span style="color: blue"&gt;}&amp;quot; /&amp;gt;&#xD;
&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Sample&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;LineChart &lt;/span&gt;&lt;span style="color: red"&gt;LineColor&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;Green&amp;quot;  &lt;/span&gt;&lt;span style="color: #a31515"&gt;Sample&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: red"&gt;LineChartService.GroupName&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;group1&amp;quot; &lt;/span&gt;&lt;span style="color: red"&gt;LineThickness&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;2&amp;quot;  &lt;/span&gt;&lt;span style="color: red"&gt;Datas&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;{&lt;/span&gt;&lt;span style="color: #a31515"&gt;Binding &lt;/span&gt;&lt;span style="color: red"&gt;Items1&lt;/span&gt;&lt;span style="color: blue"&gt;}&amp;quot; /&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&#xD;
&lt;p&gt;&amp;#160;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;▲做法抄袭&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&amp;#160;&amp;#160;&amp;#160; 这种方法是方便，可作为后端的编码人员应该怎么做呢？印象中第一个出现的类似应用可能就是RadioButton,因为它也有个GroupName,可以根据组来决定勾选的控件影响的范围，好吧看看它的源码是如何做到的的，其实所谓的看就是一个大抄袭，去其特质取其共性。&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&amp;#160;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;▲算法抄袭&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 在抄袭这一模式的时候，有个想法就是计算出每个控件的最大值，然后放到一个全局的队列中，这个队列有自动排序功能，并有一个属性可以取得最大值.这其实是个算法，这个算法哪有的抄呢？当时在看BeginInvoke，我们的DispatcherPriority放进去，系统会根据值的大小排序，每次有个属性可以取得最大值，这不正是我所期望的么，啥都不说了，直接Copy，当然也要去掉一些东西，这种简单的算法，只要理解了他的目的，也没啥难度。所以PriorityQueue这个内部类也被我惨无人道的抄袭了。&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&amp;#160;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;▲WPF特性应用抄袭&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 对于屏幕的笛卡尔坐标，和我们普通的坐标不同，越向下Y轴值越大，一般的做法是用高度值来减下，以符合需求，可在WPF有Transform，在最后绘制图形的时候用这个来包装下，个人认为更优雅,这一做法抄袭自donjuan的&lt;a href="http://www.cnblogs.com/killmyday/archive/2009/07/27/1532230.html"&gt;在WPF中使用ItemsControl控件来实现线状图控件（一）&lt;/a&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;pre &gt;drawingContext.PushTransform(&lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;ScaleTransform&lt;/span&gt;(1, -1, 0, RenderSize.Height / 2));&#xD;
…&#xD;
drawingContext.Pop();&lt;/pre&gt;&#xD;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&#xD;
&#xD;
&lt;p&gt;&amp;#160;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;strong&gt;不爽的抄法&lt;/strong&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 在为点应用模板的代码中，最邪恶的应该是以下的一段山寨成果，声明这一坨真不是我的原创，打这一段也打的我老郁闷了，具体可以参看ItemsContorl中的做法。&lt;/p&gt;&#xD;
&#xD;
&lt;pre  &gt;&lt;span style="color: blue"&gt;protected virtual void &lt;/span&gt;PrepareContainerForItemOverride(&lt;span style="color: #2b91af"&gt;DependencyObject &lt;/span&gt;element, &lt;span style="color: blue"&gt;double &lt;/span&gt;item)&#xD;
{&#xD;
    &lt;span style="color: blue"&gt;var &lt;/span&gt;headeredContentControl = element &lt;span style="color: blue"&gt;as &lt;/span&gt;&lt;span style="color: #2b91af"&gt;HeaderedContentControl&lt;/span&gt;;&#xD;
    &lt;span style="color: blue"&gt;if &lt;/span&gt;(headeredContentControl != &lt;span style="color: blue"&gt;null&lt;/span&gt;)&#xD;
    {&#xD;
        headeredContentControl.Content = item;&#xD;
        headeredContentControl.ContentTemplate = ItemTemplate;&#xD;
        headeredContentControl.ContentTemplateSelector = ItemTemplateSelector;&#xD;
        headeredContentControl.ContentStringFormat = ItemStringFormat;&#xD;
    }&#xD;
    &lt;span style="color: blue"&gt;else&#xD;
    &lt;/span&gt;{&#xD;
        &lt;span style="color: blue"&gt;var &lt;/span&gt;contentControl = element &lt;span style="color: blue"&gt;as &lt;/span&gt;&lt;span style="color: #2b91af"&gt;ContentControl&lt;/span&gt;;&#xD;
        &lt;span style="color: blue"&gt;if &lt;/span&gt;(contentControl != &lt;span style="color: blue"&gt;null&lt;/span&gt;)&#xD;
        {&#xD;
            contentControl.Content = item;&#xD;
            contentControl.ContentTemplate = ItemTemplate;&#xD;
            contentControl.ContentTemplateSelector = ItemTemplateSelector;&#xD;
            contentControl.ContentStringFormat = ItemStringFormat;&#xD;
        }&#xD;
        &lt;span style="color: blue"&gt;else&#xD;
        &lt;/span&gt;{&#xD;
            &lt;span style="color: blue"&gt;var &lt;/span&gt;contentPresenter = element &lt;span style="color: blue"&gt;as &lt;/span&gt;&lt;span style="color: #2b91af"&gt;ContentPresenter&lt;/span&gt;;&#xD;
            &lt;span style="color: blue"&gt;if &lt;/span&gt;(contentPresenter != &lt;span style="color: blue"&gt;null&lt;/span&gt;)&#xD;
            {&#xD;
                contentPresenter.Content = item;&#xD;
                contentPresenter.ContentTemplate = ItemTemplate;&#xD;
                contentPresenter.ContentTemplateSelector = ItemTemplateSelector;&#xD;
                contentPresenter.ContentStringFormat = ItemStringFormat;&#xD;
            }&#xD;
            &lt;span style="color: blue"&gt;else&#xD;
            &lt;/span&gt;{&#xD;
                &lt;span style="color: blue"&gt;var &lt;/span&gt;headeredItemsControl = element &lt;span style="color: blue"&gt;as &lt;/span&gt;&lt;span style="color: #2b91af"&gt;HeaderedItemsControl&lt;/span&gt;;&#xD;
                &lt;span style="color: blue"&gt;if &lt;/span&gt;(headeredItemsControl != &lt;span style="color: blue"&gt;null&lt;/span&gt;)&#xD;
                {&#xD;
                    headeredItemsControl.Header = item;&#xD;
                    headeredItemsControl.HeaderTemplate = ItemTemplate;&#xD;
                    headeredItemsControl.HeaderTemplateSelector = ItemTemplateSelector;&#xD;
                    headeredItemsControl.HeaderStringFormat = ItemStringFormat;&#xD;
&#xD;
                }&#xD;
                &lt;span style="color: blue"&gt;else&#xD;
                &lt;/span&gt;{&#xD;
                    &lt;span style="color: #2b91af"&gt;ItemsControl &lt;/span&gt;itemsControl;&#xD;
                    &lt;span style="color: blue"&gt;if &lt;/span&gt;(((itemsControl = element &lt;span style="color: blue"&gt;as &lt;/span&gt;&lt;span style="color: #2b91af"&gt;ItemsControl&lt;/span&gt;) != &lt;span style="color: blue"&gt;null&lt;/span&gt;))&#xD;
                    {&#xD;
                        itemsControl.ItemTemplate = ItemTemplate;&#xD;
                        itemsControl.ItemTemplateSelector = ItemTemplateSelector;&#xD;
                        itemsControl.ItemStringFormat = ItemStringFormat;&#xD;
                    }&#xD;
                }&#xD;
            }&#xD;
        }&#xD;
    }&#xD;
}&lt;/pre&gt;&#xD;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&#xD;
&#xD;
&lt;p&gt;微软的类似的代码其实并不是最令人愤慨的，大批的internal才是令人反胃的，so,我也就一同copy了这风格。&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&amp;#160;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;strong&gt;四.补充&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;#160;&lt;/p&gt;&#xD;
&lt;a href="http://images.cnblogs.com/cnblogs_com/Curry/WindowsLiveWriter/WPF_A71E/2006101510830284_2.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; margin-left: 0px; border-top: 0px; margin-right: 0px; border-right: 0px" title="2006101510830284" border="0" alt="2006101510830284" align="left" src="http://images.cnblogs.com/cnblogs_com/Curry/WindowsLiveWriter/WPF_A71E/2006101510830284_thumb.jpg" width="240" height="160" /&gt;&lt;/a&gt;&#xD;
&#xD;
&lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 对于折线图的应用还可以有线条的动画呈现，点的动画变动，点的手动拖拉，大数据虚拟化显示等等，这些都可以发挥自己的想象做出更美好的作品，但您也可以抄袭一些现有的控件来达到需求。&lt;strong&gt;总之我们“学习”、“参考”都是希望有一天那些东西能够为我们效劳&lt;/strong&gt;，对于类似左边图上的效果也很容易抄袭得到。&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 如果您下了我的代码，可能会发现所提供的控件，似乎“只可远观不可亵玩”，很多功能貌似都被阉割了。比如：默认阴影的两头只是简单的处理，阴影里没有圆形的倒影，看起来不真实，默认的圆圈半径和外框线当值设大时会有问题（控件的Pen的Thickness的线的中点落在给定圆的半径上，而不是在半径外有Thickness），GroupName只处理了最大值而未处理最小值，PointLayer控件所产生的模板好像并未和原来的点重合，这么多控件有些方法居然没有提成公用方法等等。首先我得承认这些问题都是刚开始疏忽了，如果您能放弃那些控件而用自己的方式进行山寨，改份更好的，BUG更少的，更易用的，我想您的心情会更好。&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 回顾这些年的程序员生涯，让我感慨最深的就是复制和粘贴，从最初的Hello World到WPF的学习，一路上就是Sample的抄袭和应用，整个过程都是在别人路上进行徘徊，模式是别人的，语言是别人的，用法也是别人规定的，跌撞中偶尔发现个技法，也是在使用别人的API下，日复一日我都产生了做软件如同搭积木的消极想法。可其实人的物质生活，思想文化又是怎么提高的呢？可以说是站立在伟人的肩膀上，也可以说是把别人发现的路拓展的更好的基础上，生活也就在这一点点变化中，愈加美好。当然，您得拥有一颗不满现状积极向上的心。&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;PS:因抄袭产生的RP问题概不负责，毕竟上个月俺已经丢了饭卡一张，门进卡一张，手机一部，手机卡补的时候还多花了30元。&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;a href="http://files.cnblogs.com/Curry/LineChartSample.rar"&gt;附件&lt;/a&gt;&amp;#160; 尽管我们是同道中人，还是希望您不会再要刻度尺,因为我也没有^^&lt;/p&gt;&lt;img src="http://www.cnblogs.com/Curry/aggbug/1702891.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/Curry/archive/2010/04/02/LineChart.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/Curry/archive/2010/03/15/DispatcherPriority.html</id><title type="text">WPF DispatcherPriority 小析</title><summary type="text">长久以来DispatcherPriority对我都有种神秘的色彩，因为我甚至不知道如何“真正”的使用它。</summary><published>2010-03-15T00:45:00Z</published><updated>2010-03-15T00:45:00Z</updated><author><name>Curry</name><uri>http://www.cnblogs.com/Curry/</uri></author><link rel="alternate" href="http://www.cnblogs.com/Curry/archive/2010/03/15/DispatcherPriority.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/Curry/archive/2010/03/15/DispatcherPriority.html"/><content type="html">&lt;p&gt;长久以来DispatcherPriority对我都有种神秘的色彩，因为我甚至不知道如何“真正”的使用它。&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;一.执行原理&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 使用Dispatcher.BeginInvoke的时候，其中一个参数便是要指定合适的DispatcherPriority。之前当设置这个参数的时候我往往凭着感觉或是穷举——一种一个失败接着换个继续试的方法。而用BeginInvoke这个函数的目的无非是为了让参数中指定的委托执行的慢些（不在当时马上执行），或是在多线程操作避免当前线程操作了控件而引发错误。&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 当然马上执行也是可以的，无非是把DispatcherPriority指定为Send。&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 其实除了Send以外，其他都是通过消息队列的形式——用PostMessage发一个自定义消息，然后在下次消息队列读取这条消息的时候再判断处理。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt; 这种方式有什么好处？&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/strong&gt;这可以达到异步。有时候异步常常会和同时进行相挂钩，而在这里是把Dispatcher.BeginInvoke中要执行的委托操作存放到某处，先执行Dispatcher.BeginInvoke后面的操作。后面的操作执行，然后呈现出画面会令使用者感觉不会太“卡”。&lt;u&gt;使用者感觉卡的一个重要因素是画面呈现的不及时&lt;/u&gt;。执行完呈现之后还要记得把Dispatcher.BeginInvoke中的委托拿出来执行，用什么方式最好呢？可能有人会说用个Timer来不停检查是否Dispatcher.BeginInvoke之后代码已经完结。可问题在于你怎么知道Dispatcher.BeginInvoke之后代码已经完结了呢？&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;回本溯源Dispatcher.BeginInvoke之前的代码又是谁引发的呢？&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/strong&gt;当我们把这个代码放在某个按钮的Click事件中时，是否想过Click事件的源泉？对，没错是消息队列。我们的GetMessage，也就是说当我们Dispatcher.BeginInvoke之后的代码结束时，他会回到GetMessage那个While循环处。什么你创建了一个线程，没有做消息循环，在其中创建的按钮没有反应？那我想弱弱的问句，您确定用的是WPF框架？当你用另外一个线程创建UI时，也必须要开启消息循环，因为这个是windows的基础。&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;strong&gt;既然要回到GetMessage，那么就是要把消息记录到GetMessage下面的消息中即可，所以用了PostMessage来发送消息。&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;二.执行方式&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 除了两个无效DispatcherPriority（Inactive,Invalid）和马上执行的Send外，其他的其实可以分成两种，前台和后台。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;那什么是前台呢？&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 前台就是马上发送个PostMessage自定义消息。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;那什么是后台呢？&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; 后台就是如果当前执行的系统消息是输入消息，那么不会马上发送PostMessage消息，而是执行一个Timer，其实Timer也是种消息消息，只是速度更快罢了，当发现不再是输入消息之后就和前台线程一样用PostMessage来发送消息。为什么一定要等到输入消息结束后再执行？这是为了更准确的输入，如Ctrl+C这样的快捷键、鼠标连续点击，这样就不会造成BUG。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;前台线程有哪些呢？&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 按照最快到最慢执行的顺序分别是Normal,DataBind,Render,Load。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;为什么要分大小？&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/strong&gt;刚才说了Dispatcher.BeginInvoke会把委托存放到一个地方，这个地方当然是一个可以记录集合的地方，因为一段代码中Dispatcher.BeginInvoke可以执行多次，然后系统收到消息去集合中取一笔数据，那该取哪一笔呢？ 简单的用队列或堆栈显然不合适。有了DispatcherPriority才可以令使用者有更多选择和搭配的机会。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;既然是为了安排从集合取出的顺序，为什么不用简单的数字，而用枚举，并且取了类似Render这样的名字？&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 这也是我长久以来困惑最大的地方。我想是不是WPF框架预先的使用了一些数字权限，而在这些数字中做了特定的事，所以用名字来命名这件特定的事，使理解更加容易。&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;三.执行时机&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Normal：&lt;/strong&gt;这个是最普通的了，也是全限最高的，Invoke实际就是用了这个。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;DataBind：&lt;/strong&gt;目前未知，看名字似乎是和数据绑定有关。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Render：&lt;/strong&gt;用PostRender给后端的Micore模块(3.5为wpfgfx_v0300.dll)发送图像的数据。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Loaded：&lt;/strong&gt;主要发送Load和UnLoad和事件和布局事件，其实Load和UnLoad也是布局事件，如Load事件是把控件加入到某个VisualTree之后便引发，UnLoad是移出VisualTree后引发。比如TabControl中间的Content那块就是不停的切换。&lt;u&gt;在布局当中我们还比较关心的是一个事，那就是何时套模板？除了我们手动调用ApplyTemplate外，系统是如何调用？对该函数简单的下个断点，便可以得到答案是MeasureCore。那MeasureCore又是如何引发？答案是当加入VisualTree便会引发控件的InvalidateMeasure,InvalidateMeasure是异步的，对布局不会马上产生影响，简单的用工具看下源码便会知道那个函数的作用是把控件控件放到一个队列里面，不过放的控件并不是当前的控件，而是沿着可视树找到的根元素。这样其实就减少了Measure的次数，因为Measure会对父子控件都有影响。而从根元素传递下来，实际上是节省了开支。而这样想来申请模板的时候在MeasureCore中做也是合情合理的，因为Measure就以为着为布局申请空间，自然要知道控件应用数据后长什么样。&lt;/u&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Input:&lt;/strong&gt;输入事件&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Background:&lt;/strong&gt;其实InvalidateMeasure把根元素加入集合中后，还是需要暂时不执行，那么异步的结构已经有BeginInvoke，自然是使用原有的，他就是使用了Background。可以理解的原因，一般输入都会引起布局的变化，模板申请好马上用的事件，最好在此或之后。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;ContextIdle：&lt;/strong&gt;可以检测垃圾回收，避免内存泄露。使用示例请见我的上篇BLOG——WPF Binding实现自推 中最后倒数第二段。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;ApplicationIdle:&lt;/strong&gt;InvalidateMeasure使用的一种&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;SystemIdle：&lt;/strong&gt;以上都执行完之后&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;当然这些可能有误，留着以后慢慢补充了。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/Curry/aggbug/1685875.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/Curry/archive/2010/03/15/DispatcherPriority.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/Curry/archive/2010/02/09/WPFBinding.html</id><title type="text">WPF Binding实现自推——强烈要求拍砖</title><summary type="text">&amp;#160;  &amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 因为项目经常碰到Binding的问题，常常不能联动，所以才进行了分析，我解决方法的思路比较死板：定义问题 -&amp;gt;分解问题 -&amp;gt;初步解决问题 -&amp;gt;优化解法。在解决问题过程中是有收获的，所以分享下心得，也希望各位大大能够帮助小弟查验下思路是否正确，帮忙解解惑，在这里先谢过了。当然推理这段是和WPF无关的，先有...</summary><published>2010-02-09T03:20:00Z</published><updated>2010-02-09T03:20:00Z</updated><author><name>Curry</name><uri>http://www.cnblogs.com/Curry/</uri></author><link rel="alternate" href="http://www.cnblogs.com/Curry/archive/2010/02/09/WPFBinding.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/Curry/archive/2010/02/09/WPFBinding.html"/></entry><entry><id>http://www.cnblogs.com/Curry/archive/2009/12/25/WPFDragDrop.html</id><title type="text">WPF自定义控件——顶级控件</title><summary type="text">&amp;#160;&amp;#160;&amp;#160;&amp;#160; 作为一个WPF程序员，我最希望看到的是WPF的应用，或者更确切的说是绚丽的应用，虽然限于自身的实力还不能拿出成绩来，但看到别人的作品时，心里还是有很大的宽慰——WPF是可以做出更加动人地产品的，只要你坚定的走下去，带着不满现状的追求走下去。  &amp;#160;&amp;#160;&amp;#160;&amp;#160; 下图是Telerik的WPF控件，我相信很多人也下过他的...</summary><published>2009-12-25T06:18:00Z</published><updated>2009-12-25T06:18:00Z</updated><author><name>Curry</name><uri>http://www.cnblogs.com/Curry/</uri></author><link rel="alternate" href="http://www.cnblogs.com/Curry/archive/2009/12/25/WPFDragDrop.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/Curry/archive/2009/12/25/WPFDragDrop.html"/></entry><entry><id>http://www.cnblogs.com/Curry/archive/2009/09/16/WPFDecorator.html</id><title type="text">WPF自定义控件 —— 装饰器</title><summary type="text">顾名思义就是装饰用的，也就是说不改变原有的控件结构，但可以为控件添加一些新的功能，或是为控件的显示外观增加些东西</summary><published>2009-09-16T06:47:00Z</published><updated>2009-09-16T06:47:00Z</updated><author><name>Curry</name><uri>http://www.cnblogs.com/Curry/</uri></author><link rel="alternate" href="http://www.cnblogs.com/Curry/archive/2009/09/16/WPFDecorator.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/Curry/archive/2009/09/16/WPFDecorator.html"/></entry><entry><id>http://www.cnblogs.com/Curry/archive/2009/08/30/MVVM.html</id><title type="text">制作WPF联机飞行棋的失败体验</title><summary type="text">&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 飞行棋作为幼时的娱乐项目在我的记忆里印象是相当深刻的，用编码实现它也一直是我自己的目标。WPF有着图像编码的舒适体验，自然成为我的首选；伴随着WPF的Binding，一种新的模式也应运而生——MVVM(Model-View-ViewModel)，使得页面和逻辑更好的分离。可这次的体验对我而言不管从技术到思想都深深的受到了打击。  &amp;#1...</summary><published>2009-08-30T03:53:00Z</published><updated>2009-08-30T03:53:00Z</updated><author><name>Curry</name><uri>http://www.cnblogs.com/Curry/</uri></author><link rel="alternate" href="http://www.cnblogs.com/Curry/archive/2009/08/30/MVVM.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/Curry/archive/2009/08/30/MVVM.html"/></entry><entry><id>http://www.cnblogs.com/Curry/archive/2009/07/27/1531798.html</id><title type="text">WPF中改进自定义Command一些想法</title><summary type="text">Command来源于Command命令模式，Command模式它封装的是命令，把命令发出者的责任和命令执行者的责任分开，直白的说为了调用与具体实现解耦。关于理论俺向来是不擅长的，而且各位达人的文章也已...</summary><published>2009-07-27T02:20:00Z</published><updated>2009-07-27T02:20:00Z</updated><author><name>Curry</name><uri>http://www.cnblogs.com/Curry/</uri></author><link rel="alternate" href="http://www.cnblogs.com/Curry/archive/2009/07/27/1531798.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/Curry/archive/2009/07/27/1531798.html"/></entry></feed>
