﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>博客园-木-叶</title><link>http://www.cnblogs.com/nankezhishi/</link><description>十载酣游不觉醒，已二更；横刀把盏待天青，还入梦。</description><language>zh-cn</language><lastBuildDate>Sun, 05 Jul 2009 22:28:02 GMT</lastBuildDate><pubDate>Sun, 05 Jul 2009 22:28:02 GMT</pubDate><ttl>60</ttl><item><title>你有读过软件的协议或是网站的服务条款吗？</title><link>http://www.cnblogs.com/nankezhishi/archive/2009/06/30/1514278.html</link><dc:creator>南柯之石</dc:creator><author>南柯之石</author><pubDate>Tue, 30 Jun 2009 14:00:00 GMT</pubDate><guid>http://www.cnblogs.com/nankezhishi/archive/2009/06/30/1514278.html</guid><wfw:comment>http://www.cnblogs.com/nankezhishi/comments/1514278.html</wfw:comment><comments>http://www.cnblogs.com/nankezhishi/archive/2009/06/30/1514278.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/nankezhishi/comments/commentRss/1514278.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/nankezhishi/services/trackbacks/1514278.html</trackback:ping><description><![CDATA[<p>基本上所有的软件，在安装一开始；所有的网站，在注册用户时，都会有一个协议或是服务条款要你阅读，同意了之后才能安装或是注册。说实话，到现在我用了7年电脑，直到最近才开始了解这部分的内容。在之前，全都是被我无视的。不知道大家有没有读过呢？ <p>我自己开始关注这部分的内容，一开始是因为工作需要，公司使用软件之前，要提供软件的License，研究通过了才能安装使用。</p> <p>再后来，看到国外很多关于License的感觉莫名其妙的新闻。比如曾有人把Google告上法庭，理由是Google没有把服务条款放在首页。在中国就成了奇闻，也看得出国内民众对于软件产品的法律意识的淡薄。</p> <p>协议是规范软件提供商与用户间权利与义务的最重要的合法依据之一。使用软件之前，不去了解协议或服务条款，真是被人卖了都不知道。比如理财软件，如果协议上说，甲方有权利把你的理财记录发布在甲方的其它产品上，可能你就要考虑一下你是否愿意。如果安装前没有了解，等人家把你的理财发到了网上，后悔也晚了。</p> <p>在国内更是有不少作坊网站连服务条款都没有给出来，然后注册又要邮箱地址。从技术角度而言，根本不需要邮箱地址的。如果没有服务条款的约束，就等着邮箱变垃圾堆吧。（不过不排除某些网站的服务条款是YY的，不过它YY你就可以告它，但是没有服务条款，或是有但是你没有看。那就……）</p> <p><strong>BTW：大家有谁知道博客园的服务条款页面在哪儿？</strong></p><img src ="http://www.cnblogs.com/nankezhishi/aggbug/1514278.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47989/" target="_blank">Twitter无处不在 魔兽世界Twitter发送器插件发布</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>译作要严格尊重原著吗？&amp;mdash;&amp;mdash;读〈Windows核心编程〉小感</title><link>http://www.cnblogs.com/nankezhishi/archive/2009/06/26/1511315.html</link><dc:creator>南柯之石</dc:creator><author>南柯之石</author><pubDate>Thu, 25 Jun 2009 16:33:00 GMT</pubDate><guid>http://www.cnblogs.com/nankezhishi/archive/2009/06/26/1511315.html</guid><wfw:comment>http://www.cnblogs.com/nankezhishi/comments/1511315.html</wfw:comment><comments>http://www.cnblogs.com/nankezhishi/archive/2009/06/26/1511315.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/nankezhishi/comments/commentRss/1511315.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/nankezhishi/services/trackbacks/1511315.html</trackback:ping><description><![CDATA[<p>前一段时间，关于国内译著的翻译质量问题甚嚣尘上。无心参与其中，只是读了几篇战贴。其实大家都不容易，大可以看淡一些。自己怕吃亏，买书之前好歹看看网上的口风如何就不会买回来才发现原来是天书。</p> <p>回到原题，我们讨论一下翻译得<strong>比较</strong>好的书。昨天看《Windows核心编程（第五版）》看到第27页时，发现书中关于MultiByteToWideChar函数的描述有逻辑错误。如下：</p> <p><font color="#008080" size="2"><strong>“必须在cchWideChar参数中指定这个缓冲区的最大长度（字符数）”</strong></font></p> <p><font color="#008080" size="2"><strong>“将第一次MultiByteToWideChar调用的返回值<font color="#ff0000">乘以sizeof(wchar_t)后</font>得到的大小作为cchWideChar参数的值传入。”</strong></font></p> <p>还有其它的描述放一起会更明显，但是这两句也足够了。分析一下就知道，这两句话一定有一句有问题。</p> <p>后来查MSDN知道是第二句有问题。直接把返回值作为参数就可以了，不需要乘以sizeof(wchar_t)。会不会是翻译错误了呢？一般翻译问题都是用词不当或句子不通，一般不会莫名其妙多出个逻辑来的。随后我翻看翻看了一下原著，的确是原著就写错了。</p> <p>这个译著还是很尊重原著的，但是估计译者也没有读出这个问题，不然怎么地也会写个译注什么的更正一下吧。好在这个错误已经发布在了<a href="http://www.gesoftfactory.com/ge/WindowsViaCpp/">官方的勘误表</a>上。</p> <p>《罗密欧与朱丽叶》有很多个译本。个人感觉朱生豪先生的译本虽然语言上有些土，但是其实比其它的翻本更能被中国人接受，书中把只有用英语才能读出来的幽默感，用中文也很好的表达了出来，虽然对原著的改动较大，但是读起来的效果最佳。这些都是要建立在对英语和原文的双重深入理解的基础上才能做到的。</p> <p>&nbsp; 所以，我们还是自己好好努力学习英语，直接看原著吧。</p><img src ="http://www.cnblogs.com/nankezhishi/aggbug/1511315.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47988/" target="_blank">Firefox 3.5匆忙推出漏洞多 Mozilla本月将更新</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>编译支持Log功能的Unicode NSIS</title><link>http://www.cnblogs.com/nankezhishi/archive/2009/06/25/unicodensislog.html</link><dc:creator>南柯之石</dc:creator><author>南柯之石</author><pubDate>Thu, 25 Jun 2009 12:36:00 GMT</pubDate><guid>http://www.cnblogs.com/nankezhishi/archive/2009/06/25/unicodensislog.html</guid><wfw:comment>http://www.cnblogs.com/nankezhishi/comments/1511221.html</wfw:comment><comments>http://www.cnblogs.com/nankezhishi/archive/2009/06/25/unicodensislog.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnblogs.com/nankezhishi/comments/commentRss/1511221.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/nankezhishi/services/trackbacks/1511221.html</trackback:ping><description><![CDATA[<p>对于开发多语言版本的安装包来说，使用<a href="http://www.scratchpaper.com/">Unicode NSIS</a>就成了一个比较自然的选择。然而Unicode Nsis属于官方NSIS的衍生版，开发进度势必落后于官方的NSIS，主要由Jim一个人进行维护。现在官方最新版本是2.45，而Unicode版还停留在2.42。</p>
<p>用过NSIS的都知道，NSIS的默认方式是手写卸载脚本的。如果使用了支持LOG功能的特殊版NSIS（也是官方的）。使用这个版本的NSIS生成的安装包可以在安装过程中生成日志文件，再加上网友提供的现成脚本，就可以比较方便地实现用日志文件进行卸载的功能。实现方式可以参考<a href="http://www.cnblogs.com/nankezhishi/archive/2009/04/02/nsis_structure.html">NSIS的基本结构</a>一文。</p>
<p>然而，Unicode NSIS的作者没有提供支持LOG功能的NSIS的下载。而只提供了源代码下载。这样我们就不得不<a href="http://www.cnblogs.com/nankezhishi/archive/2009/04/05/buildnsis.html">自己重新编译NSIS</a>。编译过程很简单，加上一个NSIS_CONFIG_LOG编译参数就可以。但是如果问题这么简单就没有必要写个文章专门介绍一下了。</p>
<p>问题就在于，用自己编译出来的NSIS生成的安装包生成的LOG文件有错误！什么错误呢？在网上没有搜到任何线索，只能自己分析一下LOG文件，自己找错误了。（昨天给Jim发了邮件，不过没有时间等他的回复了）</p>
<p>查看了Unicode NSIS的相关源代码和《Windows核心编程》，发现最有可能出问题的就是WriteFile函数的问题。相关源代码如下。</p>
<div style="margin: 20px 0px 10px; padding: 4px; overflow: auto; text-align: left; border-left-color: silver; line-height: 12pt; background-color: #f4f4f4; width: 97.5%; font-family: 'Courier New',courier,monospace; direction: ltr; max-height: 200px; font-size: 8pt; cursor: text;" id="codeSnippetWrapper">
<div style="padding: 0px; overflow: visible; text-align: left; line-height: 12pt; background-color: #f4f4f4; width: 100%; font-family: 'Courier New',courier,monospace; direction: ltr; color: black; font-size: 8pt;" id="codeSnippet">
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; text-align: left; line-height: 12pt; background-color: white; width: 100%; font-family: 'Courier New',courier,monospace; direction: ltr; color: black; font-size: 8pt;"><span style="color: #0000ff;">if</span> (g_log_file[0] &amp;&amp; fp == INVALID_HANDLE_VALUE)</pre>
<!--CRLF-->
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; text-align: left; line-height: 12pt; background-color: #f4f4f4; width: 100%; font-family: 'Courier New',courier,monospace; direction: ltr; color: black; font-size: 8pt;">{</pre>
<!--CRLF-->
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; text-align: left; line-height: 12pt; background-color: white; width: 100%; font-family: 'Courier New',courier,monospace; direction: ltr; color: black; font-size: 8pt;">    fp = myOpenFile(g_log_file, GENERIC_WRITE, OPEN_ALWAYS);</pre>
<!--CRLF-->
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; text-align: left; line-height: 12pt; background-color: #f4f4f4; width: 100%; font-family: 'Courier New',courier,monospace; direction: ltr; color: black; font-size: 8pt;">    <span style="color: #0000ff;">if</span> (fp != INVALID_HANDLE_VALUE)</pre>
<!--CRLF-->
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; text-align: left; line-height: 12pt; background-color: white; width: 100%; font-family: 'Courier New',courier,monospace; direction: ltr; color: black; font-size: 8pt;">        SetFilePointer(fp, 0, NULL, FILE_END);</pre>
<!--CRLF-->
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; text-align: left; line-height: 12pt; background-color: #f4f4f4; width: 100%; font-family: 'Courier New',courier,monospace; direction: ltr; color: black; font-size: 8pt;">}</pre>
<!--CRLF-->
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; text-align: left; line-height: 12pt; background-color: white; width: 100%; font-family: 'Courier New',courier,monospace; direction: ltr; color: black; font-size: 8pt;"><span style="color: #0000ff;">if</span> (fp != INVALID_HANDLE_VALUE)</pre>
<!--CRLF-->
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; text-align: left; line-height: 12pt; background-color: #f4f4f4; width: 100%; font-family: 'Courier New',courier,monospace; direction: ltr; color: black; font-size: 8pt;">{</pre>
<!--CRLF-->
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; text-align: left; line-height: 12pt; background-color: white; width: 100%; font-family: 'Courier New',courier,monospace; direction: ltr; color: black; font-size: 8pt;">    DWORD d;</pre>
<!--CRLF-->
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; text-align: left; line-height: 12pt; background-color: #f4f4f4; width: 100%; font-family: 'Courier New',courier,monospace; direction: ltr; color: black; font-size: 8pt;">    mystrcat(log_text,_T(<span style="color: #006080;">"\r\n"</span>));</pre>
<!--CRLF-->
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; text-align: left; line-height: 12pt; background-color: white; width: 100%; font-family: 'Courier New',courier,monospace; direction: ltr; color: black; font-size: 8pt;">    WriteFile(fp,log_text,mystrlen(log_text),&amp;d,NULL);</pre>
<!--CRLF-->
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; text-align: left; line-height: 12pt; background-color: #f4f4f4; width: 100%; font-family: 'Courier New',courier,monospace; direction: ltr; color: black; font-size: 8pt;">}</pre>
<!--CRLF--></div>
</div>
<p>&nbsp;</p>
<p>Unicode NSIS生成的所有字符串都是Unicode编码的，写到这个文件里的字符串也是。那么上面的代码有两个问题。</p>
<p>1. 作者在创建这个文件的时候，没有声明这个文件是Unicode文件，使得记事本在打开文件时，以ANSI编码打开，从而产生错误。这个声明就是Byte Order Mark，只是针对Windows平台的<strong>部分</strong>Unicode文件有这个约束。（比如VS就可以选择是否在源代码文件中加入BOM。）</p>
<p>2. WriteFile时，第三个参数不正确。第三个参数的单位是字节，但是mystrlen函数返回的是log_text的字符数。而Unicode的一个字符有sizeof(TCHAR)个字节。所以实际写入文件中的字符串，只是log_text的前sizeof(TCHAR)分之一。</p>
<p>好了，问题找到了，着手修改源代码吧。先加上BOM，再把第三个参数乘以sizeof(TCHAR)。编译很顺利地完成。生成的LOG文件也是完整的了并能用记事本打开了。</p>
<p>但是，卸载功能无效。把生成的Unicode编码的Log文件另存为ANSI编码的。能卸载了~~~~看来这个Unicode NSIS的卸载包不是很完美啊。想必要让Uninstaller支持Unicode又要改不少代码。一想还有另一种可能是Uninstaller不认识BOM，毕竟NSIS是跨平台的，但是如果记事本不可读也是不能接受的。后来试了一下，果然不能有BOM。把BOM去掉，Uninstaller就正常工作了。</p>
<p>最终代码修改如下：</p>
<div style="margin: 20px 0px 10px; padding: 4px; overflow: auto; text-align: left; border-left-color: silver; line-height: 12pt; background-color: #f4f4f4; width: 97.5%; font-family: 'Courier New',courier,monospace; direction: ltr; max-height: 200px; font-size: 8pt; cursor: text;" id="codeSnippetWrapper">
<div style="padding: 0px; overflow: visible; text-align: left; line-height: 12pt; background-color: #f4f4f4; width: 100%; font-family: 'Courier New',courier,monospace; direction: ltr; color: black; font-size: 8pt;" id="codeSnippet">
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; text-align: left; line-height: 12pt; background-color: white; width: 100%; font-family: 'Courier New',courier,monospace; direction: ltr; color: black; font-size: 8pt;"><span style="color: #0000ff;">if</span> (fp != INVALID_HANDLE_VALUE)</pre>
<!--CRLF-->
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; text-align: left; line-height: 12pt; background-color: #f4f4f4; width: 100%; font-family: 'Courier New',courier,monospace; direction: ltr; color: black; font-size: 8pt;">{</pre>
<!--CRLF-->
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; text-align: left; line-height: 12pt; background-color: white; width: 100%; font-family: 'Courier New',courier,monospace; direction: ltr; color: black; font-size: 8pt;">    DWORD d;</pre>
<!--CRLF-->
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; text-align: left; line-height: 12pt; background-color: #f4f4f4; width: 100%; font-family: 'Courier New',courier,monospace; direction: ltr; color: black; font-size: 8pt;">    mystrcat(log_text, _T(<span style="color: #006080;">"\r\n"</span>));</pre>
<!--CRLF-->
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; text-align: left; line-height: 12pt; background-color: white; width: 100%; font-family: 'Courier New',courier,monospace; direction: ltr; color: black; font-size: 8pt;"><span style="color: #cc6633;">#ifdef</span> UNICODE</pre>
<!--CRLF-->
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; text-align: left; line-height: 12pt; background-color: #f4f4f4; width: 100%; font-family: 'Courier New',courier,monospace; direction: ltr; color: black; font-size: 8pt;">    WriteFile(fp, log_text, mystrlen(log_text) * <span style="color: #0000ff;">sizeof</span>(TCHAR), &amp;d, NULL);</pre>
<!--CRLF-->
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; text-align: left; line-height: 12pt; background-color: white; width: 100%; font-family: 'Courier New',courier,monospace; direction: ltr; color: black; font-size: 8pt;"><span style="color: #cc6633;">#else</span></pre>
<!--CRLF-->
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; text-align: left; line-height: 12pt; background-color: #f4f4f4; width: 100%; font-family: 'Courier New',courier,monospace; direction: ltr; color: black; font-size: 8pt;">    WriteFile(fp, log_text, mystrlen(log_text), &amp;d, NULL);</pre>
<!--CRLF-->
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; text-align: left; line-height: 12pt; background-color: white; width: 100%; font-family: 'Courier New',courier,monospace; direction: ltr; color: black; font-size: 8pt;"><span style="color: #cc6633;">#endif</span></pre>
<!--CRLF-->
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; text-align: left; line-height: 12pt; background-color: #f4f4f4; width: 100%; font-family: 'Courier New',courier,monospace; direction: ltr; color: black; font-size: 8pt;">}</pre>
<!--CRLF--></div>
</div>
<p>然后用下面的指令Build一下，</p>
<p>scons UNICODE=yes NSIS_CONFIG_LOG=yes SKIPUTILS=&#8221;NSIS Menu&#8221; PREFIX=&#8221;<font color="#ff0000">Your Install Folder</font>&#8221; install</p>
<p>支持Log的Unicode版NSIS就生成好了。</p>
<p>另外附上自己编译好的<a href="http://files.cnblogs.com/nankezhishi/nsis-2.42.5-unicode-log..zip">补丁</a><span>，覆盖现有安装即可。</span></p><p><span style="color: #0000ff;">更新：</span><br /></p><p><span style="color: #0000ff;">这时生成的Log文件是Unicode编码，而FileRead指令是不能正确读取Unicode文件的。这样就导致Uninstall By Log功能无法正常运行。</span></p><p><span style="color: #0000ff;">解决方法也很简单，把读取Unicode文件的FileRead指令替换成Unicode NSIS所特有的<strong>FileReadUTF16LE</strong>就可以了。</span></p><img src ="http://www.cnblogs.com/nankezhishi/aggbug/1511221.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47987/" target="_blank">预测：Twitter最可能收购的十家公司</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>发现一个不错的技术博客</title><link>http://www.cnblogs.com/nankezhishi/archive/2009/06/24/1510557.html</link><dc:creator>南柯之石</dc:creator><author>南柯之石</author><pubDate>Wed, 24 Jun 2009 14:58:00 GMT</pubDate><guid>http://www.cnblogs.com/nankezhishi/archive/2009/06/24/1510557.html</guid><wfw:comment>http://www.cnblogs.com/nankezhishi/comments/1510557.html</wfw:comment><comments>http://www.cnblogs.com/nankezhishi/archive/2009/06/24/1510557.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/nankezhishi/comments/commentRss/1510557.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/nankezhishi/services/trackbacks/1510557.html</trackback:ping><description><![CDATA[<p><a href="http://xinsync.xju.edu.cn/">冰山上的播客</a></p> <p>今天在网上找有关网络包方面的资料的时候找的。</p> <p>从07年10月到现在，基本上天天都有数篇博文更新，内容广泛。而且似乎是原创的。谷歌上搜了几篇，它自己的文章基本是排第一的。可能是多人博客吧。</p> <p>奇怪的是这又好的站点的PR居然是没有<img alt="" src="http://www.zu14.cn/coolemotion/emotions/tu_14.gif"></p><img src ="http://www.cnblogs.com/nankezhishi/aggbug/1510557.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47986/" target="_blank">网易澄清:与暴雪合资公司仅提供技术支持</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>用WordPress一步步建立自己的博客站点</title><link>http://www.cnblogs.com/nankezhishi/archive/2009/06/23/1509723.html</link><dc:creator>南柯之石</dc:creator><author>南柯之石</author><pubDate>Tue, 23 Jun 2009 12:14:00 GMT</pubDate><guid>http://www.cnblogs.com/nankezhishi/archive/2009/06/23/1509723.html</guid><wfw:comment>http://www.cnblogs.com/nankezhishi/comments/1509723.html</wfw:comment><comments>http://www.cnblogs.com/nankezhishi/archive/2009/06/23/1509723.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnblogs.com/nankezhishi/comments/commentRss/1509723.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/nankezhishi/services/trackbacks/1509723.html</trackback:ping><description><![CDATA[<p>刚在自己的电脑上搭起了自己的博客站点。因为网上的不少资料过于陈旧，安装的过程中还是遇到了不少问题的。现在把自己安装的步骤一步步地列出来，希望给最近想建立自己的博客站点的朋友们一些提示。</p>
<p>首先，先在自己的电脑上安装一个网页服务器。我用的是Windows，所以想当然地用IIS了。Apache也是可以的，不过我一向不愿意往自己的电脑装一些多余的东西。Windows自带的东西可以完成任务，那就直接用好了。</p>
<p>安装完之后，你的电脑就是网站了。可以直接用<a href="http://localhost/">http://localhost/</a> 来访问。但是还只能从自己的电脑上访问。如果你是内网用户，那和你一个网段的，也可以用你的内网IP访问你的网站。如果你有固定IP，就可以从Internet用你的IP来访问你的网站了。</p>
<p>但是，如果没有自己的固定IP，又不想花钱买网上的虚拟服务器。（自己建立博客的目的之一就是不想把自己的东西放在别人的电脑上。）就要解决动态域名的问题。花生壳就是做这个用的。</p>
<p>先在<a title="http://www.oray.cn/" href="http://www.oray.cn/">http://www.oray.cn/</a>注册一个账号（Oray护照）。注册完成时，oray会自动根据你的昵称为你生成一个免费的二级域名。比如我的就是<a title="http://nankezhishi.gicp.net/" href="http://nankezhishi.gicp.net/">http://XXXX.gicp.net/</a></p>
<p>然后，从这里<a href="http://www.oray.cn/peanuthull/download.php">http://www.oray.cn/peanuthull/download.php</a>下载花生壳客户端并安装。</p>
<p>登录花生壳，就完成了动态的DNS注册工作。从网上用Oray给你的二级域名就可以访问你的网站了。</p>
<p>硬件问题基本解决了。上<a href="http://wordpress.org/">http://wordpress.org/</a>下载最新WordPress。我用的是2.8版。在它的<a href="http://codex.wordpress.org/Main_Page">Docs</a>页面上，详细介绍了使用WordPress的使用环境和安装步骤，相当的详细。了解到还要安装PHP和MySQL，装吧~~~</p>
<p>参考了一下WebBeta.org上的一篇<a href="http://bloghost.cn/2009/06/08/win2003-iis6-wordpress-mu-installation/">图文并茂的文章</a>，里面介绍了如何安装PHP <br />
和MySQL。下载了php-5.2.10和MySQL-5.1.35。</p>
<p>安装MySQL没有问题，要配置的东西不少，不过基本都用默认配置就OK。安装完成之后，为WordPress建立一个用户和一个数据库。工作就完成了。</p>
<p>然而在安装PHP时发现，这个最新版本的PHP居然没有文中安装步骤上的选项。文中要求选择IIS ISAPI module，不过我的PHP安装项如下，就是没有想要的。</p>
<p><a href="http://images.cnblogs.com/cnblogs_com/nankezhishi/WindowsLiveWriter/98dd613be196_14F32/image1_2.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image1" border="0" alt="image1" src="http://images.cnblogs.com/cnblogs_com/nankezhishi/WindowsLiveWriter/98dd613be196_14F32/image1_thumb.png" width="503" height="396" /></a> </p>
<p>找了半天，感觉最可行的应该是IIS FastCGI。在网上查了一下，这个东西是微软对于PHP的支持的最佳方式，用于取代老式的ISAPI。不过需要下<a href="http://www.iis.net/downloads/default.aspx?tabid=34&amp;g=6&amp;i=1521">载IIS的补丁</a>才能使用。</p>
<p>安装好补丁之后，再次运行PHP的安装，一切顺利。除了安装路径，基本不需要输入什么。只是在组件选择的时候，要注意。在Extensions组件里，要至少选择上MySQL，OpenSSL和Sockets。完全安装当然更没有问题了。</p>
<p>如果不是完全安装，安装完了，先不着急用PHP文件做测试。打开一个CMD窗口。输入&#8220;php -v&#8221;看看能不能出来东西。我安装完之后，测试死活不过，页面只显示有ERROR，又只给个ERROR CODE，我就拿着这个ERROR CODE在网上查啊，查了半天也没有查出解决方案。最后用这个命令发现是少一个DLL~~~我没有完全安装~~~~</p>
<p>都安装好了，就把Wordpress解压出来，在IIS上建立虚拟目录指向这个文件夹。给网站起个别名就可以啦！</p>
<p>访问你的新站点，之后的步骤就是WordPress的了。按要求配置即可。</p>
<p>使用过种中发现几个问题。</p>
<p>１. 固定链接只能用默认的。IIS5.1默认不支持URL Rewrite。有人在Google Code上给了个<a href="http://code.google.com/p/wp-url-rewriting-on-iis/downloads/list">补丁</a>。不过没有试。因为我用别的方式也可以，就是自定义一下。定义成这样就OK了。</p>
<p>/index.php?year=%year%&amp;month=%monthnum%&amp;name=%postname%</p>
<p>虽然也不太好，不过也比默认的ID好啊。</p>
<p>２. 不要把文章删空，不然你的BLOG就无法访问了。</p>
<p>３. 还要安装不少插件。比如WP-PostViews，WordPress.com Stats。使用那个WP-PostViews居然还要改PHP文件~~~~更可恶的是，那个WordPress.com stats插件需要一个API KEY，而申请API KEY要翻墙。以后看博客的stats也要翻墙看~~~~~<img alt="" src="http://www.zu14.cn/coolemotion/emotions/cb_10.gif" /></p><img src ="http://www.cnblogs.com/nankezhishi/aggbug/1509723.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47985/" target="_blank">杰克逊悼念仪式或成史上最大规模Web活动</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>几个.NET方面的问题——参考答案</title><link>http://www.cnblogs.com/nankezhishi/archive/2009/04/18/dotnetquestionsa.html</link><dc:creator>南柯之石</dc:creator><author>南柯之石</author><pubDate>Sat, 18 Apr 2009 08:59:00 GMT</pubDate><guid>http://www.cnblogs.com/nankezhishi/archive/2009/04/18/dotnetquestionsa.html</guid><wfw:comment>http://www.cnblogs.com/nankezhishi/comments/1438777.html</wfw:comment><comments>http://www.cnblogs.com/nankezhishi/archive/2009/04/18/dotnetquestionsa.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnblogs.com/nankezhishi/comments/commentRss/1438777.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/nankezhishi/services/trackbacks/1438777.html</trackback:ping><description><![CDATA[<p><span style="font-family: 宋体">在</span><a href="http://www.cnblogs.com/nankezhishi/archive/2009/04/15/Dotnetquestions.html"><strong><span style="font-family: 宋体"><span>几个</span>.NET</strong><strong><span style="font-family: 宋体">方面的问题</span></strong></a></span><span style="font-family: 宋体">中，列出了几个</span>.NET<span style="font-family: 宋体">方面的问题，但是没有给出问题的答案，因为对于一部分问题我自己也不是很确定。这次只是给出一个参考答案，仅仅作为参考。如有不对的地方，欢迎大家指正。</span></p>
<p>&nbsp;</p>
<p style="text-indent: -18pt; margin: 0cm 0cm 0pt 18pt"><strong><span>1.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">为什么要显式地关闭</span>StreamWriter<span style="font-family: 宋体">？</span></strong></p>
<p style="margin: 0cm 0cm 0pt 18pt"><span style="font-family: 宋体">这个问题可以从《框架设计》</span>P409<span style="font-family: 宋体">找到答案，书上用了专门的一节解释了这个问题。简单来说，因为</span>StreamWriter<span style="font-family: 宋体">在调用</span>Write<span style="font-family: 宋体">方法向</span>Stream<span style="font-family: 宋体">写入数据之后，数据还可能是在</span>StreamWriter<span style="font-family: 宋体">的缓冲区中。如果不显式关闭</span>StreamWriter<span style="font-family: 宋体">，那么数据能否真正写入</span>Stream<span style="font-family: 宋体">中，就要取决于</span>.NET<span style="font-family: 宋体">的</span>GC<span style="font-family: 宋体">先回收</span>Stream<span style="font-family: 宋体">还是先回收</span>StreamWriter<span style="font-family: 宋体">。如果</span>GC<span style="font-family: 宋体">先回收了</span>Stream<span style="font-family: 宋体">，那么在回收</span>StreamWriter<span style="font-family: 宋体">时，</span>StreamWriter<span style="font-family: 宋体">会试图把缓冲区中的数据写入到一个已经关闭的</span>Stream<span style="font-family: 宋体">中，从而发生异常。</span></p>
<p style="text-indent: -18pt; margin: 0cm 0cm 0pt 18pt"><strong><span>2.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">如何正确地重写</span>GetHashCode<span style="font-family: 宋体">方法？</span></strong></p>
<p style="margin: 0cm 0cm 0pt 18pt"><span style="font-family: 宋体">这个问题可以从《框架设计》</span>P123<span style="font-family: 宋体">找到答案，也是用了专门一节讲述这个问题。一个正确的</span>GetHashCode<span style="font-family: 宋体">方法要满足下面的要求：</span></p>
<p style="text-indent: -18pt; margin: 0cm 0cm 0pt 36pt"><span>1.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">与</span>Equals<span style="font-family: 宋体">方法行为一致。如果</span>a<span style="font-family: 宋体">等于</span>b<span style="font-family: 宋体">，则</span>a<span style="font-family: 宋体">的</span>Hash<span style="font-family: 宋体">应该也等于</span>b<span style="font-family: 宋体">的</span>Hash<span style="font-family: 宋体">。</span></p>
<p style="text-indent: -18pt; margin: 0cm 0cm 0pt 36pt"><span>2.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>Hash<span style="font-family: 宋体">值有良好的分布</span> <span style="font-family: 宋体">。</span></p>
<p style="text-indent: -18pt; margin: 0cm 0cm 0pt 36pt"><span>3.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">满足生存期的值稳定性。</span></p>
<p style="text-indent: -18pt; margin: 0cm 0cm 0pt 36pt"><span>4.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">最好要快速。</span></p>
<p style="margin: 0cm 0cm 0pt 18pt"><span style="font-family: 宋体">这么多要求，如果没有写过可能还真一时不好下手，其实只要把与</span>Equals<span style="font-family: 宋体">方法相关的字段的</span>Hash<span style="font-family: 宋体">值异或起来就可以了。</span></p>
<p style="text-indent: -18pt; margin: 0cm 0cm 0pt 18pt"><strong><span>3.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>C#<span style="font-family: 宋体">编译器为什么要用</span>callvirt<span style="font-family: 宋体">指令调用实例的非虚方法？</span></strong></p>
<p style="margin: 0cm 0cm 0pt 18pt"><span style="font-family: 宋体">这个问题也是来源于《框架设计》，作者也很惊讶为什么会这样，不过他只告诉我们这样没有问题，却没有说为什么要这样。</span>P139<span style="font-family: 宋体">里的&#8220;重要提示&#8221;，写到如果一个方法从非虚改成虚方法，如果非虚方法是用</span>call<span style="font-family: 宋体">调用，那么这个更改会造成虚方法被非虚地调用，产生不可知的后果。所以干脆都用</span>callvirt<span style="font-family: 宋体">好了。</span></p>
<p style="margin: 0cm 0cm 0pt 18pt"><span style="font-family: 宋体">我看了一下</span>callvirt<span style="font-family: 宋体">与</span>call<span style="font-family: 宋体">的区别，除了方法调用逻辑有一定不同，</span>callvirt<span style="font-family: 宋体">还会检查变量是否为</span>NULL<span style="font-family: 宋体">，而</span>call<span style="font-family: 宋体">不会。其实</span>call<span style="font-family: 宋体">根本就不能检查，它还要调用静态方法呢，检查谁去？而实例方法，一般是要使用实例字段的，这就要求实例不能为</span>null<span style="font-family: 宋体">，所以用</span>callvirt<span style="font-family: 宋体">顺便检查一下。（其实书中也是想这么解释的，不过书印错了。见下面勘误。）</span></p>
<p style="margin: 0cm 0cm 0pt 18pt"><span style="font-family: 宋体">所以估计是上面两个原因，让</span>C#<span style="font-family: 宋体">团队选择了</span>callvirt<span style="font-family: 宋体">。好处多多。</span></p>
<p style="margin: 0cm 0cm 0pt 18pt">PS<span style="font-family: 宋体">：《框架设计》勘误：</span>P139L3<span style="font-family: 宋体">，&#8220;</span>call<span style="font-family: 宋体">&#8221;应该是&#8220;</span>callvirt<span style="font-family: 宋体">&#8221;。</span></p>
<p style="text-indent: -18pt; margin: 0cm 0cm 0pt 18pt"><strong><span>4.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>Struct<span style="font-family: 宋体">可以继承吗？为什么？可以有虚方法吗？为什么？</span></strong></p>
<p style="margin: 0cm 0cm 0pt 18pt"><span style="font-family: 宋体">不可以继承，因为</span>C#<span style="font-family: 宋体">语法不允许。（我实在不想这么回答，但是也实在找不出为什么。）</span></p>
<p style="margin: 0cm 0cm 0pt 18pt"><span style="font-family: 宋体">也不可以有虚方法，都不能继承，虚个屁。</span></p>
<p style="text-indent: -18pt; margin: 0cm 0cm 0pt 18pt"><strong><span>5.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">什么时候用</span>const<span style="font-family: 宋体">，什么时候用</span>static readonly<span style="font-family: 宋体">？</span></strong></p>
<p style="margin: 0cm 0cm 0pt 18pt"><span style="font-family: 宋体">所有书上都会告诉你</span>const<span style="font-family: 宋体">是编译时常量，</span>readonly<span style="font-family: 宋体">是运行时常量。</span></p>
<p style="margin: 0cm 0cm 0pt 18pt"><span style="font-family: 宋体">但是什么时候用呢？比如你想限制你的程序可以运行的实例的个数为</span>5<span style="font-family: 宋体">，用哪个好像都可以哦，不过最好用</span>static readonly<span style="font-family: 宋体">，因为哪天你可以把这个数改成</span>6<span style="font-family: 宋体">。只要你能改的，就用</span>static readonly<span style="font-family: 宋体">，而不要用</span>const<span style="font-family: 宋体">。什么时候用</span>const<span style="font-family: 宋体">？表示</span>MaxInt, PI, e<span style="font-family: 宋体">光速等等数学常量，亘古不变的量，才用</span>const<span style="font-family: 宋体">。重申一下，个人观点，仅供参考。至于为什么，可以参考</span><a href="http://www.cnblogs.com/VisualStudio/archive/2008/10/16/1312681.html"><span style="font-family: 宋体"><span>这篇文章</span></a></span><span style="font-family: 宋体">。</span></p>
<p style="text-indent: -18pt; margin: 0cm 0cm 0pt 18pt"><strong><span>6.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>C#<span style="font-family: 宋体">为什么要提供析构函数？</span></strong></p>
<p style="margin: 0cm 0cm 0pt 18pt"><span style="font-family: 宋体">一个原因是为了用于方便地释放本地资源（就是非托管资源）。大家补充。</span>^_^</p>
<p style="text-indent: -18pt; margin: 0cm 0cm 0pt 18pt"><strong><span>7.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">有时，程序的</span>Debug Build<span style="font-family: 宋体">可以正常运行，而</span>Release Build<span style="font-family: 宋体">不能。可能是什么原因？</span></strong></p>
<p style="margin: 0cm 0cm 0pt 18pt"><span style="font-family: 宋体">我一想到这个问题的时候，感觉无从下手。天知道为什么！谁知道代码怎么写能写出这么恶心的</span>BUG<span style="font-family: 宋体">出来。其实细想想，同样的代码，</span>Debug Build<span style="font-family: 宋体">可以运行，而</span>Release Build<span style="font-family: 宋体">不能运行。只可能是编译器生产的代码不同。只要知道</span>debug build<span style="font-family: 宋体">和</span>release build<span style="font-family: 宋体">有什么不同，这个问题也就解决了。至于总共有多少不同点，可真是不好说。《框架设计》</span>P387<span style="font-family: 宋体">专门用了一节讲了一个不同&#8212;&#8212;变量的生存期不同。</span>Debug build<span style="font-family: 宋体">为了方便调试，&#8220;将所有变量的生存期扩展到方法结束&#8221;。而</span>release build<span style="font-family: 宋体">中，编译器就不会做这样的事情，这样一个变量就有可能被过早地当作垃圾回收掉了。这就有可能导致</span>debug build<span style="font-family: 宋体">可以正常运行，而</span>release build<span style="font-family: 宋体">不能。具体解释可以参考《框架设计》。</span></p>
<p style="margin: 0cm 0cm 0pt 18pt"><span style="font-family: 宋体">这是个开放式的问题，应该不止这一种情况。欢迎大家补充。</span></p>
<p style="margin: 0cm 0cm 0pt 18pt">&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体">另外又想到了几个问题：</span></p>
<p style="text-indent: -18pt; margin: 0cm 0cm 0pt 18pt"><span>1.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">我们都知道短小的方法，有可能在编译时被编译器内联处理。那么在什么情况下，我们会希望阻止一个方法在编译时被内联？</span></p>
<p style="text-indent: -18pt; margin: 0cm 0cm 0pt 18pt"><span>2.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">在</span>C#<span style="font-family: 宋体">中，有几种方式可以防止一个方法在编译时被内联？</span></p>
<p>&nbsp;</p>
<p>&nbsp;</p> <img src ="http://www.cnblogs.com/nankezhishi/aggbug/1438777.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47984/" target="_blank">《商业周刊》:Mozilla的志愿者开发模式被复制</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>几个.NET方面的问题</title><link>http://www.cnblogs.com/nankezhishi/archive/2009/04/15/Dotnetquestions.html</link><dc:creator>南柯之石</dc:creator><author>南柯之石</author><pubDate>Wed, 15 Apr 2009 14:14:00 GMT</pubDate><guid>http://www.cnblogs.com/nankezhishi/archive/2009/04/15/Dotnetquestions.html</guid><wfw:comment>http://www.cnblogs.com/nankezhishi/comments/1436757.html</wfw:comment><comments>http://www.cnblogs.com/nankezhishi/archive/2009/04/15/Dotnetquestions.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.cnblogs.com/nankezhishi/comments/commentRss/1436757.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/nankezhishi/services/trackbacks/1436757.html</trackback:ping><description><![CDATA[<p><span style="font-family: 宋体;">这几天又拿来《</span>CLR via C#<span style="font-family: 宋体;">》翻看，想了几个</span>.NET<span style="font-family: 宋体;">方面的问题，加上在公司和同事们交流时遇到的问题。大家有兴趣可以看看，能不能回答上来呢？</span></p>  <p>&nbsp;</p>  <p style="margin-left: 18pt; text-indent: -18pt;"><span><span>1.<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: 宋体;">为什么要显式地关闭</span>StreamWriter<span style="font-family: 宋体;">？</span></p>  <p style="margin-left: 18pt; text-indent: -18pt;"><span><span>2.<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: 宋体;">如何正确地重写</span>GetHashCode<span style="font-family: 宋体;">方法？（这个是最简单的）</span></p>  <p style="margin-left: 18pt; text-indent: -18pt;"><span><span>3.<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span>C#<span style="font-family: 宋体;">编译器为什么要用</span>callvirt<span style="font-family: 宋体;">指令调用实例的非虚方法？</span></p>  <p style="margin-left: 18pt; text-indent: -18pt;"><span><span>4.<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span>struct<span style="font-family: 宋体;">可以继承吗？为什么？可以有虚方法吗？为什么？</span></p>  <p style="margin-left: 18pt; text-indent: -18pt;"><span><span>5.<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: 宋体;">什么时候用</span>const<span style="font-family: 宋体;">，什么时候用</span>static readonly<span style="font-family: 宋体;">？他们有什么区别？</span></p>  <p style="margin-left: 18pt; text-indent: -18pt;"><span><span>6.<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span>C#<span style="font-family: 宋体;">为什么要提供析构函数？或者说什么时候用析构函数比较合理？</span></p>  <p style="margin-left: 18pt; text-indent: -18pt;"><span><span>7.<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: 宋体;">有时，程序的</span>Debug Build<span style="font-family: 宋体;">可以正常运行，而</span>Release Build<span style="font-family: 宋体;">不能正常运行。一般可能会是什么原因？</span></p>  <p>&nbsp;</p>  <p><span style="font-family: 宋体;">其中</span>1, 2, 3, 5, 7<span style="font-family: 宋体;">可以在《</span>CLR via C#<span style="font-family: 宋体;">》中分析出答案。其它的&#8230;&#8230;大家讨论讨论吧。尤其是第</span>4<span style="font-family: 宋体;">个问题。可能有人认为这种问题没有意义。语法如此，怎么规定的就怎么用就是了。但是</span>C#或CLR<span style="font-family: 宋体;">团队这么规定一定会有他们的想法，他们的理由，如果不这样一定有什么问题。</span></p><img src ="http://www.cnblogs.com/nankezhishi/aggbug/1436757.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47977/" target="_blank">Mono 的Virtual PC 虚拟机</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>在NSIS中实现安装时取消并回滚（2）——写个线程控制插件实现它</title><link>http://www.cnblogs.com/nankezhishi/archive/2009/04/09/cancelinstallnsis.html</link><dc:creator>南柯之石</dc:creator><author>南柯之石</author><pubDate>Thu, 09 Apr 2009 13:44:00 GMT</pubDate><guid>http://www.cnblogs.com/nankezhishi/archive/2009/04/09/cancelinstallnsis.html</guid><wfw:comment>http://www.cnblogs.com/nankezhishi/comments/1432724.html</wfw:comment><comments>http://www.cnblogs.com/nankezhishi/archive/2009/04/09/cancelinstallnsis.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/nankezhishi/comments/commentRss/1432724.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/nankezhishi/services/trackbacks/1432724.html</trackback:ping><description><![CDATA[<p><span style="font-family: 宋体;">在上一篇</span><a href="http://www.cnblogs.com/nankezhishi/archive/2009/04/08/cancelinstall1.html"><span style="font-family: 宋体;"><span>在</span>NSIS<span style="font-family: 宋体;">中实现安装时取消并回滚（</span>1<span style="font-family: 宋体;">）</span>&#8212;&#8212;<span style="font-family: 宋体;">现状</span></span></a><span style="font-family: 宋体;">中分析了现在</span>NSIS<span style="font-family: 宋体;">对取消安装并回滚功能的支持。结论是目前</span>NSIS<span style="font-family: 宋体;">本身还不支持，需要自己完成这个功能。下面就来介绍一种相对比较简单的实现方式。</span></p>  <p>&nbsp;</p>  <p><span style="font-family: 宋体;">功能难点在上一篇中已经有描述，这里就不赘述了。基本原理就是在安装过程中，使用插件中把后台的释放文件的线程挂起，问用户是不是真要取消安装，是的话就使用安装过程中生成的</span>Log<span style="font-family: 宋体;">文件进行回滚，不是的话就让被挂起的线程继续运行。</span></p>  <p>&nbsp;</p>  <p><span style="font-family: 宋体;">大致要解释如下几个问题</span></p>  <p style="margin-left: 18pt; text-indent: -18pt;"><span><span>1.<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: 宋体;">编写线程控制插件。</span></p>  <p style="margin-left: 18pt; text-indent: -18pt;"><span><span>2.<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: 宋体;">开启安装页面的取消按钮，并自定义取消函数。</span></p>  <p style="margin-left: 18pt; text-indent: -18pt;"><span><span>3.<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: 宋体;">与安装日志功能集成，实现回滚操作。</span></p>  <p>&nbsp;</p>  <p><span style="font-family: 宋体;">首先是实现线程控制插件。这个插件有如下几个功能：</span></p>  <p style="margin-left: 18pt; text-indent: -18pt;"><span><span>1.<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: 宋体;">挂起后台所有线程</span></p>  <p style="margin-left: 18pt; text-indent: -18pt;"><span><span>2.<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: 宋体;">继续后台所有线程</span></p>  <p style="margin-left: 18pt; text-indent: -18pt;"><span><span>3.<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: 宋体;">终止后台所有线程</span></p>  <p>&nbsp;</p>  <p><span style="font-family: 宋体;">为什么是后台？因为</span>UI<span style="font-family: 宋体;">线程要用来弹出一个</span>MessageBox<span style="font-family: 宋体;">让用户点，如果也挂起了，程序就死了。为什么是所有线程呢？因为如果有多个后台线程，如果那个线程不主动配合调查，想要找出哪个线程是用来释放文件似乎不是很容易。简单起见，就全挂起得了，好在不会有什么问题。更好的是，这个安装程序在安装页面只有两个线程，一个</span>UI<span style="font-family: 宋体;">线程，一个后台释放文件。</span></p>  <p>&nbsp;</p>  <p><span style="font-family: 宋体;">还有一点要注意的就是</span>TerminateThread<span style="font-family: 宋体;">函数是异步的。最好多调用一个</span>WaitForSingleObject<span style="font-family: 宋体;">来保证函数返回时，线程的确已经被和谐了才行。（不调似乎也没有什么问题）</span></p>  <p>&nbsp;</p>  <p><span style="font-family: 宋体;">代码就不贴了，可以从<a href="http://files.cnblogs.com/nankezhishi/NSIS/Thread.zip">这里下载</a>。关于如何编写NSIS插件可以参考</span><a id="homepage1_HomePageDays_DaysList_ctl00_DayItem_DayList_ctl02_TitleUrl" href="http://www.cnblogs.com/nankezhishi/archive/2009/04/08/nsisconsoleplugin.html">制作NSIS命令行窗口输出插件</a>这篇文章。<br /></p>  <p>&nbsp;</p>  <p><span style="font-family: 宋体;">然后就是开启安装页面的取消按钮，在上一篇</span><a href="http://www.cnblogs.com/nankezhishi/archive/2009/04/08/cancelinstall1.html"><span style="font-family: 宋体;"><span>在</span>NSIS<span style="font-family: 宋体;">中实现安装时取消并回滚（</span>1<span style="font-family: 宋体;">）</span>&#8212;&#8212;<span style="font-family: 宋体;">现状</span></span></a><span style="font-family: 宋体;">提到的几个帖子有示例的。代码如下：（仅适用于</span>MUI2<span style="font-family: 宋体;">）</span></p>  <p>&nbsp;</p>  <p><span style="color: #00b0f0;">!define</span> MUI_PAGE_CUSTOMFUNCTION_PRE OnInstFilesPagePre <span style="color: #00b050;">;</span><span style="font-family: 宋体; color: #00b050;">必须放在下面的语句前面</span></p>  <p><span style="color: #00b0f0;">!insertmacro </span>MUI_PAGE_INSTFILES</p>  <p>&nbsp;</p>  <p><strong><span style="color: #00b0f0;">Function</span></strong> OnInstFilesPagePre</p>  <p><span>&nbsp;&nbsp;&nbsp; <span style="color: #00b0f0;">GetDlgItem</span> <span style="color: #ffc000;">$0 $HWNDPARENT</span> <span style="color: red;">2</span></span></p>  <p><span>&nbsp;&nbsp;&nbsp; <span style="color: #00b0f0;">EnableWindow</span> <span style="color: #ffc000;">$0</span> <span style="color: red;">1</span></span></p>  <p><strong><span style="color: #00b0f0;">FunctionEnd</span></strong></p>  <p>&nbsp;</p>  <p><span style="font-family: 宋体;">自定义取消函数的代码如下：</span></p>  <p>&nbsp;</p>  <p><span style="color: #00b0f0;">!define</span> MUI_CUSTOMFUNCTION_ABORT OnUserAbort</p>  <p>&nbsp;</p>  <p><strong><span style="color: #00b0f0;">Function</span></strong> OnUserAbort</p>  <p>&#8230;</p>  <p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; nsExec::ExecToLog 'cmd /c copy /Y "<span style="color: #ffc000;">$INSTDIR</span>\install.log" "<span style="color: #ffc000;">$INSTDIR</span>\temp.log"'</span></p>  <p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: #00b0f0;">Call</span> CreateLogFromFile</span></p>  <p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: #00b0f0;">Call</span> RemoveDirectoriesFromLog</span></p>  <p>&#8230;</p>  <p><strong><span style="color: #00b0f0;">FunctionEnd</span></strong></p>  <p>&nbsp;</p>  <p><span style="font-family: 宋体;">函数中给出的代码就是实现回滚操作部分的代码。在调用回滚函数（其实就是卸载时调用的根据日志删除文件的函数）前要把</span>install.log<span style="font-family: 宋体;">复制一份，然后用复制的日志文件进行回滚。为什么要这样呢？因为后台的释放文件的线程被</span>Terminate<span style="font-family: 宋体;">掉了，而就是那个线程打开的日志文件并写入安装日志，线程被和谐的，那么释放文件句柄的代码就不会被执行。说白了就是资源泄露了。后果就是再次打开这个文件的时候会失败，就算是只读也不行。用</span>NSIS<span style="font-family: 宋体;">脚本举个例子。</span></p>  <p>&nbsp;</p>  <p style="text-indent: 20.25pt;"><span><span style="color: #0000ff;">FileOpen </span><span style="color: #ff9900;">$0</span> &#8220;txt.txt&#8221; &#8220;w&#8221;</span></p>  <p style="text-indent: 21pt;"><span style="color: #0000ff;">FileOpen </span><span style="color: #ff9900;">$1</span> &#8220;txt.txt&#8221; &#8220;r&#8221;&nbsp;<span style="color: red;">;</span><span style="font-family: 宋体; color: red;">失败</span></p>  <p>&nbsp;</p>  <p><span style="font-family: 宋体;">第一次打开写，可以正确打开，第二次打开，虽然只读也会失败。但是如果像下面这样两次都是读。两次都是可以成功的。</span></p>  <p>&nbsp;</p>  <p style="text-indent: 21pt;"><span style="color: #0000ff;">FileOpen </span><span style="color: #ff9900;">$0</span> &#8220;txt.txt&#8221; &#8220;r&#8221;</p>  <p style="text-indent: 21pt;"><span style="color: #0000ff;">FileOpen </span><span style="color: #ff9900;">$1</span> &#8220;txt.txt&#8221; &#8220;r&#8221;&nbsp;<span style="color: #00b050;">;</span><span style="font-family: 宋体; color: #00b050;">成功</span></p>  <p>&nbsp;</p>  <p><span style="font-family: 宋体;">上面只列出了功能实现的比较关键的代码。<a href="http://files.cnblogs.com/nankezhishi/NSIS/CancelSetup.zip">完整的代码可以从这里下载</a>。如果要正确编译成安装包，还要<a href="http://files.cnblogs.com/nankezhishi/NSIS/uninstallfromlog.zip">下载这个头文件</a>。</span></p>  <p>&nbsp;</p>  <p><span style="font-family: 宋体;">到此为止，基本在</span>NSIS<span style="font-family: 宋体;">中实现了取消安装并回滚。但是这种实现有下面一些入缺陷。（都快成定律了，解决一个问题，引出三个问题。）</span></p>  <p style="margin-left: 18pt; text-indent: -18pt;"><span><span>1.<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: 宋体;">回滚时</span>install.log<span style="font-family: 宋体;">文件不能被删除。因为在上面已经解释了。</span></p>  <p style="margin-left: 18pt; text-indent: -18pt;"><span><span>2.<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: 宋体;">回滚时，滚动条不回滚。其实应该是可以实现的。大家自己试下吧，应该不难。</span></p>  <p style="margin-left: 18pt; text-indent: -18pt;"><span><span>3.<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: 宋体;">回滚后程序直接退出，而不会显示安装失败页面之类的页面。因为我们的回滚操作就是在</span>User Abort<span style="font-family: 宋体;">里做的嘛。使用</span>User Abort<span style="font-family: 宋体;">的后果就是直接退出了。应该也是有方法绕过去的。</span></p><img src ="http://www.cnblogs.com/nankezhishi/aggbug/1432724.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47970/" target="_blank">19岁天才黑客发布首个iPhone 3GS破解软件</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>在NSIS中实现安装时取消并回滚（1）——现状</title><link>http://www.cnblogs.com/nankezhishi/archive/2009/04/08/cancelinstall1.html</link><dc:creator>南柯之石</dc:creator><author>南柯之石</author><pubDate>Wed, 08 Apr 2009 13:46:00 GMT</pubDate><guid>http://www.cnblogs.com/nankezhishi/archive/2009/04/08/cancelinstall1.html</guid><wfw:comment>http://www.cnblogs.com/nankezhishi/comments/1432016.html</wfw:comment><comments>http://www.cnblogs.com/nankezhishi/archive/2009/04/08/cancelinstall1.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/nankezhishi/comments/commentRss/1432016.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/nankezhishi/services/trackbacks/1432016.html</trackback:ping><description><![CDATA[<p><span style="font-family: 宋体">如果在</span>Google<span style="font-family: 宋体">上搜索</span>&#8221;NSIS Cancel Install&#8221;<span style="font-family: 宋体">会搜索到一些人问过同样的问题。有的从</span>2003<span style="font-family: 宋体">年就已经在问这个问题了。奇怪的是</span>NSIS<span style="font-family: 宋体">一直没有提供取消安装的内置的支持。在安装页面，所有的按钮都是禁用着的。而且看论坛上开发者的回复，也没有意思要在近期加入这个功能。</span></p>
<p><span style="font-family: 宋体">但是问题问题要解决的，总不能用</span>NSIS<span style="font-family: 宋体">开发到一半，发现不能简单地支持取消安装和自动回滚就不用</span>NSIS<span style="font-family: 宋体">开发了。</span>INNO<span style="font-family: 宋体">和</span>MSI<span style="font-family: 宋体">都是内置地支持取消并回滚的，希望</span>NSIS<span style="font-family: 宋体">也能加入这个功能的支持。不过在开发者完成这个功能之前，总要有个临时的解决办法吧。不幸的是，在</span>Google<span style="font-family: 宋体">上搜索了很久，也只能找到各式各样的提问，而没有一个像样的回答。</span></p>
<p><span style="font-family: 宋体">下面总结一下网上现有的资源。</span></p>
<p>&nbsp;</p>
<p><strong><a href="http://forums.winamp.com/showthread.php?postid=2217567">Enable cancel button during install?</a></strong></p>
<p style="text-indent: 21pt"><strong>Afrow UK</strong><strong><span style="font-family: 宋体">回复说：&#8220;</span>You'd need to modify nsisunz to use an asynchronous thread and include a cancel flag.</strong><strong><span style="font-family: 宋体">&#8221;</span></strong>nsisunz<span style="font-family: 宋体">是什么？我也不知道，先不管了，继续找。</span><strong></strong></p>
<p><strong>&nbsp;</strong></p>
<p><strong><a href="http://forums.winamp.com/showthread.php?postid=2096814">Cancel installation</a></strong></p>
<p style="text-indent: 21pt">Red Wine<span style="font-family: 宋体">回复说：&#8220;</span>No possible to enable the cancel button on page InstFiles pre function, because if you do so, the nsisunz plugin refuses to load the zip file.<span style="font-family: 宋体">&#8221;好么，连</span>enable the cancel button<span style="font-family: 宋体">都不行吗？</span></p>
<p>&nbsp;</p>
<p><strong><a href="http://forums.winamp.com/showthread.php?threadid=277190">Cancelling the installation process as it happens</a></strong></p>
<p style="text-indent: 21pt">Darthvader<span style="font-family: 宋体">给出了一个这个问题的</span><a href="https://sourceforge.net/tracker/index.php?func=detail&amp;aid=1219437&amp;group_id=22049&amp;atid=373087"><span style="font-family: 宋体"><span>官方补丁</span></a></span><span style="font-family: 宋体">，很好的样子，不过很快就露馅了&#8212;&#8212;太旧了。</span>Kichik<span style="font-family: 宋体">回复说：&#8220;</span>Abortion isn't the same as the file open problem dialog. Those originate from two different threads. The naive implementation would actually only make it possible to abort in between File commands and not while extracting a big file.<span style="font-family: 宋体">&#8221;看来不太好办啊。这个</span>Kichik<span style="font-family: 宋体">是</span>NSIS<span style="font-family: 宋体">的开发者，按他的说法，就算可以</span>Abort<span style="font-family: 宋体">，也只能按</span>File<span style="font-family: 宋体">指令的个数来取消。也就是说如果你之前用</span>File *.*<span style="font-family: 宋体">来压缩文件，现在可以改成有几个文件要打包就写几个</span>File<span style="font-family: 宋体">指令，在指令间检测是不是要取消安装。是个办法，不过也太恶心了吧。说像</span>Wizou<span style="font-family: 宋体">回复的：&#8220;</span>I was just saying that rather than waiting 6+ months for a new "abort" feature fully implemented, that could be nice to start by having a quick implementation that would be already enough to answer the needs of 90% of NSIS users.<span style="font-family: 宋体">&#8221;最后</span>dmut<span style="font-family: 宋体">说他用</span>Multi-volume_Distribution<span style="font-family: 宋体">插件把这个功能实现，可是没有具体说如何实现的&#8230;&#8230;</span></p>
<p>&nbsp;</p>
<p><strong><a href="http://forums.winamp.com/showthread.php?s=&amp;threadid=160626&amp;highlight=Cancel+Install">Allow user to cancel during install?</a></strong></p>
<p><span>&nbsp;&nbsp;&nbsp; Kichik</span><span style="font-family: 宋体">直截了当地说：&#8220;</span><span style="font-family: 'Verdana','sans-serif'; font-size: 10pt">You can't enable the <span style="color: #620a08">cancel</span> button yet. It was originally planned for v2 but it looks like it will have to wait for 2.1.</span><span style="font-family: 宋体">&#8221;好在那是</span>2003<span style="font-family: 宋体">的事儿的，现在应该有所改观了吧？还说要在</span>v2.1<span style="font-family: 宋体">加入这个功能。现在都</span>2.44<span style="font-family: 宋体">了，还没有看见影呢。</span></p>
<p>&nbsp;</p>
<p><strong><a href="http://forums.winamp.com/showthread.php?s=dbdf794beac53d60ad8477e9abab21df&amp;postid=2505710">How to enable the Cancel Button during install</a></strong></p>
<p><strong><a href="http://forums.winamp.com/showthread.php?threadid=294938">Cancelling during MUI_PAGE_INSTFILES</a></strong></p>
<p><span>&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">这里给出了把</span>INSTFILES<span style="font-family: 宋体">页面里的取消按钮</span>Enable<span style="font-family: 宋体">的方法，和一个让上面提到的方式实现的取消安装。如果这个能满足需要，就将就着用吧。但是要自己写很多代码的。因为取消安装不是取消了就完事儿了，安装过的东西可是要删除干净的，就像是从来没有运行过这个安装程序一样。不过现在的安装包大多数基本上做不到这一点，还要用户给它擦屁股。</span></p>
<p>&nbsp;</p>
<p><strong><a href="http://forums.winamp.com/showthread.php?s=&amp;threadid=296959&amp;highlight=enable+CAncel+button">HOW to enable a cancel button on a uninstall MUI Page</a></strong></p>
<p style="text-indent: 20.25pt"><span style="font-family: 宋体">可怜的人。没有人回答&#8230;&#8230;</span></p>
<p>&nbsp;</p>
<p><strong><a href="http://forums.winamp.com/showthread.php?s=&amp;threadid=277464&amp;highlight=Cancel+Install">Problem with the UMUI cancel button not stopping the install process properly</a></strong></p>
<p><span>&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">不按</span>NSIS<span style="font-family: 宋体">的规矩做事，总是要还的。</span>Cancel<span style="font-family: 宋体">按钮可以启用，但是当对话框弹出来问用户是不是真的要</span>Cancel<span style="font-family: 宋体">的时候，后面的过程还在继续，要是用户点得慢点，没等点</span>OK<span style="font-family: 宋体">，安装就已经结束了！开发者这个汗啊。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体">这些只是网友提问的一部分，记得还有一个帖子给出了开启取消按钮的全部代码。也是遇到了和上面最后一个帖子一样的问题。不过那个帖子死活搜索不到了。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体">不知道</span>NSIS<span style="font-family: 宋体">的作者在研究什么高深的功能，需求这么广泛的取消功能，而且是两个竞争者都已经实现了的功能，却经历了</span>6<span style="font-family: 宋体">年时间还没有做出来。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体">笔者所在项目也是遇到了这样的问题。需求要有取消安装的功能，我们做了，但是后台的安装线程停不下来。上一篇</span><strong><a href="http://www.cnblogs.com/nankezhishi/archive/2009/04/08/nsisconsoleplugin.html"><span style="font-family: 宋体"><span>制作</span>NSIS<span style="font-family: 宋体">命令行窗口输出插件</span></a></span></strong><span style="font-family: 宋体">中我们看到了如何制作一个插件，由于插件是用</span>C++<span style="font-family: 宋体">写的，所以理论上可以在里面做任何想做的事情。下一篇中，我们就将实现一个线程控制的插件。用插件把后台的安装线程停下来，为实现取消安装功能做准备。</span></p><img src ="http://www.cnblogs.com/nankezhishi/aggbug/1432016.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47969/" target="_blank">新浪邮箱大本营粉墨登场！Sina.cn开放注册</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>制作NSIS命令行窗口输出插件</title><link>http://www.cnblogs.com/nankezhishi/archive/2009/04/08/nsisconsoleplugin.html</link><dc:creator>南柯之石</dc:creator><author>南柯之石</author><pubDate>Tue, 07 Apr 2009 16:12:00 GMT</pubDate><guid>http://www.cnblogs.com/nankezhishi/archive/2009/04/08/nsisconsoleplugin.html</guid><wfw:comment>http://www.cnblogs.com/nankezhishi/comments/1431306.html</wfw:comment><comments>http://www.cnblogs.com/nankezhishi/archive/2009/04/08/nsisconsoleplugin.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/nankezhishi/comments/commentRss/1431306.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/nankezhishi/services/trackbacks/1431306.html</trackback:ping><description><![CDATA[<p><span style="font-family: 宋体;">在上一篇中，介绍了如何</span><a href="http://www.cnblogs.com/nankezhishi/archive/2009/04/06/nsiscmdoutput.html"><span style="font-family: 宋体;"><span>让</span>NSIS<span style="font-family: 宋体;">生成的安装包在静默安装时从命令行窗口输出安装信息</span></span></a><span style="font-family: 宋体;">，但是产生了很多问题，于是我们想换一个实现方法，毕竟静默安装时的输出信息并不需要那么多，多了反而让人眼花。静默安装时，只要输出生成还是失败，失败了有个失败原因就可以了。所以另一个解决方案就是自己写个插件，向</span>CMD<span style="font-family: 宋体;">窗口输出一些信息就是了。这篇文章就是要介绍一下如何自己编写这样的一个</span>NSIS<span style="font-family: 宋体;">插件。</span></p>  <p>&nbsp;</p>  <p><span style="font-family: 宋体;">很奇怪的是，</span>NSIS<span style="font-family: 宋体;">的官方网站上居然没有介绍如何自己编写</span>Plugin<span style="font-family: 宋体;">的文章，搜索到在</span>OpenWatcom<a href="http://www.openwatcom.org/index.php/Writing_NSIS_Plugins"><span style="font-family: 宋体;"><span>有<span>一篇</span></span></span></a><span style="font-family: 宋体;">介绍了</span>NSIS<span style="font-family: 宋体;">插件要符合的要求。按照它给出的描述&#8212;&#8212;&#8220;</span><span>NSIS plugins are simply DLLs. The functions provided by these functions are exported functions that have a specific array of parameters. That signature is as follows.</span><span style="font-family: 宋体;">&#8221;</span>NSIS<span style="font-family: 宋体;">插件不过是简单的</span>DLL<span style="font-family: 宋体;">，只要是符合下面参数列表的函数，就会被认为是合法的</span>NSIS<span style="font-family: 宋体;">插件。</span></p>    <p><span>__declspec(dllexport) void __cdecl TestFunc(HWND hwndParent, int string_size, char *variables, stack_t **stacktop)</span></p>  <p>&nbsp;</p>  <p><span style="font-family: 宋体;">好啊。那就照葫芦画瓢写个</span>DLL<span style="font-family: 宋体;">喽。</span>Hello world<span style="font-family: 宋体;">级的。下面是</span>hello.cpp<span style="font-family: 宋体;">的源代码。</span></p>  <div class="cnblogs_code"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000;">#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">windows.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">stdio.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br /><br /></span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;NSISAPI&nbsp;__declspec(dllexport)&nbsp;void&nbsp;__cdecl</span><span style="color: #000000;"><br /><br />NSISAPI&nbsp;TestFunc(HWND&nbsp;hwndParent,&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;string_size,&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">variables,&nbsp;stack_t&nbsp;</span><span style="color: #000000;">**</span><span style="color: #000000;">stacktop)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #800000;">"</span><span style="color: #800000;">Hello</span><span style="color: #800000;">"</span><span style="color: #000000;">);<br />}<br /></span></div>    <p><span style="font-family: 宋体;">很简单吧。用下面的命令编译一下。</span> <br /></p>  <p>CL /LD Hello.cpp</p>  <p>&nbsp;</p>    <p><span style="font-family: 宋体;">编译不过啊！</span> <br /></p>  <p><span>error C2061: syntax error : identifier 'stack_t'</span></p>  <p>&nbsp;</p>  <p>stack_t<span style="font-family: 宋体;">未定义！这让我去哪里找啊？只当是外面的吧。把代码改成下面的样子。</span></p>  <div class="cnblogs_code"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000;">#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">windows.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">stdio.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;NSISAPI&nbsp;__declspec(dllexport)&nbsp;void&nbsp;__cdecl</span><span style="color: #000000;"><br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff;">struct</span><span style="color: #000000;">&nbsp;stack_t;<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />NSISAPI&nbsp;TestFunc(HWND&nbsp;hwndParent,&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;string_size,&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">variables,&nbsp;stack_t&nbsp;</span><span style="color: #000000;">**</span><span style="color: #000000;">stacktop)<br /><img id="Codehighlighter1_197_221_Open_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_197_221_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_197_221_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_197_221_Closed_Text').style.display='inline';" align="top"><img id="Codehighlighter1_197_221_Closed_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" style="display: none;" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_197_221_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_197_221_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_197_221_Open_Text').style.display='inline';" align="top"></span><span id="Codehighlighter1_197_221_Closed_Text" style="border: 1px solid #808080; background-color: #ffffff; display: none;"><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_197_221_Open_Text"><span style="color: #000000;">{<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #800000;">"</span><span style="color: #800000;">Hello</span><span style="color: #800000;">"</span><span style="color: #000000;">);<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000;"><br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div><p>&nbsp;</p>  <p><span style="font-family: 宋体;">这下就过了。把这个</span>DLL<span style="font-family: 宋体;">放到</span>NSIS<span style="font-family: 宋体;">的</span>Plugins<span style="font-family: 宋体;">文件夹中，写一个最简单的</span>NSIS<span style="font-family: 宋体;">脚本测试一下。</span></p>  <p>&nbsp;</p>    <p><strong><span style="color: #0070c0;">OutFile</span></strong> "Test.exe" <br /></p>  <p><strong><span style="color: #0070c0;">Section</span></strong></p>  <p><span><span>&nbsp;&nbsp;&nbsp; </span>Hello::TestFunc</span></p>  <p><strong><span style="color: #0070c0;">SectionEnd</span></strong></p>  <p>&nbsp;</p>    <p><span style="font-family: 宋体;">结果发现脚本</span>Build<span style="font-family: 宋体;">不过啊。错误为&#8220;</span><span style="font-size: 8.5pt; font-family: &quot;Courier New&quot;;">Invalid command: Hello::TestFunc</span><span style="font-family: 宋体;">&#8221;</span> <br /></p>  <p>Command<span style="font-family: 宋体;">找不到。</span></p>  <p>&nbsp;</p>    <p><span style="font-family: 宋体;">看看</span>MakeNSISW<span style="font-family: 宋体;">上完整的输出信息。列出了</span>NSIS<span style="font-family: 宋体;">找到的所有</span>Plugin<span style="font-family: 宋体;">里的可作为</span>Command<span style="font-family: 宋体;">的函数。如下</span> <br /></p>  <p align="left"><span style="font-size: 8.5pt; font-family: &quot;Courier New&quot;;">Processing config: </span></p>  <p align="left"><span style="font-size: 8.5pt; font-family: &quot;Courier New&quot;;">Processing plugin dlls: "D:\Program Files\NSIS\Plugins\*.dll"</span></p>  <p><span style="font-size: 8.5pt; font-family: &quot;Courier New&quot;;">&nbsp;- AdvSplash::show</span></p>  <p><span style="font-family: 宋体;">&#8230;&#8230;</span></p>  <p><span style="font-size: 8.5pt; font-family: &quot;Courier New&quot;;">- Hello::?TestFunc@@YAXPAUHWND__@@HPADPAPAUstack_t@@@Z</span> <br /></p>  <p><span style="font-family: 宋体;">的确是有我们刚加入的</span>DLL<span style="font-family: 宋体;">的，不过函数名不对啊。&#8220;</span>?TestFunc@@YAXPAUHWND__@@HPADPAPAUstack_t@@@Z<span style="font-family: 宋体;">&#8221;怎么会有这么个恶心的函数名？</span></p>  <p>&nbsp;</p>  <p><span style="font-family: 宋体;">也许有人已经猜到了，由于使用的是</span>C++<span style="font-family: 宋体;">，而</span>C++<span style="font-family: 宋体;">是支持函数重载的，但是导出函数表的函数名不能重名啊。所以</span>CL<span style="font-family: 宋体;">在编译</span>C++<span style="font-family: 宋体;">的时候，会自动对函数名进行修饰。这个恶心的名字就是修饰过的函数名。有没有办法不让</span>CL<span style="font-family: 宋体;">修饰呢？一个办法就是告诉</span>CL<span style="font-family: 宋体;">我们的代码是</span>C<span style="font-family: 宋体;">代码，不支持重载，</span>CL<span style="font-family: 宋体;">就不会修饰了。代码再改如下。</span></p>  <div class="cnblogs_code"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000;">#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">windows.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">stdio.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br /><br /></span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;NSISAPI&nbsp;extern&nbsp;"C"&nbsp;__declspec(dllexport)&nbsp;void&nbsp;__cdecl</span><span style="color: #000000;"><br /><br /></span><span style="color: #0000ff;">struct</span><span style="color: #000000;">&nbsp;stack_t;<br /><br />NSISAPI&nbsp;TestFunc(HWND&nbsp;hwndParent,&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;string_size,&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">variables,&nbsp;stack_t&nbsp;</span><span style="color: #000000;">**</span><span style="color: #000000;">stacktop)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #800000;">"</span><span style="color: #800000;">Hello</span><span style="color: #800000;">"</span><span style="color: #000000;">);<br />}<br /></span></div><p>&nbsp;</p>  <p><span style="font-family: 宋体;">再把编译好的</span>DLL<span style="font-family: 宋体;">复制到插件文件夹，再编译</span>Test.nsi<span style="font-family: 宋体;">，这次就编译过了。</span></p>  <p>&nbsp;</p>    <p><span style="font-family: 宋体;">双击运行</span>Test.exe<span style="font-family: 宋体;">，不会看到任何</span>Hello<span style="font-family: 宋体;">，因为</span>printf<span style="font-family: 宋体;">是输出到</span>Console<span style="font-family: 宋体;">的。</span> <br /></p>  <p><span style="font-family: 宋体;">从命令行运行</span>Test.exe<span style="font-family: 宋体;">，也不会在控制台看到</span>&#8221;Hello&#8221;<span style="font-family: 宋体;">，因为这个</span>Test.exe<span style="font-family: 宋体;">是个</span>GUI<span style="font-family: 宋体;">程序，是没有</span>Console<span style="font-family: 宋体;">的</span>Output<span style="font-family: 宋体;">的。寒。那怎么才能有呢？有三个办法，</span>NSIS<span style="font-family: 宋体;">也是都可以做到了。三种方法可以参考我的另一篇文章</span><a href="http://www.cnblogs.com/nankezhishi/archive/2008/11/23/1339254.html"><span style="font-family: 宋体;"><span>让</span>WPF<span style="font-family: 宋体;">窗体程序支持命令行方式运行的三种方式</span></span></a><span style="font-family: 宋体;">。方法是通用的。&#8220;</span>| more<span style="font-family: 宋体;">&#8221;的方法就不用解释了。让</span>NSIS<span style="font-family: 宋体;">生成一个</span>CUI<span style="font-family: 宋体;">程序，可以参考</span><a href="http://www.cnblogs.com/nankezhishi/archive/2009/04/06/nsiscmdoutput.html"><span style="font-family: 宋体;"><span>让</span>NSIS<span style="font-family: 宋体;">生成的安装包在静默安装时从命令行窗口输出安装信息</span></span></a><span style="font-family: 宋体;">，但是这种方法弊端多多，不然也就不会有这篇文章了。最后一种方法就是</span>AttachConsole<span style="font-family: 宋体;">了，这种方法也有不好的地方，不过比较而言，还是可以的。</span></p>  <p>&nbsp;</p>  <p><span style="font-family: 宋体;">这个</span>DLL<span style="font-family: 宋体;">的代码很简单，只实现了最基本的功能，大家有需要可以自己添加。</span></p>  <br /><div class="cnblogs_code"><img id="Code_Closed_Image_000718" onclick="this.style.display='none'; document.getElementById('Code_Closed_Text_000718').style.display='none'; document.getElementById('Code_Open_Image_000718').style.display='inline'; document.getElementById('Code_Open_Text_000718').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" align="top" width="11" height="16"><img id="Code_Open_Image_000718" style="display: none;" onclick="this.style.display='none'; document.getElementById('Code_Open_Text_000718').style.display='none'; getElementById('Code_Closed_Image_000718').style.display='inline'; getElementById('Code_Closed_Text_000718').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top" width="11" height="16"><span id="Code_Closed_Text_000718" class="cnblogs_code_Collapse">NSIS Console Plugin</span><span id="Code_Open_Text_000718" style="display: none;"><br /><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000;">#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">windows.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">stdio.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff;">#pragma</span><span style="color: #000000;">&nbsp;comment&nbsp;(lib,&nbsp;"user32.lib")</span><span style="color: #000000;"><br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff;">#pragma</span><span style="color: #000000;">&nbsp;comment&nbsp;(lib,&nbsp;"kernel32.lib")</span><span style="color: #000000;"><br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;NSISAPI&nbsp;extern&nbsp;"C"&nbsp;__declspec(dllexport)&nbsp;void&nbsp;__cdecl</span><span style="color: #000000;"><br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />HANDLE&nbsp;hOutput;<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><br /><img id="Codehighlighter1_219_266_Open_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_219_266_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_219_266_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_219_266_Closed_Text').style.display='inline';" align="top"><img id="Codehighlighter1_219_266_Closed_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" style="display: none;" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_219_266_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_219_266_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_219_266_Open_Text').style.display='inline';" align="top">typedef&nbsp;</span><span style="color: #0000ff;">struct</span><span style="color: #000000;">&nbsp;_stack_t&nbsp;</span><span id="Codehighlighter1_219_266_Closed_Text" style="border: 1px solid #808080; background-color: #ffffff; display: none;"><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_219_266_Open_Text"><span style="color: #000000;">{<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff;">struct</span><span style="color: #000000;">&nbsp;_stack_t&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">next;<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">&nbsp;text[</span><span style="color: #800080;">1024</span><span style="color: #000000;">];<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000;">&nbsp;stack_t;<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />NSISAPI&nbsp;Attach(HWND&nbsp;hwndParent,&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;string_size,&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">variables,&nbsp;stack_t&nbsp;</span><span style="color: #000000;">**</span><span style="color: #000000;">stacktop)<br /><img id="Codehighlighter1_364_497_Open_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_364_497_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_364_497_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_364_497_Closed_Text').style.display='inline';" align="top"><img id="Codehighlighter1_364_497_Closed_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" style="display: none;" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_364_497_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_364_497_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_364_497_Open_Text').style.display='inline';" align="top"></span><span id="Codehighlighter1_364_497_Closed_Text" style="border: 1px solid #808080; background-color: #ffffff; display: none;"><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_364_497_Open_Text"><span style="color: #000000;">{<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(AttachConsole(</span><span style="color: #000000;">-</span><span style="color: #800080;">1</span><span style="color: #000000;">)&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #800080;">0</span><span style="color: #000000;">)<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #800000;">"</span><span style="color: #800000;">failed&nbsp;to&nbsp;attach&nbsp;parent&nbsp;console.</span><span style="color: #800000;">"</span><span style="color: #000000;">);<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;"><br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;hOutput&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;GetStdHandle(STD_OUTPUT_HANDLE);<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000;"><br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />NSISAPI&nbsp;Show(HWND&nbsp;hwndParent,&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;string_size,&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">variables,&nbsp;stack_t&nbsp;</span><span style="color: #000000;">**</span><span style="color: #000000;">stacktop)<br /><img id="Codehighlighter1_583_730_Open_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_583_730_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_583_730_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_583_730_Closed_Text').style.display='inline';" align="top"><img id="Codehighlighter1_583_730_Closed_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" style="display: none;" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_583_730_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_583_730_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_583_730_Open_Text').style.display='inline';" align="top"></span><span id="Codehighlighter1_583_730_Closed_Text" style="border: 1px solid #808080; background-color: #ffffff; display: none;"><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_583_730_Open_Text"><span style="color: #000000;">{<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(hOutput&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;NULL)<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;printf((</span><span style="color: #000000;">*</span><span style="color: #000000;">stacktop)</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">text);<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;"><br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;WriteConsole(hOutput,&nbsp;(</span><span style="color: #000000;">*</span><span style="color: #000000;">stacktop)</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">text,&nbsp;strlen((</span><span style="color: #000000;">*</span><span style="color: #000000;">stacktop)</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">text),&nbsp;NULL,&nbsp;NULL);<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000;"><br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span></span></div><p>&nbsp;</p>  <p><span style="font-family: 宋体;">参考文献：</span><strong><span><a href="http://www.codeproject.com/KB/dialog/ConsoleAdapter.aspx?display=Print">Writing to and read from the console - From a GUI application using the same cout/cin and printf/scanf</a></span></strong></p><img src ="http://www.cnblogs.com/nankezhishi/aggbug/1431306.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47969/" target="_blank">新浪邮箱大本营粉墨登场！Sina.cn开放注册</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>让NSIS生成的安装包在静默安装时从命令行窗口输出安装信息</title><link>http://www.cnblogs.com/nankezhishi/archive/2009/04/06/nsiscmdoutput.html</link><dc:creator>南柯之石</dc:creator><author>南柯之石</author><pubDate>Mon, 06 Apr 2009 14:52:00 GMT</pubDate><guid>http://www.cnblogs.com/nankezhishi/archive/2009/04/06/nsiscmdoutput.html</guid><wfw:comment>http://www.cnblogs.com/nankezhishi/comments/1430544.html</wfw:comment><comments>http://www.cnblogs.com/nankezhishi/archive/2009/04/06/nsiscmdoutput.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/nankezhishi/comments/commentRss/1430544.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/nankezhishi/services/trackbacks/1430544.html</trackback:ping><description><![CDATA[<p><span style="font-family: 宋体">静默安装就是安装时不显示</span>UI<span style="font-family: 宋体">，只显示一个</span>CMD<span style="font-family: 宋体">窗口，并用命令行传递安装时需要的参数。心想静默安装怎么地安装完了得有个结果显示出来吧，结果</span>NSIS<span style="font-family: 宋体">制作的安装包真是彻底静默了，命令执行之后立马返回了，而且一行信息也没有显示出来，要不是到安装目录下自己看看，天知道安装成功没有？在</span><a href="http://forums.winamp.com/showthread.php?threadid=282131">Winamp<span style="font-family: 宋体"><span>的论坛上</span></a></span><span style="font-family: 宋体">，已经有人问过同样的问题，结论是要使用下面的参数重新编译</span>NSIS<span style="font-family: 宋体">的源代码，才能把安装时的详细信息在静默安装时显示在</span>CMD<span style="font-family: 宋体">窗口上。</span></p>
<p>&nbsp;</p>
<p>NSIS_CONFIG_LOG_STDOUT=yes</p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体">当然，要启用</span>Log<span style="font-family: 宋体">功能，还要有下面的编译参数：</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 'Verdana','sans-serif'; font-size: 10pt">NSIS_CONFIG_LOG=yes</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体; font-size: 10pt">结合起来也就是要使用下面的编译指令重新编译</span><span style="font-family: 'Verdana','sans-serif'; font-size: 10pt">NSIS</span><span style="font-family: 宋体; font-size: 10pt">的源代码。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 'Verdana','sans-serif'; font-size: 10pt">scons NSIS_CONFIG_LOG=yes NSIS_CONFIG_LOG_STDOUT=yes</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体; font-size: 10pt">编译完成之后，在源代码的根目录下，会多出一个</span><span style="font-family: 'Verdana','sans-serif'; font-size: 10pt">build</span><span style="font-family: 宋体; font-size: 10pt">目录，复制下面几个文件到你安装的</span><span style="font-family: 'Verdana','sans-serif'; font-size: 10pt">NSIS</span><span style="font-family: 宋体; font-size: 10pt">的目录下，覆盖相应文件。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 'Verdana','sans-serif'; font-size: 10pt">Build"release"makensis"makensis.exe</span></p>
<p><span style="font-family: 'Verdana','sans-serif'; font-size: 10pt">Build"release"Makensisw"makensisw.exe</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体; font-size: 10pt">把几个</span><span style="font-family: 'Verdana','sans-serif'; font-size: 10pt">stub</span><span style="font-family: 宋体; font-size: 10pt">开头的几个文件夹中的可执行文件，覆盖</span><span style="font-family: 'Verdana','sans-serif'; font-size: 10pt">NSIS</span><span style="font-family: 宋体; font-size: 10pt">安装目录下</span><span style="font-family: 'Verdana','sans-serif'; font-size: 10pt">stubs</span><span style="font-family: 宋体; font-size: 10pt">里的相应文件，这时需要重命名一下的。规则就不描述了，比较一下就能知道了。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体; font-size: 10pt">经过测试，用重新编译过的</span><span style="font-family: 'Verdana','sans-serif'; font-size: 10pt">NSIS</span><span style="font-family: 宋体; font-size: 10pt">生成的安装包文件，可以在静默安装时把原来显示在</span><span style="font-family: 'Verdana','sans-serif'; font-size: 10pt">GUI</span><span style="font-family: 宋体; font-size: 10pt">窗口中的安装信息显示在</span><span style="font-family: 'Verdana','sans-serif'; font-size: 10pt">CMD</span><span style="font-family: 宋体; font-size: 10pt">窗口中。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体; font-size: 10pt">但是会有新的问题！主要有三个，前两个是我测试时发现的，最后一个是</span><span style="font-family: 'Verdana','sans-serif'; font-size: 10pt">NSIS</span><span style="font-family: 宋体; font-size: 10pt">的开发者在论坛上自己坦白的。</span></p>
<p style="text-indent: -18pt; margin: 0cm 0cm 0pt 18pt"><span style="font-family: 'Verdana','sans-serif'; font-size: 10pt">1.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体; font-size: 10pt">这样生成的安装包事实上是一个带有</span><span style="font-family: 'Verdana','sans-serif'; font-size: 10pt">GUI</span><span style="font-family: 宋体; font-size: 10pt">窗口的</span><span style="font-family: 'Verdana','sans-serif'; font-size: 10pt">CUI</span><span style="font-family: 宋体; font-size: 10pt">程序，这样在安装和卸载时都会带有一个</span><span style="font-family: 'Verdana','sans-serif'; font-size: 10pt">CMD</span><span style="font-family: 宋体; font-size: 10pt">黑窗口在后面，很不好看。</span></p>
<p style="text-indent: -18pt; margin: 0cm 0cm 0pt 18pt"><span style="font-family: 'Verdana','sans-serif'; font-size: 10pt">2.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体; font-size: 10pt">由于是把</span><span style="font-family: 'Verdana','sans-serif'; font-size: 10pt">LOG</span><span style="font-family: 宋体; font-size: 10pt">到文件的输出，重定向到了</span><span style="font-family: 'Verdana','sans-serif'; font-size: 10pt">CUI</span><span style="font-family: 宋体; font-size: 10pt">程序的</span><span style="font-family: 'Verdana','sans-serif'; font-size: 10pt">STDOUT</span><span style="font-family: 宋体; font-size: 10pt">，原本应该生成的</span><span style="font-family: 'Verdana','sans-serif'; font-size: 10pt">install.log</span><span style="font-family: 宋体; font-size: 10pt">文件没有生成出来。这同时会给基于安装日志的卸载带来不利影响。</span></p>
<p style="text-indent: -18pt; margin: 0cm 0cm 0pt 18pt"><span style="font-family: 'Verdana','sans-serif'; font-size: 10pt">3.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体; font-size: 10pt">一部分插件的输出，由于和</span><span style="font-family: 'Verdana','sans-serif'; font-size: 10pt">NSIS</span><span style="font-family: 宋体; font-size: 10pt">本身的输出机制不是很和谐（就是插件开发者没有使用</span><span style="font-family: 'Verdana','sans-serif'; font-size: 10pt">NSIS</span><span style="font-family: 宋体; font-size: 10pt">自身的输出机制，非要自己写一个）并不能把安装信息输出到</span><span style="font-family: 'Verdana','sans-serif'; font-size: 10pt">CMD</span><span style="font-family: 宋体; font-size: 10pt">窗口。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体; font-size: 10pt">从理论上讲，这几个问题都是可以解决的，但是不是靠几个简单的编译选项就能搞定的了。应该是需要修改</span><span style="font-family: 'Verdana','sans-serif'; font-size: 10pt">NSIS</span><span style="font-family: 宋体; font-size: 10pt">的源代码，而且</span><span style="font-family: 'Verdana','sans-serif'; font-size: 10pt">NSIS</span><span style="font-family: 宋体; font-size: 10pt">的</span><span style="font-family: 'Verdana','sans-serif'; font-size: 10pt">License</span><span style="font-family: 宋体; font-size: 10pt">也是允许你这样做，只要你不找</span><span style="font-family: 'Verdana','sans-serif'; font-size: 10pt">NSIS</span><span style="font-family: 宋体; font-size: 10pt">的原开发者什么麻烦。不过解决一个问题，引出三个问题要解决，似乎有点&#8230;&#8230;要是解决那三个问题再引出九个问题可如何是好啊？</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体; font-size: 10pt">所以至于如何改，还没有研究出来。以后有需求再说吧。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体; font-size: 10pt">关于如何编译</span><span style="font-family: 'Verdana','sans-serif'; font-size: 10pt">NSIS</span><span style="font-family: 宋体; font-size: 10pt">的源代码，可以参考我的另一篇文章&#8212;&#8212;</span><span style="font-family: 'Verdana','sans-serif'; font-size: 10pt"><a href="http://www.cnblogs.com/nankezhishi/archive/2009/04/05/buildnsis.html"><span style="font-family: 宋体">在</span>VS2008<span style="font-family: 宋体">环境下使用</span>Scons<span style="font-family: 宋体">编译</span>NSIS</a></span><span style="font-family: 宋体; font-size: 10pt">。</span></p> <img src ="http://www.cnblogs.com/nankezhishi/aggbug/1430544.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47968/" target="_blank">IE市场份额首次跌破60%</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>苏州、周庄两日游记</title><link>http://www.cnblogs.com/nankezhishi/archive/2009/04/06/1430338.html</link><dc:creator>南柯之石</dc:creator><author>南柯之石</author><pubDate>Mon, 06 Apr 2009 08:59:00 GMT</pubDate><guid>http://www.cnblogs.com/nankezhishi/archive/2009/04/06/1430338.html</guid><wfw:comment>http://www.cnblogs.com/nankezhishi/comments/1430338.html</wfw:comment><comments>http://www.cnblogs.com/nankezhishi/archive/2009/04/06/1430338.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnblogs.com/nankezhishi/comments/commentRss/1430338.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/nankezhishi/services/trackbacks/1430338.html</trackback:ping><description><![CDATA[<p><span style="font-family: 宋体;">清明节放三天假，本来想去黄山。可是黄山的旅店都订不到，就改去了苏州。开始了苏州被宰的经历。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体;">本来是没有报团的，想自己到苏州想去什么地方去什么地方，可是一到苏州就下着小雨。找起公交车实在是麻烦。就在火车站旁边报了一个团。本来计划好的路线也被破坏了。改成了去北寺塔，水上游苏州，枫桥和虎丘。商量好地点之后忘了最重要的一步&#8212;&#8212;砍价，直到一天玩完了，才发现原价</span>105<span style="font-family: 宋体;">元</span>/<span style="font-family: 宋体;">人付了钱才感觉不太对。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体;">第一个，北寺塔。一塔，一庙而已，门票</span>25<span style="font-family: 宋体;">元。面积非常小，离火车站也最近，也是最没有意思的。跟团走还害中午饭都没有吃好。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体;">第二个，水上游苏州。就是在苏州的护城河里打个弯。时间大约有</span>30<span style="font-family: 宋体;">分钟吧。导游的解说还是不错的，如果只是在船上兜一圈的确没有什么意思。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体;">上岸时，还附赠了一个旅游项目。苏州某真丝纺织单位的展览。虽说心知肚明是导游和单位串通好的推销产品，但是里面的介绍也还是不错了，了解了蚕的生长过程、抽丝剥茧的过程、缫丝机、真丝被的制作和真丝被的鉴别。当然目前就是推销他们的裤子，基本每床在</span>500<span style="font-family: 宋体;">左右。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体;">然后就是枫桥，去了才知道，原来枫桥和寒山寺是两个景点，要去寒山寺要自己再出钱（而且时间根本就不允许）！枫桥景区还是满小的，可看的东西也不多，最后带我们坐了</span>2<span style="font-family: 宋体;">分钟的船就又上了岸，很是无聊。景区里吃的也不多，有个龙须糖还是值得一吃的。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体;">然后又是珍珠单位的销售游，一句话，如果你不是钱多得没处花，就别在这里买了。东西比超市里更贵。基本和火车站是一个价钱。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体;">之后就</span>OK<span style="font-family: 宋体;">了。虎丘呢？不好意思，天气不好，没有看到。连门都没有让进，就是在门口大马路上飘了一下。这才发现</span>105<span style="font-family: 宋体;">实在是太不值了，更重要的是没有砍价。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体;">之后当天下午就赶赴周庄了，因为晚上</span>7<span style="font-family: 宋体;">点之后周庄是不要门票的，门票可要</span>100<span style="font-family: 宋体;">啊。到了周庄才知道重要的不是门票，是根本没有地方住。司机就说白天景区是人挤人。晚上更是住的地方都没有，不少人都是在宾馆的走廊里打地铺的。景区里的小客栈都会要价</span>300<span style="font-family: 宋体;">，更不要说带星的宾馆了。吸取了白天的教训，宁可露宿街头，也要砍价到底。找了个</span>100<span style="font-family: 宋体;">元的阁楼睡了。代价是晚饭要在老板的酒店里吃。本想反正要吃，在哪儿都行。结果又错了。</span></p>
<p><span style="font-family: 宋体;">看到这个酒楼提供周庄的招牌菜&#8220;万三蹄&#8221;和&#8220;阿婆菜&#8221;，就点了，吃了之后发现实在是大失所望。万三蹄，在我看来就是酱油蹄多加糖，而且炖得一点儿都不烂。所谓的阿婆菜就是咸菜，而且这咸菜是浓烈的防腐剂的气味，而且是我吃过的防腐剂味最大的一次。吃了一口，就不再吃了。想想那个酒店的万三蹄应该不是正宗，也许正宗的好些。不过已经没有兴趣再试了。说实在的，我这个不会做饭的，从自己家里学了个炖排骨。第一次做的排骨</span>GF<span style="font-family: 宋体;">都说比这个万三蹄好吃。</span></p>
<p>&nbsp;</p>
<p><strong><span style="font-family: 宋体;">再好吃的东西，一旦量产，就不是那么回事儿了。</span></strong><span style="font-family: 宋体;">就像奶油，几乎所有的面包、蛋糕、饼干、奶茶、黄油的成份都写着含有奶油。但</span>99.9%<span style="font-family: 宋体;">都是人造奶油。不但不好吃，还有害健康。为什么是人造的？因为奶油的需求太大了，全用真正的奶油根本就不可能，只能人造。地球人太多了，没有办法&#8230;&#8230;万三蹄也一样，就算是正宗的，相信也已经不是那个味了。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体;">第二天</span>7<span style="font-family: 宋体;">：</span>15<span style="font-family: 宋体;">就出发了，直到庄上的时候，检票的人还没有上班呢。呵呵。早晨人也少，拍照就会很方便。可以没有门票，很多园子都是进不去的，只能在大街上到处转，转来转发现和逛街没有什么两样，到处都是商铺。不过有些还是满独特的。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体;">早晨的早饭就是豆花</span>+<span style="font-family: 宋体;">油条，豆花没有北方的好吃，油条还是冷的。吃起来很没有感觉。还有炸的小鱼，腥味很大。臭豆腐也没有什么特别的，到哪里都有的卖。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体;">仔细找的话，应该能找到不少馆的，没有票也可以进去。有讲中医史的，有陈逸飞的故居，有讲捕鱼和风土的，有讲烧窑和酿酒的。说实在的，如果没有这些，周庄就是一商业街。只不过建筑风格比较别致罢了。当然既然是旅游嘛，就别好像看破红尘似的，看什么都是不过如此，而到哪儿旅游都不会有意思，还是出家当和尚好了。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体;">刚到</span>11<span style="font-family: 宋体;">点，人就已经很多了，一上午也已经把周庄转遍了，打道回府了。外面有人力三轮车，去汽车站要价</span>10<span style="font-family: 宋体;">元，可以砍到</span>5<span style="font-family: 宋体;">元的。摩托车也有，不敢坐而已。到了汽车站，才中午，就已经没有回上海的票了，到昆山车的车才回到的上海。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体;">总结一下：</span>&nbsp;</p>  <p>&nbsp;&nbsp;&nbsp; 1. <span style="font-family: 宋体;">尽量避开公共的假期旅游，不然住的地方都找不到实在是很麻烦的。</span></p>  <p>&nbsp;&nbsp;&nbsp; 2.&nbsp; <span style="font-family: 宋体;">最好把酒店订好，行程安排好，至于天气只能听天由命了。<strong>天气预报严重不可信。</strong></span>4<span style="font-family: 宋体;">月</span>4<span style="font-family: 宋体;">日之前，我连续关注了</span>5<span style="font-family: 宋体;">天的中央的天气预报，一天一个样。从</span>3<span style="font-family: 宋体;">月</span>30<span style="font-family: 宋体;">日到</span>4<span style="font-family: 宋体;">月</span>3<span style="font-family: 宋体;">日共</span>5<span style="font-family: 宋体;">天中，对</span>4<span style="font-family: 宋体;">月</span>4<span style="font-family: 宋体;">日的天气预报如下：</span></p>  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="font-family: 宋体;">中雨</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="font-family: 宋体;">大雨</span>&nbsp;&nbsp;&nbsp;&nbsp; <span style="font-family: 宋体;">暴雨</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="font-family: 宋体;">小雨</span>&nbsp; &nbsp; &nbsp;&nbsp; <span style="font-family: 宋体;">阵雨</span></p>  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong><span style="font-family: 宋体;">从实际情况来看，只有</span>4<span style="font-family: 宋体;">月</span>3<span style="font-family: 宋体;">日的天气预报是准的，暴布汗。</span></strong></p>  <p>&nbsp;&nbsp;&nbsp;&nbsp; 3.&nbsp; <span style="font-family: 宋体;">特产要找正宗的。可能还过得去。</span></p>  <p>&nbsp;&nbsp;&nbsp;&nbsp; 4.&nbsp; <span style="font-family: 宋体;">不要轻信导游带着去的购物的地方。如果时间足够，不要参团，玩得才开心。</span></p><img src ="http://www.cnblogs.com/nankezhishi/aggbug/1430338.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47968/" target="_blank">IE市场份额首次跌破60%</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>在VS2008环境下使用Scons编译NSIS</title><link>http://www.cnblogs.com/nankezhishi/archive/2009/04/05/buildnsis.html</link><dc:creator>南柯之石</dc:creator><author>南柯之石</author><pubDate>Sun, 05 Apr 2009 13:42:00 GMT</pubDate><guid>http://www.cnblogs.com/nankezhishi/archive/2009/04/05/buildnsis.html</guid><wfw:comment>http://www.cnblogs.com/nankezhishi/comments/1429970.html</wfw:comment><comments>http://www.cnblogs.com/nankezhishi/archive/2009/04/05/buildnsis.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/nankezhishi/comments/commentRss/1429970.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/nankezhishi/services/trackbacks/1429970.html</trackback:ping><description><![CDATA[<p><span style="font-family: 宋体">花了一个晚上的时间好不容易把</span>NSIS<span style="font-family: 宋体">的源代码编译过了，设置环境真是不容易啊。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体">首先解释一下为什么要编译</span>NSIS<span style="font-family: 宋体">的源代码，因为有时要修改</span>NSIS<span style="font-family: 宋体">的设置，比如让</span>NSIS<span style="font-family: 宋体">支持</span>LOGGING<span style="font-family: 宋体">啊，加大字符串长度，虽然这两个在网站上有下载编译好的，但是如果有别的设置要更改呢？如果要</span><a href="http://www.openwatcom.org/index.php/Writing_NSIS_Plugins"><span style="font-family: 宋体"><span>自己写个插件</span><span style="font-family: 宋体">扫</span><span style="font-family: 宋体">描器</span></a></span><span style="font-family: 宋体">呢？都要把</span>NSIS<span style="font-family: 宋体">的源代码重新编译一遍。很不可理解。不过目前也只能这样。</span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体">根据</span><a href="http://nsis.sourceforge.net/Docs/AppendixG.html"><span style="font-family: 宋体"><span>文档</span></a></span><span style="font-family: 宋体">上的要求，编译</span>NSIS<span style="font-family: 宋体">要有</span>Python<span style="font-family: 宋体">和</span>Scons<span style="font-family: 宋体">。下吧。</span>Python<span style="font-family: 宋体">的最新版是</span>3.0.1<span style="font-family: 宋体">，</span>Scons<span style="font-family: 宋体">的最新版是</span>1.2.0<span style="font-family: 宋体">。都下来最新版，安装好了，按文档上的要求，在源代码所在目录下输入&#8220;</span>scons<span style="font-family: 宋体">&#8221;，结果</span>CMD<span style="font-family: 宋体">不认为这是个命令。估计是环境变量没有自动设置好。好不容易找到这个</span>scons<span style="font-family: 宋体">，不太敢相信，原来就是一个</span>bat<span style="font-family: 宋体">，在</span>bat<span style="font-family: 宋体">里调用了</span>python<span style="font-family: 宋体">的代码。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体">把</span>Python<span style="font-family: 宋体">和</span>Python"scipts<span style="font-family: 宋体">都加到环境变量</span>PATH<span style="font-family: 宋体">里，</span>OK<span style="font-family: 宋体">。</span>Scons<span style="font-family: 宋体">认识了，还是不过，报语法错误，是</span>python<span style="font-family: 宋体">解释器报的一个</span>py<span style="font-family: 宋体">文件的语法错误。心想有可能是自己的</span>Python<span style="font-family: 宋体">太新了，</span>Python 3<span style="font-family: 宋体">和</span>Python 2<span style="font-family: 宋体">的语法还是有一定差别的。不过这年头</span>Python 3.1<span style="font-family: 宋体">都快发布了，</span>scons<span style="font-family: 宋体">还要用</span>2.x<span style="font-family: 宋体">的版本？到</span>scons<span style="font-family: 宋体">的</span><a href="http://www.scons.org/doc/1.2.0/HTML/scons-user/c95.html#AEN102"><span style="font-family: 宋体"><span>网站</span></a></span><span style="font-family: 宋体">上看看，的确也说了&#8220;</span>SCons will work with any version of Python from 1.5.2 or later.<span style="font-family: 宋体">&#8221;那</span>3.0.1<span style="font-family: 宋体">应该是可以的吧。不过还是报着一线希望，又安装</span>Python 2.6.1<span style="font-family: 宋体">。实践证明</span>scons1.2.0<span style="font-family: 宋体">的确还不支持</span>Python 3<span style="font-family: 宋体">。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体">现在不报</span>py<span style="font-family: 宋体">的语法错误了，改报</span>NSIS<span style="font-family: 宋体">源代码的编译错误了，说</span>XXXX.lib<span style="font-family: 宋体">或是说</span>xxx.h<span style="font-family: 宋体">报不到。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体">估计又是哪个环境变量没有设置，这个环境变量也不是自己能</span>YY<span style="font-family: 宋体">的，就上网找。在</span>WinAmp<span style="font-family: 宋体">的</span><a href="http://forums.winamp.com/printthread.php?s=1457fa56d149936d2b7240fec8218e5d&amp;threadid=293456"><span style="font-family: 宋体"><span>论坛上</span></a></span><span style="font-family: 宋体">找到了有人有相同的问题，从后面的讨论可以看出的确是环境变量的问题，而且已经有人作为</span>BUG<span style="font-family: 宋体">报给了</span>scons<span style="font-family: 宋体">，说文件应该自动找到的呀，</span>scons<span style="font-family: 宋体">也很高效，马上就在</span><a href="http://scons.tigris.org/issues/show_bug.cgi?id=2224">Bug Trace<span style="font-family: 宋体"><span>的网站</span></a></span><span style="font-family: 宋体">上回复了临时解决办法&#8212;&#8212;改改</span>scons<span style="font-family: 宋体">的源代码就行了。汗颜&#8230;&#8230;好在</span>scons<span style="font-family: 宋体">是用解释型语言编写的，改完了不要重新编译。解决方法如下：</span></p>
<p>&nbsp;</p>
<p>Index: src/engine/SCons/Tool/msvc.py</p>
<p>===================================================================</p>
<p>--- src/engine/SCons/Tool/msvc.py (revision 3756)</p>
<p>+++ src/engine/SCons/Tool/msvc.py<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (working copy)</span></p>
<p>@@ -554,7 +554,9 @@</p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp; # base installation from the registry and deduce the default</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp; # directories.</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp; version_num, suite = SCons.Tool.msvs.msvs_parse_version(version)</span></p>
<p>-<span>&nbsp;&nbsp;&nbsp; if version_num &gt;= 8.0:</span></p>
<p>+<span>&nbsp;&nbsp;&nbsp; if version_num &gt;= 9.0:</span></p>
<p>+<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return (os.environ['INCLUDE'], os.environ['LIB'], os.environ['PATH'])</span></p>
<p>+<span>&nbsp;&nbsp;&nbsp; elif version_num &gt;= 8.0:</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; suite = SCons.Tool.msvs.get_default_visualstudio8_suite(env)</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; defpaths = _get_msvc8_default_paths(env, version, suite, use_mfc_dirs)</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp; elif version_num &gt;= 7.0:</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体">其实说白了就是</span>scons<span style="font-family: 宋体">还不支持</span>VS2008<span style="font-family: 宋体">，只支持</span>VS2005<span style="font-family: 宋体">。开发者也表示会在</span>1.3<span style="font-family: 宋体">版中提供</span>VS2008<span style="font-family: 宋体">的支持&#8212;&#8212;天知道</span>1.3<span style="font-family: 宋体">什么时候发布，看样子是要在</span>VS2010<span style="font-family: 宋体">之后了。如果不是很明白上面的文件</span>DIFF<span style="font-family: 宋体">的结果可以去</span><a href="http://scons.tigris.org/issues/show_bug.cgi?id=2224"><span style="font-family: 宋体"><span>网站</span></a></span><span style="font-family: 宋体">上看，其实一样的。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体">从解决方案中可以看到，还要设置两个环境变量&#8220;</span>INCLUDE<span style="font-family: 宋体">&#8221;和&#8220;</span>LIB<span style="font-family: 宋体">&#8221;，分别设置为</span>Program Files"Microsoft Visual Studio 9.0"VC<span style="font-family: 宋体">里的</span>include<span style="font-family: 宋体">和</span>lib<span style="font-family: 宋体">。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体">这样头文件应该也找到了，库文件应该也找到了，为了防止意外，这次不直接用</span>CMD<span style="font-family: 宋体">了。用</span>Windows SDK<span style="font-family: 宋体">的</span>CMD SHELL<span style="font-family: 宋体">，它会自动地加入一些变量。让各种文件更容易被找到。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体">这一次终于</span>Build<span style="font-family: 宋体">过了</span>90%<span style="font-family: 宋体">，还有</span>10%<span style="font-family: 宋体">还是过不了，就是</span>NSIS Menu<span style="font-family: 宋体">，其实文档上也说了要</span>build NSIS menu<span style="font-family: 宋体">要安装</span>wxWidgets<span style="font-family: 宋体">。其实目的已经基本完成了，</span>NSIS<span style="font-family: 宋体">的主体和插件都已经可以编译了，这个</span>NSIS MENU<span style="font-family: 宋体">是可有可无的，不过为了看上去舒服一些，还是让它过吧。同样安装了</span>wxWidgets<span style="font-family: 宋体">的最新版</span>2.8.10<span style="font-family: 宋体">，同样的要设置环境变量。根据</span><a href="http://nsis.sourceforge.net/Docs/AppendixG.html"><span style="font-family: 宋体"><span>文档</span></a></span><span style="font-family: 宋体">上的提示，要先运行一下</span>NSIS<span style="font-family: 宋体">源代码目录下的</span>Contrib"NSIS Menu"wx"wxbuild.bat<span style="font-family: 宋体">（同样要在</span>CMD SHELL<span style="font-family: 宋体">里运行）以生成一些必要的库。然后再在</span>NSIS<span style="font-family: 宋体">源代码的根目录下运行</span>scons<span style="font-family: 宋体">。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体">如果出现什么问题，可以参考下面二个论坛上的主题。</span></p>
<p>&nbsp;</p>
<p><a href="http://forums.winamp.com/printthread.php?s=1d19f51e5d2de8b9768d0c5f58c06def&amp;threadid=277283"><strong>Problem building the NSIS source</strong></a><strong></strong></p>
<p><a href="http://forums.winamp.com/printthread.php?s=cbda600d9e4a9d802164dccb23c739ac&amp;threadid=268726"><strong>Nsis 2.25 - compilation problem</strong></a></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体">至此，</span>NSIS<span style="font-family: 宋体">编译成功。用</span>VS2008<span style="font-family: 宋体">编译出来的文件的大小，和官方下载的大小还是有一定差别的，可能是因为官方打包用的是</span>VS2005<span style="font-family: 宋体">的原因吧。理论上自己编译出来的这个应该更好一些的吧。</span></p><img src ="http://www.cnblogs.com/nankezhishi/aggbug/1429970.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47965/" target="_blank">Google App Engine宕机6小时——云的安全在哪里？</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>[安装包制作]NSIS项目的基本结构</title><link>http://www.cnblogs.com/nankezhishi/archive/2009/04/02/NSIS_Structure.html</link><dc:creator>南柯之石</dc:creator><author>南柯之石</author><pubDate>Thu, 02 Apr 2009 15:50:00 GMT</pubDate><guid>http://www.cnblogs.com/nankezhishi/archive/2009/04/02/NSIS_Structure.html</guid><wfw:comment>http://www.cnblogs.com/nankezhishi/comments/1428572.html</wfw:comment><comments>http://www.cnblogs.com/nankezhishi/archive/2009/04/02/NSIS_Structure.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/nankezhishi/comments/commentRss/1428572.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/nankezhishi/services/trackbacks/1428572.html</trackback:ping><description><![CDATA[<p>NSIS<span style="font-family: 宋体">是一个用于生成安装程序的软件，用</span>NSI<span style="font-family: 宋体">脚本可以很方便地写出一个安装包。最大的优点就是免费。</span>VS<span style="font-family: 宋体">自带的建立</span>MSI<span style="font-family: 宋体">安装包能实现的功能比较单一，听说有微软有另一个专门做安装包的软件能实现更强大的功能，不过比</span>VS Pro<span style="font-family: 宋体">还要贵&#8230;&#8230;。所以如果只是最简单的安装、卸载，</span>MSI<span style="font-family: 宋体">足够了，如果想多提供一些功能，又不想多花钱的话，</span>NSIS<span style="font-family: 宋体">或是</span>INNO<span style="font-family: 宋体">都是不错的选择。其中</span>NSIS<span style="font-family: 宋体">更灵活一些。</span>INNO<span style="font-family: 宋体">更简单一些。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体">目前发现的</span>NSIS<span style="font-family: 宋体">的主要缺点是：不支持在安装过程中取消安装。如果你觉得这个功能很重要的话，还是不要用</span>NSIS<span style="font-family: 宋体">了。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体">下面就从最简单的说起&#8212;&#8212;如何用</span>NSIS<span style="font-family: 宋体">建立一个安装包。建议见看看</span>NSIS<span style="font-family: 宋体">的帮助文档。因为下面的内容主要介绍帮助文档还没有讲到的部分。</span></p>
<p>&nbsp;</p>
<p>NSIS<span style="font-family: 宋体">的</span>User Manual<span style="font-family: 宋体">第二章&#8220;</span><a href="http://nsis.sourceforge.net/Docs/Chapter2.html#2.3">Tutorial: The Basic</a><span style="font-family: 宋体">&#8221;是这样描述脚本的结构的。</span></p>
<p>&nbsp;</p>
<p><span>Required is the <a href="http://www.cnblogs.com/nankezhishi/admin/mk:@MSITStore:D:%5CProgram%20Files%5CNSIS%5CNSIS.chm::/Section4.8.html#4.8.1.31">OutFile</a> instruction, which tells NSIS where to write the installer, and one section.</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体">大意就是说一个</span>NSI<span style="font-family: 宋体">脚本只要有一个</span>OutFile<span style="font-family: 宋体">指令和一个</span>Section<span style="font-family: 宋体">就可以了。就是下面这个样子：</span></p>
<p>&nbsp;</p>
<p><span style="color: #0070c0">OutFile</span> "Min.exe"</p>
<p><strong><span style="color: #0070c0">Section</span></strong></p>
<p><strong><span style="color: #0070c0">SectionEnd</span></strong></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体">一个什么也没有做的</span>Installer<span style="font-family: 宋体">就大功告成了。但是这样的示例对于学习</span>NSI<span style="font-family: 宋体">脚本可以说一点儿帮助也没有。因为我们需要的是一个可以完成基本功能的安装程序，而不是一个连&#8220;</span>Hello world<span style="font-family: 宋体">&#8221;都没有输出的可执行文件。而</span>NSIS<span style="font-family: 宋体">的</span>User Manual<span style="font-family: 宋体">从头到尾没有给出一个完整的示例，并解释一下。这篇文章将向大家介绍一个功能基本完整的，行为基本正确的安装程序脚本。文中不会介绍</span>NSI<span style="font-family: 宋体">的语法，语法请参考</span><a href="http://nsis.sourceforge.net/Docs/">User Manual</a><span style="font-family: 宋体">。</span></p>
<p>&nbsp;</p>
<p><strong><span style="font-family: 宋体">环境准备：</span></strong></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体">首先，如果大家还没有安装</span>NSIS<span style="font-family: 宋体">，请先从</span><a href="http://sourceforge.net/projects/nsis/">http://sourceforge.net/projects/nsis/</a><span style="font-family: 宋体">下载最新的安装包。以</span>2.44<span style="font-family: 宋体">版为例，需要下载</span>nsis-2.44-setup.exe<span style="font-family: 宋体">和</span>nsis-2.44-log.zip<span style="font-family: 宋体">两个文件。安装完</span>NSIS<span style="font-family: 宋体">之后，把</span>nsis-2.44-log.zip<span style="font-family: 宋体">里解压出来的文件覆盖安装目录下的文件。这个</span>nisi-2.44-log<span style="font-family: 宋体">用于开启</span>NSIS<span style="font-family: 宋体">的安装日志功能。默认的安装包是没有这个功能的。</span></p>
<p>&nbsp;</p>
<p>NSI<span style="font-family: 宋体">脚本的编辑器推荐</span>Notepad++<span style="font-family: 宋体">。可以从</span><a href="http://notepad-plus.sourceforge.net/tw/site.htm">http://notepad-plus.sourceforge.net/tw/site.htm</a><span style="font-family: 宋体">下载最新版本。（之前一直用</span>Emeditor<span style="font-family: 宋体">，不过它目前不支持</span>NSI<span style="font-family: 宋体">脚本。用了</span>Notepad++<span style="font-family: 宋体">很惊异于其支持的语言数量。）</span></p>
<p>&nbsp;</p>
<p><strong><span style="font-family: 宋体">需求描述：</span></strong></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体">我们将要实现的</span>Installer<span style="font-family: 宋体">需要满足下面几个要求：</span></p>
<p>&nbsp;</p>
<p style="text-indent: -18pt; margin-left: 18pt"><span>1.<span style="font: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">界面看上去别太土：因为很不幸，</span>NSIS<span style="font-family: 宋体">编译出来的程序默认的风格很</span>Win 98<span style="font-family: 宋体">。要使用</span>MUI2<span style="font-family: 宋体">库来生成一个比较</span>XP<span style="font-family: 宋体">风格的安装包。关于</span>MUI2<span style="font-family: 宋体">包的使用，可以参考</span><a href="http://nsis.sourceforge.net/Docs/Modern%20UI%202/Readme.html"><span style="font-family: 宋体"><span>在线帮助文档</span></span></a><span style="font-family: 宋体">。</span></p>
<p style="text-indent: -18pt; margin-left: 18pt"><span>2.<span style="font: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">支持安装日志：安装时把安装的文件记录下来，主要用于卸载时只删除安装程序安装的文件。</span></p>
<p style="text-indent: -18pt; margin-left: 18pt"><span>3.<span style="font: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">支持多语言。这个就不用解释了吧。</span></p>
<p style="text-indent: -18pt; margin-left: 18pt"><span>4.<span style="font: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">基本的页面。这个是自带的，也不用怎么解释。</span></p>
<p>&nbsp;</p>
<p><strong><span style="font-family: 宋体">示例代码：</span></strong></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体">下面是一个比较完整的安装，但是功能还不是很完整，因为具体功能就要自己加了。</span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span style="color: #00b050">; </span><span style="font-family: 宋体; color: #00b050">头文件应该放在最上面，</span><span style="color: #00b050">C++</span><span style="font-family: 宋体; color: #00b050">也是这样。</span></p>
<p><span style="color: #00b0f0">!include</span> "MUI2.nsh"</p>
<p><span style="color: #00b0f0">!include</span> "uninstallfromlog.nsh"&nbsp;<span style="color: #00b050">; </span><span style="font-family: 宋体; color: #00b050">卸载时要用的一个头文件，没有在默认安装包里，可以从</span><span style="color: #0070c0"><a href="http://nsis.sourceforge.net/Uninstall_from_NSIS_log"><span style="font-family: 宋体; color: #0070c0">这里</span></a></span><span style="font-family: 宋体; color: #00b050">下载</span></p>
<p>&nbsp;</p>
<p><span style="color: #00b050">; </span><span style="font-family: 宋体; color: #00b050">然后是一些基本的设置</span></p>
<p><span style="color: #00b0f0">Name</span> "YourApp"</p>
<p><span style="color: #00b0f0">OutFile</span> "YourAppSetup.exe"</p>
<p><span style="color: #00b0f0">InstallDir</span> "C:\Program Files\XXXX\YourApp"</p>
<p><span style="color: #00b0f0">RequestExecutionLevel</span> user</p>
<p>&nbsp;</p>
<p><span style="color: #00b050">; </span><span style="font-family: 宋体; color: #00b050">参数的定义</span></p>
<p><span style="color: #00b0f0">!define</span> MUI_ABORTWARNING</p>
<p><span style="color: #00b0f0">!define</span> MUI_FINISHPAGE_NOREBOOTSUPPORT</p>
<p>&nbsp;</p>
<p><span style="color: #00b050">; </span><span style="font-family: 宋体; color: #00b050">安装页面定义</span></p>
<p><span style="color: #00b0f0">!insertmacro</span> MUI_PAGE_WELCOME</p>
<p><span style="color: #00b0f0">!insertmacro</span> MUI_PAGE_LICENSE "license.txt"</p>
<p><span style="color: #00b0f0">!insertmacro</span> MUI_PAGE_DIRECTORY</p>
<p><span style="color: #00b0f0">!insertmacro</span> MUI_PAGE_INSTFILES</p>
<p><span style="color: #00b0f0">!insertmacro</span> MUI_PAGE_FINISH</p>
<p>&nbsp;</p>
<p><span style="color: #00b050">; </span><span style="font-family: 宋体; color: #00b050">卸载页面定义</span></p>
<p><span style="color: #00b0f0">!insertmacro</span> MUI_UNPAGE_WELCOME</p>
<p><span style="color: #00b0f0">!insertmacro</span> MUI_UNPAGE_CONFIRM</p>
<p><span style="color: #00b0f0">!insertmacro</span> MUI_UNPAGE_INSTFILES</p>
<p><span style="color: #00b0f0">!insertmacro</span> MUI_UNPAGE_FINISH</p>
<p>&nbsp;</p>
<p><span style="color: #00b050">; </span><span style="font-family: 宋体; color: #00b050">界面语言定义，想多支持就多加，但是加的语言，受</span><span style="color: #00b050">OS</span><span style="font-family: 宋体; color: #00b050">限制不一定能显示出来，<span style="background: yellow; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">必须放在页面的定义之后。</span></span></p>
<p><span style="color: #00b0f0">!insertmacro</span> MUI_LANGUAGE "SimpChinese" </p>
<p><span style="color: #00b0f0">!insertmacro</span> MUI_LANGUAGE "English"</p>
<p>&nbsp;</p>
<p><span style="color: #00b050">; </span><span style="font-family: 宋体; color: #00b050">开启安装时的</span><span style="color: #00b050">Log</span><span style="font-family: 宋体; color: #00b050">功能，<span style="background: yellow; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">必须是第一个</span></span><span style="background: yellow; color: #00b050; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">Section</span></p>
<p><strong>Section</strong> "-LogSetOn"</p>
<p>&nbsp;<span style="color: #00b0f0">LogSet <span style="color: red">on</span></span></p>
<p><strong>SectionEnd</strong></p>
<p>&nbsp;</p>
<p><span style="color: #00b050">; </span><span style="font-family: 宋体; color: #00b050">然后是安装段和卸载段</span></p>
<p><strong>Section</strong> "install"</p>
<p><span>&nbsp;&nbsp;&nbsp; <span style="color: #00b0f0">SetOutPath</span> <span style="color: #ffc000">$INSTDIR</span></span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #00b0f0">WriteUninstaller</span> <span style="color: #ffc000">$INSTDIR</span>\Uninstaller.exe</span></p>
<p><span>&nbsp;&nbsp;&nbsp; <span style="color: #00b0f0">File</span> "..\YourApp\bin\Release\*.*"</span></p>
<p><strong>SectionEnd</strong></p>
<p>&nbsp;</p>
<p><strong>Section</strong> Uninstall</p>
<p><span>&nbsp;&nbsp;&nbsp; <span style="color: #00b0f0">Call</span> un.CreateLogFromFile</span></p>
<p><span>&nbsp;&nbsp;&nbsp; <span style="color: #00b0f0">Call</span> un.RemoveDirectoriesFromLog</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #00b0f0">Delete</span> <span style="color: #ffc000">$INSTDIR</span>\install.log</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #00b0f0">Delete</span> <span style="color: #ffc000">$INSTDIR</span>\Uninstaller.exe</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #00b0f0">RMDir</span> <span style="color: #ffc000">$INSTDIR</span></span></p>
<p><strong>SectionEnd</strong></p>
<p>&nbsp;</p>
<p><span style="color: #00b050">; </span><span style="font-family: 宋体; color: #00b050">最后是各个函数，最好放在最后。</span></p>
<p><span style="color: #00b050">; </span><span style="font-family: 宋体; color: #00b050">安装程序的初始化函数，显示了语言选择页面</span></p>
<p><strong>Function</strong> .onInit</p>
<p>&nbsp;<span style="color: #00b0f0">!insertmacro MUI_LANGDLL_DISPLAY</span></p>
<p><strong>FunctionEnd</strong></p>
<p>&nbsp;</p>
<p><strong>Function</strong> un.onInit</p>
<p>&nbsp;<span style="color: #00b0f0">!insertmacro MUI_UNGETLANGUAGE</span></p>
<p><strong>FunctionEnd</strong></p>
<p>&nbsp;</p>
<p><a href="http://it.oyksoft.com/post/58/"><span style="font-family: 宋体"><span>快乐无极博客</span></span></a><span style="font-family: 宋体">也给出了一种根据</span>log<span style="font-family: 宋体">文件进行卸载的另一个头文件，原理一样，大家可以参考一下。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体">先到这里吧，下一篇将介绍</span>MUI2<span style="font-family: 宋体">库的配置。</span></p><img src ="http://www.cnblogs.com/nankezhishi/aggbug/1428572.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47961/" target="_blank">微软新推社交网站Windows Live Planet</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>用Bat清理项目中的特定目录</title><link>http://www.cnblogs.com/nankezhishi/archive/2009/03/26/1422687.html</link><dc:creator>南柯之石</dc:creator><author>南柯之石</author><pubDate>Thu, 26 Mar 2009 13:39:00 GMT</pubDate><guid>http://www.cnblogs.com/nankezhishi/archive/2009/03/26/1422687.html</guid><wfw:comment>http://www.cnblogs.com/nankezhishi/comments/1422687.html</wfw:comment><comments>http://www.cnblogs.com/nankezhishi/archive/2009/03/26/1422687.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cnblogs.com/nankezhishi/comments/commentRss/1422687.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/nankezhishi/services/trackbacks/1422687.html</trackback:ping><description><![CDATA[<p><span style="font-family: 宋体">在把源代码打包的时候，常做的一步就是把文件夹中的所有</span>bin<span style="font-family: 宋体">目录和</span>obj<span style="font-family: 宋体">目录删除，不然打的包会很大。如果解决方案中只有一个项目，手工删除这两个目录还可以。项目一多了，一个个地手工删除自然很累。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体">懒惰的程序员都会去写个程序做这个事情。上学的时候就写过一个</span>Power<span style="font-family: 宋体">工具包，里面就包括这个功能。现在想想那个时候还是太勤快了，写那么多代码做这么点儿破事儿，累不累啊？</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体">因为用</span>bat<span style="font-family: 宋体">，几行代码就可以搞定。而且不用编译，用的时候不用选择目标文件夹。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体">在网上找了半天始终没有找到一个合适的。没办法，自己写了。代码如下</span>&nbsp;</p>
<p>&nbsp;</p>
<div class="cnblogs_code"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">/</span><span style="color: #000000">r&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">C:\Folder</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;%%f&nbsp;in&nbsp;</span><span style="color: #000000">(.)</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">Do</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">If</span><span style="color: #000000">&nbsp;%%~nf&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;bin&nbsp;</span><span style="color: #0000ff">rd</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">/</span><span style="color: #000000">s&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">%%f</span><span style="color: #000000">"</span></div>
<p>&nbsp;</p>
<p><span style="font-family: 宋体">参考文献：</span><a href="http://www.computerhope.com/forhlp.htm">Microsoft DOS for command</a></p>
<img src ="http://www.cnblogs.com/nankezhishi/aggbug/1422687.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47960/" target="_blank">火狐3.5版被指推出太匆忙：存在50多个漏洞</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>[提个醒] C#中yield return的小缺点</title><link>http://www.cnblogs.com/nankezhishi/archive/2009/03/20/1418086.html</link><dc:creator>南柯之石</dc:creator><author>南柯之石</author><pubDate>Fri, 20 Mar 2009 15:24:00 GMT</pubDate><guid>http://www.cnblogs.com/nankezhishi/archive/2009/03/20/1418086.html</guid><wfw:comment>http://www.cnblogs.com/nankezhishi/comments/1418086.html</wfw:comment><comments>http://www.cnblogs.com/nankezhishi/archive/2009/03/20/1418086.html#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://www.cnblogs.com/nankezhishi/comments/commentRss/1418086.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/nankezhishi/services/trackbacks/1418086.html</trackback:ping><description><![CDATA[<p><span style="font-family: 宋体;">先来看一个代码：</span>&nbsp;</p>
<div class="cnblogs_code"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff;">using</span><span style="color: #000000;">&nbsp;System;<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff;">using</span><span style="color: #000000;">&nbsp;System.Collections.Generic;<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff;">namespace</span><span style="color: #000000;">&nbsp;YeildReturn<br />
<img id="Codehighlighter1_71_526_Open_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_71_526_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_71_526_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_71_526_Closed_Text').style.display='inline';" align="top"><img id="Codehighlighter1_71_526_Closed_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" style="display: none;" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_71_526_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_71_526_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_71_526_Open_Text').style.display='inline';" align="top"></span><span id="Codehighlighter1_71_526_Closed_Text" style="border: 1px solid #808080; background-color: #ffffff; display: none;"><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_71_526_Open_Text"><span style="color: #000000;">{<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;Program<br />
<img id="Codehighlighter1_95_524_Open_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_95_524_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_95_524_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_95_524_Closed_Text').style.display='inline';" align="top"><img id="Codehighlighter1_95_524_Closed_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" style="display: none;" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_95_524_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_95_524_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_95_524_Open_Text').style.display='inline';" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_95_524_Closed_Text" style="border: 1px solid #808080; background-color: #ffffff; display: none;"><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_95_524_Open_Text"><span style="color: #000000;">{<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;Main(</span><span style="color: #0000ff;">string</span><span style="color: #000000;">[]&nbsp;args)<br />
<img id="Codehighlighter1_145_217_Open_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_145_217_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_145_217_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_145_217_Closed_Text').style.display='inline';" align="top"><img id="Codehighlighter1_145_217_Closed_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" style="display: none;" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_145_217_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_145_217_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_145_217_Open_Text').style.display='inline';" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_145_217_Closed_Text" style="border: 1px solid #808080; background-color: #ffffff; display: none;"><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_145_217_Open_Text"><span style="color: #000000;">{<br />
<img id="Codehighlighter1_189_205_Open_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_189_205_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_189_205_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_189_205_Closed_Text').style.display='inline';" align="top"><img id="Codehighlighter1_189_205_Closed_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" style="display: none;" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_189_205_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_189_205_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_189_205_Open_Text').style.display='inline';" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GetNotEmptyItems(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">[]&nbsp;</span><span id="Codehighlighter1_189_205_Closed_Text" style="border: 1px solid #808080; background-color: #ffffff; display: none;"><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_189_205_Open_Text"><span style="color: #000000;">{&nbsp;</span><span style="color: #800000;">"</span><span style="color: #800000;">a</span><span style="color: #800000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #800000;">""</span><span style="color: #000000;">,&nbsp;</span><span style="color: #800000;">"</span><span style="color: #800000;">b</span><span style="color: #800000;">"</span><span style="color: #000000;">&nbsp;}</span></span><span style="color: #000000;">);<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000;"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;IEnumerable</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;GetNotEmptyItems(IEnumerable</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;args)<br />
<img id="Codehighlighter1_313_518_Open_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_313_518_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_313_518_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_313_518_Closed_Text').style.display='inline';" align="top"><img id="Codehighlighter1_313_518_Closed_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" style="display: none;" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_313_518_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_313_518_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_313_518_Open_Text').style.display='inline';" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_313_518_Closed_Text" style="border: 1px solid #808080; background-color: #ffffff; display: none;"><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_313_518_Open_Text"><span style="color: #000000;">{<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">foreach</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&nbsp;arg&nbsp;</span><span style="color: #0000ff;">in</span><span style="color: #000000;">&nbsp;args)<br />
<img id="Codehighlighter1_368_508_Open_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_368_508_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_368_508_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_368_508_Closed_Text').style.display='inline';" align="top"><img id="Codehighlighter1_368_508_Closed_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" style="display: none;" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_368_508_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_368_508_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_368_508_Open_Text').style.display='inline';" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_368_508_Closed_Text" style="border: 1px solid #808080; background-color: #ffffff; display: none;"><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_368_508_Open_Text"><span style="color: #000000;">{<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(arg);<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">string</span><span style="color: #000000;">.IsNullOrEmpty(arg))<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">yield</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;arg;<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000;"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000;"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000;"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000;"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<p>  </p>
<p><span style="font-family: 宋体;">大家猜猜会有几行输出？</span>2<span style="font-family: 宋体;">行？</span>3<span style="font-family: 宋体;">行？</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体;">答案是没有输出。明明输入的</span>string<span style="font-family: 宋体;">列表里的每个</span>item<span style="font-family: 宋体;">都</span>Console.WriteLine<span style="font-family: 宋体;">了，为什么会没有输出呢？</span> <br />
</p>
<p><span style="font-family: 宋体;">想要有输出，要改改代码，下面的代码就可以了。</span></p>
<div class="cnblogs_code"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">using</span><span style="color: #000000;">&nbsp;System;<br />
</span><span style="color: #0000ff;">using</span><span style="color: #000000;">&nbsp;System.Collections.Generic;<br />
<br />
</span><span style="color: #0000ff;">namespace</span><span style="color: #000000;">&nbsp;YeildReturn<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;Program<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;Main(</span><span style="color: #0000ff;">string</span><span style="color: #000000;">[]&nbsp;args)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="background-color: yellow;"><span style="color: #0000ff;">foreach</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&nbsp;str&nbsp;</span><span style="color: #0000ff;">in</span><span style="color: #000000;">&nbsp;</span></span><span style="color: #000000;">GetNotEmptyItems(</span><span style="background-color: yellow;"><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">[]&nbsp;{&nbsp;</span><span style="color: #800000;">"</span><span style="color: #800000;">a</span><span style="color: #800000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #800000;">""</span><span style="color: #000000;">,&nbsp;</span><span style="color: #800000;">"</span><span style="color: #800000;">b</span><span style="color: #800000;">"</span><span style="color: #000000;">&nbsp;})</span></span><span style="color: #000000;">)&nbsp;;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;IEnumerable</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;GetNotEmptyItems(IEnumerable</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;args)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">foreach</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&nbsp;arg&nbsp;</span><span style="color: #0000ff;">in</span><span style="color: #000000;">&nbsp;args)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(arg);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">string</span><span style="color: #000000;">.IsNullOrEmpty(arg))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">yield</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;arg;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
</span></div>
<p>&nbsp;</p>
<p><span style="font-family: 宋体;">把对</span>GetNotEmptyItems<span style="font-family: 宋体;">的调用，放在一个</span>foreach<span style="font-family: 宋体;">语句中，然后什么也不做。结果就有输出了！</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体;">有时写代码，返回值只是为了方便组成链式表达式，使用</span>yield<span style="font-family: 宋体;">是为了提高性能(^_^参考PS)和简化代码。所以很可能出现这样的情况，只调用函数，而不使用其返回值。但是这时就不应该用</span>yield<span style="font-family: 宋体;">了，否则就会造成上面的问题。因为</span>yield<span style="font-family: 宋体;">是要和</span>foreach<span style="font-family: 宋体;">一起用的。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体;">这里只是给大家提醒，想要打破沙锅问到底的朋友们可以参考网上丰富的</span>yield<span style="font-family: 宋体;">的资料。下面随便找了两个园子里的链接。</span></p>
<p><a href="http://www.cnblogs.com/montaque/archive/2005/04/21/142844.html">C# 2.0 <span style="font-family: 宋体;"><span>新特性之迭代器</span>, Yield Return</span></a></p>
<p><a href="http://www.cnblogs.com/tity/archive/2006/09/05/495538.html"><span style="font-family: 宋体;"><span>迭代器（</span>yield return <span style="font-family: 宋体;">）</span></span></a></p>
<p>&nbsp;</p>
<p><em>PS<span style="font-family: 宋体;">：几乎所有的对</span>yield return<span style="font-family: 宋体;">和直接</span>return list<span style="font-family: 宋体;">的测试结果都会告诉你，</span>yield return<span style="font-family: 宋体;">更慢。但是当你真正了解</span>yield<span style="font-family: 宋体;">之后，相信多数情况下都会选择</span>yield return<span style="font-family: 宋体;">的。</span></em></p><img src ="http://www.cnblogs.com/nankezhishi/aggbug/1418086.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47959/" target="_blank">Google对手机搜索进行优化升级</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>安装过程中检测数据库是否已经存在</title><link>http://www.cnblogs.com/nankezhishi/archive/2009/03/20/1418026.html</link><dc:creator>南柯之石</dc:creator><author>南柯之石</author><pubDate>Fri, 20 Mar 2009 14:05:00 GMT</pubDate><guid>http://www.cnblogs.com/nankezhishi/archive/2009/03/20/1418026.html</guid><wfw:comment>http://www.cnblogs.com/nankezhishi/comments/1418026.html</wfw:comment><comments>http://www.cnblogs.com/nankezhishi/archive/2009/03/20/1418026.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/nankezhishi/comments/commentRss/1418026.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/nankezhishi/services/trackbacks/1418026.html</trackback:ping><description><![CDATA[<p><span style="font-family: 宋体;">制作服务端程序的安装包，常常要创建数据库和其中的表。在创建之前，应该检测一下这个数据库是否已经存在了，如果已经存在，那么弹出消息框问用户是不是要覆盖现有的数据库数据。这里是一个使用</span><a href="http://nsis.sourceforge.net/Main_Page"><strong>NSIS</strong></a><span style="font-family: 宋体;">制作安装包时的检测方法。<br />
</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体;">检测部分的NSI代码如下：</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; nsExec::<span style="color: #0000ff;">Exec</span> <span style="background-color: #808080; color: #ffffff;">'sqlcmd -S .\SQLEXPRESS -d SampleDB'</span></span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #0000ff;">Pop</span> <span style="color: #ff9900;">$0</span></span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #0000ff;">IntCmp</span> <span style="color: #ff9900;">$0</span> <span style="color: #ff0000;">1</span> Update Ask</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体;">原理很简单，用</span>sqlcmd<span style="font-family: 宋体;">登录到想要创建的数据库，如果已经存在了，那么成功登录，</span>$0<span style="font-family: 宋体;">里的值将是</span>0<span style="font-family: 宋体;">，否则就是</span>1<span style="font-family: 宋体;">。</span> <br />
</p>
<p>NSIS<span style="font-family: 宋体;">里有很多种</span>Exec<span style="font-family: 宋体;">的方式，而且检测数据库存在也有很多种。今天试了很多种，有些行不通，有些过于复杂，上面这种是相对简单的方法。希望能给需要的人一些提示。</span></p>
<p>&nbsp;</p><img src ="http://www.cnblogs.com/nankezhishi/aggbug/1418026.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47959/" target="_blank">Google对手机搜索进行优化升级</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>[WPF Bug清单]之(9)——消失的光标</title><link>http://www.cnblogs.com/nankezhishi/archive/2009/03/19/1417151.html</link><dc:creator>南柯之石</dc:creator><author>南柯之石</author><pubDate>Thu, 19 Mar 2009 14:14:00 GMT</pubDate><guid>http://www.cnblogs.com/nankezhishi/archive/2009/03/19/1417151.html</guid><wfw:comment>http://www.cnblogs.com/nankezhishi/comments/1417151.html</wfw:comment><comments>http://www.cnblogs.com/nankezhishi/archive/2009/03/19/1417151.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.cnblogs.com/nankezhishi/comments/commentRss/1417151.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/nankezhishi/services/trackbacks/1417151.html</trackback:ping><description><![CDATA[<p><span style="font-family: 宋体;">首先声明一下：有人早就发现了这个问题，发过了</span><a href="http://silverlight.net/forums/t/51541.aspx"><span style="font-family: 宋体;"><span>帖子</span></span></a><span style="font-family: 宋体;">，也已经有微软的人说这是&#8220;</span>by design<span style="font-family: 宋体;">&#8221;的行为。但是我依然对这个诡异的行为表示不可理解。所以发上来，看看大家的见解。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体;"><a href="http://www.cnblogs.com/Files/nankezhishi/HiddenCaret.zip">示例代码</a>非常之简单。</span>&nbsp;</p>
<div class="cnblogs_code"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">Window&nbsp;</span><span style="color: #ff0000;">x:Class</span><span style="color: #0000ff;">="HiddenCaret.DemoWindow"</span><span style="color: #ff0000;"><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;xmlns</span><span style="color: #0000ff;">="http://schemas.microsoft.com/winfx/2006/xaml/presentation"</span><span style="color: #ff0000;"><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;xmlns:x</span><span style="color: #0000ff;">="http://schemas.microsoft.com/winfx/2006/xaml"</span><span style="color: #ff0000;"><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;ResizeMode</span><span style="color: #0000ff;">="NoResize"</span><span style="color: #ff0000;">&nbsp;Title</span><span style="color: #0000ff;">="Caret&nbsp;Gone"</span><span style="color: #ff0000;"><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;Width</span><span style="color: #0000ff;">="150"</span><span style="color: #ff0000;">&nbsp;Height</span><span style="color: #0000ff;">="100"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">TextBox&nbsp;</span><span style="color: #ff0000;">TextWrapping</span><span style="color: #0000ff;">="Wrap"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
<br />
</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">Window</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span></div>
<p>  </p>
<p>TextBox<span style="font-family: 宋体;">要设置为</span>Wrap<span style="font-family: 宋体;">使其自动换行。</span> <br />
</p>
<p><span style="font-family: 宋体;">重现</span>Bug<span style="font-family: 宋体;">的步骤如下：</span></p>
<p>&nbsp;</p>
<p align="center"><img alt="" src="http://www.cnblogs.com/images/cnblogs_com/nankezhishi/WPFBug/HiddenCaret/Startup.PNG" border="0" width="150" height="100" /><br />
</p>
<p align="center"><span style="font-family: 宋体;">图</span>1. <span style="font-family: 宋体;">运行程序</span></p>
<p>&nbsp;</p>
<p align="center"><img alt="" src="http://www.cnblogs.com/images/cnblogs_com/nankezhishi/WPFBug/HiddenCaret/TypeManyd.PNG" border="0" width="150" height="100" /></p>
<p align="center"><span style="font-family: 宋体;">图</span>2. <span style="font-family: 宋体;">输入很多字母</span></p>
<p>&nbsp;</p>
<p align="center"><img alt="" src="http://www.cnblogs.com/images/cnblogs_com/nankezhishi/WPFBug/HiddenCaret/MoveCaretToHomeOfLineTwo.PNG" border="0" width="150" height="100" /></p>
<p align="center"><span style="font-family: 宋体;">图</span>3. <span style="font-family: 宋体;">将光标放到行首</span></p>
<p>&nbsp;</p>
<p align="center"><img alt="" src="http://www.cnblogs.com/images/cnblogs_com/nankezhishi/WPFBug/HiddenCaret/TypeSpace.PNG" border="0" width="150" height="100" /></p>
<p align="center"><span style="font-family: 宋体;">图</span>4. <span style="font-family: 宋体;">输入空格，光标不见了</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体;">光标不可见，其实还是存在的，只是跑到了第一行的行尾。这就是微软的人说的&#8220;</span>by design<span style="font-family: 宋体;">&#8221;的行为的后果。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体;">如果大家试着改一下窗体的大小，比如改成</span>200<span style="font-family: 宋体;">，那么最后一步输入一个空格之后，光标的确还是可见的，多输入几个空格就又看不见了。这是字体大小与窗体宽度的比例问题造成的。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体;">而且重现上面的问题，也并不需要这么多步骤，只要在文本框里输入足够多的空格就会有问题——根本原因就在于<strong>空格不会被</strong></span><strong>Wrap</strong><span style="font-family: 宋体;">。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体;">不知道微软为什么会这么做？但是相信用户在文本框输入着东西，突然发现光标看不到了，绝对不会觉得很自然。而且</span>WinForm<span style="font-family: 宋体;">的</span>TextBox<span style="font-family: 宋体;">是没有这个问题。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体;">不知道微软的这个</span>by design<span style="font-family: 宋体;">是作何考虑的？大家觉得呢？</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体;">同系列的其它文章：</span> <br />
</p>
<p><a href="http://www.cnblogs.com/nankezhishi/archive/2008/12/13/1354226.html">[WPF Bug<span style="font-family: 宋体;"><span>清单</span>](<span style="font-family: 宋体;">序</span>)<span style="font-family: 宋体;">与之</span>(1)——<span style="font-family: 宋体;">可以多选的单选</span>ListBox</span></a></p>
<p><a href="http://www.cnblogs.com/nankezhishi/archive/2008/12/14/1354913.html">[WPF Bug<span style="font-family: 宋体;"><span>清单</span>]<span style="font-family: 宋体;">之</span>(2)——RadioButton<span style="font-family: 宋体;">的</span>IsChecked<span style="font-family: 宋体;">绑定失效</span></span></a></p>
<p><a href="http://www.cnblogs.com/nankezhishi/archive/2008/12/20/1359078.html">[WPF Bug<span style="font-family: 宋体;"><span>清单</span>]<span style="font-family: 宋体;">之</span>(3)——<span style="font-family: 宋体;">暗中创建文件的打开文件对话框</span></span></a></p>
<p><a href="http://www.cnblogs.com/nankezhishi/archive/2009/01/11/1373670.html">[WPF Bug<span style="font-family: 宋体;"><span>清单</span>]<span style="font-family: 宋体;">之</span>(4)——<span style="font-family: 宋体;">点击</span>RadioButton<span style="font-family: 宋体;">的空白没有反应</span></span></a></p>
<p><a href="http://www.cnblogs.com/nankezhishi/archive/2009/02/05/1384897.html">[WPF Bug<span style="font-family: 宋体;"><span>清单</span>]<span style="font-family: 宋体;">之</span>(5)——<span style="font-family: 宋体;">隐藏模态对话框后变成非模态</span></span></a></p>
<p><a href="http://www.cnblogs.com/nankezhishi/archive/2009/02/09/1387052.html">[WPF Bug<span style="font-family: 宋体;"><span>清单</span>]<span style="font-family: 宋体;">之</span>(6)——Button<span style="font-family: 宋体;">的</span>IsCancel<span style="font-family: 宋体;">属性失效</span></span></a></p>
<p><a href="http://www.cnblogs.com/nankezhishi/archive/2009/02/10/1387800.html">[WPF Bug<span style="font-family: 宋体;"><span>清单</span>]<span style="font-family: 宋体;">之</span>(7)——<span style="font-family: 宋体;">顽固的</span>Error Template</span></a></p>
<p><a href="http://www.cnblogs.com/nankezhishi/archive/2009/02/11/1388706.html">[WPF Bug<span style="font-family: 宋体;"><span>清单</span>]<span style="font-family: 宋体;">之</span>(8)——RowDefinition<span style="font-family: 宋体;">中</span>MaxHeight<span style="font-family: 宋体;">在一定条件下失效</span></span></a></p><img src ="http://www.cnblogs.com/nankezhishi/aggbug/1417151.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47958/" target="_blank">风声又起 Windows 7 RTM版7月13日完成</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>请教一个使用MVVM进行系统分层的问题</title><link>http://www.cnblogs.com/nankezhishi/archive/2009/03/17/1414783.html</link><dc:creator>南柯之石</dc:creator><author>南柯之石</author><pubDate>Tue, 17 Mar 2009 14:56:00 GMT</pubDate><guid>http://www.cnblogs.com/nankezhishi/archive/2009/03/17/1414783.html</guid><wfw:comment>http://www.cnblogs.com/nankezhishi/comments/1414783.html</wfw:comment><comments>http://www.cnblogs.com/nankezhishi/archive/2009/03/17/1414783.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/nankezhishi/comments/commentRss/1414783.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/nankezhishi/services/trackbacks/1414783.html</trackback:ping><description><![CDATA[<p>想了解一下MVVM的具体实现，所以就写个小程序实际用用，结果用的时候发现了一个问题。想问问大家的意见，有没有什么比较合适的解决方案。</p>
<p>这个小程序大体分了了M，VM，V三层，一层一个DLL。（也许这就有问题&#8230;&#8230;）其中VM层里定义了Command。V层里都是窗体类。</p>
<p>关系是：V使用VM和M，VM使用M。</p>
<p>问题是这样的：有一个Command（在VM层）需要窗体的切换（跳转），但是从VM层又无法直接使用V层的窗体类。一时不知道用哪种方式实现比较好。</p>
<p>自己想到的有这样几个方法。</p>
<p>1. 在M层定义一个公共的CommandProcess，并由V层具体实现，然后在VM层发消息到M层，由V处理。</p>
<p>2. 在M层为所有窗体类做抽象，并维护窗体列表，由V实例化。然后VM使用M层定义的抽象窗体列表进行跳转。</p>
<p>3. 将VM和V合并到一个DLL中。</p>
<p>4. 使用反射。</p>
<p>5. 将Command放在V层，或不使用Command?</p>
<p>不知大家建议应该怎么做呢？</p>
<img src ="http://www.cnblogs.com/nankezhishi/aggbug/1414783.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47957/" target="_blank">乔布斯和埃利森</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>Visual Studio Unit Test VS NUnit</title><link>http://www.cnblogs.com/nankezhishi/archive/2009/02/24/1397480.html</link><dc:creator>南柯之石</dc:creator><author>南柯之石</author><pubDate>Tue, 24 Feb 2009 12:20:00 GMT</pubDate><guid>http://www.cnblogs.com/nankezhishi/archive/2009/02/24/1397480.html</guid><wfw:comment>http://www.cnblogs.com/nankezhishi/comments/1397480.html</wfw:comment><comments>http://www.cnblogs.com/nankezhishi/archive/2009/02/24/1397480.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cnblogs.com/nankezhishi/comments/commentRss/1397480.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/nankezhishi/services/trackbacks/1397480.html</trackback:ping><description><![CDATA[<p><span style="font-family: 宋体">公司里用的是</span>NUnit<span style="font-family: 宋体">，但是用起来并不觉得好用，因为发现VS的测试代码可以自动生成的。于是大致比较了一下</span>Visual Studio<span style="font-family: 宋体">里自带的</span>Unit Test<span style="font-family: 宋体">和</span>NUnit<span style="font-family: 宋体">的区别。</span></p>
<p><span style="font-family: 宋体">在</span>stackoverflow<span style="font-family: 宋体">上有人讨论过这个问题。下面的条目都是摘自各个网页。做个汇总，方便大家参考。</span>&nbsp;</p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体">最表面上来看，用的类库不同，这个问题很好通过一个宏来解决。</span></p>
<p>&nbsp;</p>
<p>#if !NUNIT</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; using Microsoft.VisualStudio.TestTools.UnitTesting;</p>
<p>&nbsp;#else</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; using NUnit.Framework;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; using TestClass = NUnit.Framework.TestFixtureAttribute;</p>
<p>&nbsp;&nbsp;&nbsp; &nbsp;using TestMethod = NUnit.Framework.TestAttribute;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; using TestInitialize = NUnit.Framework.SetUpAttribute;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; using TestCleanup = NUnit.Framework.TearDownAttribute;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; using TestContext = System.String;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; using DeploymentItem = NUnit.Framework.DescriptionAttribute;</p>
<p>&nbsp;#endif</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>NUnit<span style="font-family: 宋体">有这样几个优点</span></p>
<p style="text-indent: -18pt; margin: 0cm 0cm 0pt 18pt">1.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">独立于</span>IDE<span style="font-family: 宋体">，可以单独运行。也可以以命令行方式运行。（</span>vs<span style="font-family: 宋体">应该也可以吧？）</span></p>
<p style="text-indent: -18pt; margin: 0cm 0cm 0pt 18pt">2.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">版本更新快。（我不认为这是个优点，而且我也并不觉得快啊。）</span></p>
<p style="text-indent: -18pt; margin: 0cm 0cm 0pt 18pt">3.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>VS<span style="font-family: 宋体">的</span>UT<span style="font-family: 宋体">工具运行速度慢。（不一定）</span></p>
<p>&nbsp;</p>
<p>NUite<span style="font-family: 宋体">也有这样几个缺点</span></p>
<p style="text-indent: -18pt; margin: 0cm 0cm 0pt 18pt">1.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">不支持</span>Debug<span style="font-family: 宋体">，要安装</span>TestDriven.NET<span style="font-family: 宋体">才支持。</span></p>
<p style="text-indent: -18pt; margin: 0cm 0cm 0pt 18pt">2.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">不支持代码覆盖率的查看，要和</span>NCover<span style="font-family: 宋体">一起用。而</span>VS<span style="font-family: 宋体">的代码覆盖很清楚。</span></p>
<p style="text-indent: -18pt; margin: 0cm 0cm 0pt 18pt">3.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">不能自动生成测试代码，也许和</span>CodeSmith<span style="font-family: 宋体">一起用好些，不过后着要收费的。</span></p>
<p style="text-indent: -18pt; margin: 0cm 0cm 0pt 18pt">&nbsp;</p>
<p style="text-indent: -18pt; margin: 0cm 0cm 0pt 18pt"><span style="font-family: 宋体"><span style="color: #0000ff"><span style="color: #0000ff">补充一点：NCover生成的XML太大了，动不动IE就Crash了，（用NCoverExplorer更好，不过公司没有&#8230;&#8230;）。今天找了半天，都没有找到办法让NCover只生成特定Namespace的数据的命令行参数。最后改了xsl,不显示Method级的XML，好了些。</span></span></span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>VS UT<span style="font-family: 宋体">最大的缺点——价格！只有</span>VS Pro<span style="font-family: 宋体">才支持</span>UT<span style="font-family: 宋体">，只有</span>VSTS<span style="font-family: 宋体">才支持代码覆盖。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体">还有人认为</span>VSUT<span style="font-family: 宋体">比较难以与</span>CC.NET<span style="font-family: 宋体">集成。虽然没有去试着在</span>CC<span style="font-family: 宋体">中直接使用</span>VSUT<span style="font-family: 宋体">，但是感觉应该是可以的。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体">再来看一下</span>VS<span style="font-family: 宋体">的价格。</span></p>
<p>&nbsp;</p>
<table style="border-bottom: medium none; border-left: medium none; border-collapse: collapse; border-top: medium none; border-right: medium none" border="1" cellspacing="0" cellpadding="0">
    <tr>
            <td style="border-bottom: black 1pt solid; border-left: black 1pt solid; padding-bottom: 0cm; background-color: transparent; padding-left: 5.4pt; width: 114.45pt; padding-right: 5.4pt; border-top: black 1pt solid; border-right: black 1pt solid; padding-top: 0cm" valign="top" width="153">
            <p>&nbsp;</p>
            </td>
            <td style="border-bottom: black 1pt solid; border-left: #f0f0f0; padding-bottom: 0cm; background-color: transparent; padding-left: 5.4pt; width: 106pt; padding-right: 5.4pt; border-top: black 1pt solid; border-right: black 1pt solid; padding-top: 0cm" valign="top" width="141">
            <p>With Premium MSDN</p>
            </td>
            <td style="border-bottom: black 1pt solid; border-left: #f0f0f0; padding-bottom: 0cm; background-color: transparent; padding-left: 5.4pt; width: 96.75pt; padding-right: 5.4pt; border-top: black 1pt solid; border-right: black 1pt solid; padding-top: 0cm" valign="top" width="129">
            <p>With Professional MSDN</p>
            </td>
            <td style="border-bottom: black 1pt solid; border-left: #f0f0f0; padding-bottom: 0cm; background-color: transparent; padding-left: 5.4pt; width: 108.9pt; padding-right: 5.4pt; border-top: black 1pt solid; border-right: black 1pt solid; padding-top: 0cm" valign="top" width="145">
            <p>Without MSDN</p>
            </td>
        </tr>
        <tr>
            <td style="border-bottom: black 1pt solid; border-left: black 1pt solid; padding-bottom: 0cm; background-color: transparent; padding-left: 5.4pt; width: 114.45pt; padding-right: 5.4pt; border-top: #f0f0f0; border-right: black 1pt solid; padding-top: 0cm" valign="top" width="153">
            <p>VS 2008 Team System</p>
            </td>
            <td style="border-bottom: black 1pt solid; border-left: #f0f0f0; padding-bottom: 0cm; background-color: transparent; padding-left: 5.4pt; width: 106pt; padding-right: 5.4pt; border-top: #f0f0f0; border-right: black 1pt solid; padding-top: 0cm" valign="top" width="141">
            <p>$10939</p>
            </td>
            <td style="border-bottom: black 1pt solid; border-left: #f0f0f0; padding-bottom: 0cm; background-color: transparent; padding-left: 5.4pt; width: 96.75pt; padding-right: 5.4pt; border-top: #f0f0f0; border-right: black 1pt solid; padding-top: 0cm" valign="top" width="129">
            <p>&nbsp;</p>
            </td>
            <td style="border-bottom: black 1pt solid; border-left: #f0f0f0; padding-bottom: 0cm; background-color: transparent; padding-left: 5.4pt; width: 108.9pt; padding-right: 5.4pt; border-top: #f0f0f0; border-right: black 1pt solid; padding-top: 0cm" valign="top" width="145">
            <p>&nbsp;</p>
            </td>
        </tr>
        <tr>
            <td style="border-bottom: black 1pt solid; border-left: black 1pt solid; padding-bottom: 0cm; background-color: transparent; padding-left: 5.4pt; width: 114.45pt; padding-right: 5.4pt; border-top: #f0f0f0; border-right: black 1pt solid; padding-top: 0cm" valign="top" width="153">
            <p>VS 2008 Professional</p>
            </td>
            <td style="border-bottom: black 1pt solid; border-left: #f0f0f0; padding-bottom: 0cm; background-color: transparent; padding-left: 5.4pt; width: 106pt; padding-right: 5.4pt; border-top: #f0f0f0; border-right: black 1pt solid; padding-top: 0cm" valign="top" width="141">
            <p>$2499</p>
            </td>
            <td style="border-bottom: black 1pt solid; border-left: #f0f0f0; padding-bottom: 0cm; background-color: transparent; padding-left: 5.4pt; width: 96.75pt; padding-right: 5.4pt; border-top: #f0f0f0; border-right: black 1pt solid; padding-top: 0cm" valign="top" width="129">
            <p>$1199</p>
            </td>
            <td style="border-bottom: black 1pt solid; border-left: #f0f0f0; padding-bottom: 0cm; background-color: transparent; padding-left: 5.4pt; width: 108.9pt; padding-right: 5.4pt; border-top: #f0f0f0; border-right: black 1pt solid; padding-top: 0cm" valign="top" width="145">
            <p>$799</p>
            </td>
        </tr>
        <tr>
            <td style="border-bottom: black 1pt solid; border-left: black 1pt solid; padding-bottom: 0cm; background-color: transparent; padding-left: 5.4pt; width: 114.45pt; padding-right: 5.4pt; border-top: #f0f0f0; border-right: black 1pt solid; padding-top: 0cm" valign="top" width="153">
            <p>VS 2008 Standard</p>
            </td>
            <td style="border-bottom: black 1pt solid; border-left: #f0f0f0; padding-bottom: 0cm; background-color: transparent; padding-left: 5.4pt; width: 106pt; padding-right: 5.4pt; border-top: #f0f0f0; border-right: black 1pt solid; padding-top: 0cm" valign="top" width="141">
            <p>&nbsp;</p>
            </td>
            <td style="border-bottom: black 1pt solid; border-left: #f0f0f0; padding-bottom: 0cm; background-color: transparent; padding-left: 5.4pt; width: 96.75pt; padding-right: 5.4pt; border-top: #f0f0f0; border-right: black 1pt solid; padding-top: 0cm" valign="top" width="129">
            <p>&nbsp;</p>
            </td>
            <td style="border-bottom: black 1pt solid; border-left: #f0f0f0; padding-bottom: 0cm; background-color: transparent; padding-left: 5.4pt; width: 108.9pt; padding-right: 5.4pt; border-top: #f0f0f0; border-right: black 1pt solid; padding-top: 0cm" valign="top" width="145">
            <p>$299</p>
            </td>
        </tr>
    </table>
<p>&nbsp;</p>
<p><span style="font-family: 宋体">最新报价请参考：</span><a href="http://msdn.microsoft.com/en-us/aa700832.aspx">http://msdn.microsoft.com/en-us/aa700832.aspx</a> </p>
<p>&nbsp;&nbsp;</p>
<p>另外，ReSharper<span style="font-family: 宋体">（</span>30<span style="font-family: 宋体">天试用）、</span>xUnit<span style="font-family: 宋体">（开源）、</span>MbUnit<span style="font-family: 宋体">也都是</span>UT<span style="font-family: 宋体">的不错选择。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体">参考：</span><a href="http://stackoverflow.com/questions/92869/nunit-vs-visual-studio-2008s-test-projects-for-unit-testing">http://stackoverflow.com/questions/92869/nunit-vs-visual-studio-2008s-test-projects-for-unit-testing</a> </p>
<p><a href="http://stackoverflow.com/questions/709/net-testing-framework-advice">http://stackoverflow.com/questions/709/net-testing-framework-advice</a> </p>
<p><a href="http://stackoverflow.com/questions/1760/net-unit-testing-packages">http://stackoverflow.com/questions/1760/net-unit-testing-packages</a> </p>
<p>&nbsp;</p>
<img src ="http://www.cnblogs.com/nankezhishi/aggbug/1397480.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47956/" target="_blank">Xbox Live将投放Silverlight广告</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>为了吃得健康点儿，给大家提个醒</title><link>http://www.cnblogs.com/nankezhishi/archive/2009/02/22/1395948.html</link><dc:creator>南柯之石</dc:creator><author>南柯之石</author><pubDate>Sun, 22 Feb 2009 08:34:00 GMT</pubDate><guid>http://www.cnblogs.com/nankezhishi/archive/2009/02/22/1395948.html</guid><wfw:comment>http://www.cnblogs.com/nankezhishi/comments/1395948.html</wfw:comment><comments>http://www.cnblogs.com/nankezhishi/archive/2009/02/22/1395948.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cnblogs.com/nankezhishi/comments/commentRss/1395948.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/nankezhishi/services/trackbacks/1395948.html</trackback:ping><description><![CDATA[<p><span style="font-family: 宋体">其实这个标题就是在自欺欺人。了解一些现在食品现状之后发现，真想吃得健康，只能是自己动手，丰衣足食了。既然做不到，那只能多了解一下，外面卖的什么东西吃了不太健康，要注意量。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体">有人对此倒是看得很开，知道现在其实什么东西都不健康，可是知道不能不吃啊。结果都懒得去了解什么不健康，也全然不在乎吃东西健康不健康，反正大家都这么吃，要死一起死，活下来了还给人类的进化做贡献了不是？</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体">最近牛奶出了那么多事儿，从三聚氰胺、</span>OMP<span style="font-family: 宋体">、到最近的苯甲酸，火车上也听一养牛的说，所谓的天然牧场根本就不存在。已经对牛奶彻底失去了信心。可是还时不时喝着，没办法，人在江湖，身不由己。有人说不喝不就是了？其实多了解一些就会发现，什么都是有问题的。牛奶还算好一些的，因为喝的人多，被关注得多，不敢太放肆。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体">最近了解了一些食品上的信息，分享给大家，希望能给大家在吃上一些提示。</span></p>
<p>&nbsp;</p>
<p>1.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">珍珠奶茶：没有奶，也没有茶。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体">把这个放第一条，因为奶茶这个东西到处都是，危害不大，却最广泛。珍珠奶茶，主要成份奶精、糖、香精、色素，奶精含有的氢化植物油（俗称反式脂肪酸），提高心血管病风险。里面只有糖还有点儿用。如果放糖精呢？</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体">当然不是所有的奶茶都这样，不过路边</span>3<span style="font-family: 宋体">、</span>5<span style="font-family: 宋体">、</span>8<span style="font-family: 宋体">元一杯的一定是的。在石家庄这样的中等城市，真正的奶茶，一杯至少在</span>20<span style="font-family: 宋体">元以上。（曾经有过这么一个地方，好像叫什么&#8220;绿野仙踪&#8221;啊？忘了，后来也关了&#8230;&#8230;）谢谢，我回家自己兑去。</span></p>
<p>&nbsp;</p>
<p style="text-indent: -18pt; margin: 0cm 0cm 0pt 18pt">2.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">反式脂肪酸：不常见——罕见的名字，其实无处不在。由植物油人工氢化而成，天然食品中含量极少。能增加食品酥脆感、比脂肪酸易于长期保存（因为连一部分微生物都不认这东西&#8230;&#8230;），最重要的是成本低。世界卫生组织的建议摄入量为低于总热量的</span>1%<span style="font-family: 宋体">。大致是</span>2g<span style="font-family: 宋体">。因为其会导致动脉硬化。</span></p>
<p style="margin: 0cm 0cm 0pt 18pt"><span style="font-family: 宋体">那么什么食品里有呢？简单而言，有奶油或黄油的基本就有。因为没有几个会放天然奶油或天然黄油的。拿面包来说，我所知的在上海使用天然奶油的只有</span>Breadtalk<span style="font-family: 宋体">。但是那东西的价格不是所有人都承受得了的。</span></p>
<p style="margin: 0cm 0cm 0pt 18pt"><span style="font-family: 宋体">列举一下：人造黄油、巧克力、糖果、蛋糕、面包、饼干、薯片、奶精、几乎所有油炸食品（比如方便面）、比萨饼、人造奶油、爆米花、威化饼、部分沙拉酱、全部咖啡伴侣、麦片、汤圆、芝麻糊&#8230;&#8230;。</span></p>
<p style="margin: 0cm 0cm 0pt 18pt">&nbsp;</p>
<p style="margin: 0cm 0cm 0pt 18pt"><span style="font-family: 宋体">另外，几乎所有的方便面都说自己的&#8220;非油炸食品&#8221;，就像说自己没有放防腐剂一样，就像一些牛奶说是来自天然牧场一样，真的假的？呵呵，反正目前没有人反对这么写，是吧？（五谷道场好像不是油炸的，不过已经倒了）</span></p>
<p style="margin: 0cm 0cm 0pt 18pt">&nbsp;</p>
<p style="margin: 0cm 0cm 0pt 18pt"><span style="font-family: 宋体">所以，给老人过生日，如果不放心，先把奶油刮了再吃吧。</span></p>
<p style="margin: 0cm 0cm 0pt 18pt">&nbsp;</p>
<p style="margin: 0cm 0cm 0pt 18pt"><span style="font-family: 宋体">看网上有人把蛋挞列为十大不健康食品，理由是猪油放多了。我想说，要是放的真是猪油，我&#8230;&#8230;我感谢他十八代祖宗！</span></p>
<p style="margin: 0cm 0cm 0pt 18pt">&nbsp;</p>
<p style="margin: 0cm 0cm 0pt 18pt">PS<span style="font-family: 宋体">：美国本士的</span>KFC<span style="font-family: 宋体">，炸东西用的是大豆油</span>[<span style="font-family: 宋体">信息来源：</span>WIKI]<span style="font-family: 宋体">，是因为有人告了，中国地区呢？好像目前还没有人告。</span></p>
<p style="margin: 0cm 0cm 0pt 18pt">&nbsp;</p>
<p style="text-indent: -18pt; margin: 0cm 0cm 0pt 18pt">3.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">猪肉（内脏部分）：丁磊为什么养猪？我要是有足够的钱，我也想，这年头，吃个健康的猪真是不容易啊。但是我们要现实一点。毕竟目前多数猪都是吃瘦肉精长大的。这也难怪，现在全民都不爱吃肥肉，猪为是为大家着想啊。毕竟猪肉里瘦肉精残留得不多，主要都留在了肝和肺里，近</span>10<span style="font-family: 宋体">年，仅上海，有记录的就有</span><a href="http://news.sina.com.cn/z/shouroujing/index.shtml">1700<span style="font-family: 宋体">人瘦肉精中毒</a></span><span style="font-family: 宋体">，</span>1<span style="font-family: 宋体">人死亡。</span></p>
<p style="margin: 0cm 0cm 0pt 18pt">&nbsp;</p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体">最后给大家一个很久的链接。</span><a href="http://bbs.zjol.com.cn/thread-2896226-1-4.html">42<span style="font-family: 宋体">种有毒食品，图文并茂</a></span><span style="font-family: 宋体">。但愿现在已经有所改善了吧。</span></p>
<p>&nbsp;</p>
<img src ="http://www.cnblogs.com/nankezhishi/aggbug/1395948.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47951/" target="_blank">Debian无视GNU创始人警告 接受Mono</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>NUnit测试WPF程序的一个小技巧</title><link>http://www.cnblogs.com/nankezhishi/archive/2009/02/19/1394366.html</link><dc:creator>南柯之石</dc:creator><author>南柯之石</author><pubDate>Thu, 19 Feb 2009 14:45:00 GMT</pubDate><guid>http://www.cnblogs.com/nankezhishi/archive/2009/02/19/1394366.html</guid><wfw:comment>http://www.cnblogs.com/nankezhishi/comments/1394366.html</wfw:comment><comments>http://www.cnblogs.com/nankezhishi/archive/2009/02/19/1394366.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/nankezhishi/comments/commentRss/1394366.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/nankezhishi/services/trackbacks/1394366.html</trackback:ping><description><![CDATA[<p><span style="font-family: 宋体">今天有同事给一个</span>WPF<span style="font-family: 宋体">程序的后台逻辑写</span>UT<span style="font-family: 宋体">，用的是</span>NUnit<span style="font-family: 宋体">框架，写之前感觉</span>UI<span style="font-family: 宋体">不好写</span>UT<span style="font-family: 宋体">，给后台逻辑写</span>UT<span style="font-family: 宋体">应该是没有什么问题，但是写开了才发现问题。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体">问题就出在了后台逻辑获取资源的部分，代码类似下面。</span></p>
<p>&nbsp;</p>
<p>Application.Current.Resources[XXXX]</p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体">运行时抛出</span>NullReferenceException<span style="font-family: 宋体">，</span>Application.Current<span style="font-family: 宋体">为</span>null<span style="font-family: 宋体">。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体">很好理解，当前由于是用</span>NUnit<span style="font-family: 宋体">测试后台</span>DLL<span style="font-family: 宋体">，这时这个程序是基于</span>WinForm<span style="font-family: 宋体">的，而代码中要获得的是</span>WPF Application<span style="font-family: 宋体">，的确应该是</span>null<span style="font-family: 宋体">。这时才发现代码写得有问题——可测试性不好，但是代码已经冻结了，不是</span>Fix bug<span style="font-family: 宋体">不可以改。（这个时候才开始写</span>UT<span style="font-family: 宋体">，汗&#8230;&#8230;）而这种代码在</span>DLL<span style="font-family: 宋体">中也不少。怎么办呢？</span></p>
<p>&nbsp;</p>
<p>Application.Current<span style="font-family: 宋体">是只读的，在</span>UT<span style="font-family: 宋体">里先启动原来的</span>WPF<span style="font-family: 宋体">程序？肯定不行的。只读其实不是问题，邪恶地想到了用反射给后面的变量直接赋值。得知道变量名啊，打开</span>Reflector<span style="font-family: 宋体">，发现变量名叫</span>_appInstance<span style="font-family: 宋体">，好在这时多想了一个问题，这个变量是什么时候被赋值的呢？第一感觉就是在个什么初始化的方法里，没找几个就发现就是在</span>Appliction<span style="font-family: 宋体">的构造函数里。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体">看来不用反射了。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体">在</span>UT<span style="font-family: 宋体">的</span>Startup<span style="font-family: 宋体">方法里加两行代码。</span></p>
<p>&nbsp;</p>
<p>Application app = new Appliction();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //这个app，就是Application.Current</p>
<p>Application.Current.Resources = Application.LoadComponents(&#8230;);</p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体">完成，这样资源就可以被正常地访问到了。如果没看一下源代码，真要傻呼呼地用反射赋值了。</span></p>
<img src ="http://www.cnblogs.com/nankezhishi/aggbug/1394366.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47950/" target="_blank">iPhone 3GS首发日创AT&T多项纪录</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>[WPF Bug清单]之(8)——RowDefinition中MaxHeight在一定条件下失效</title><link>http://www.cnblogs.com/nankezhishi/archive/2009/02/11/1388706.html</link><dc:creator>南柯之石</dc:creator><author>南柯之石</author><pubDate>Wed, 11 Feb 2009 15:32:00 GMT</pubDate><guid>http://www.cnblogs.com/nankezhishi/archive/2009/02/11/1388706.html</guid><wfw:comment>http://www.cnblogs.com/nankezhishi/comments/1388706.html</wfw:comment><comments>http://www.cnblogs.com/nankezhishi/archive/2009/02/11/1388706.html#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://www.cnblogs.com/nankezhishi/comments/commentRss/1388706.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/nankezhishi/services/trackbacks/1388706.html</trackback:ping><description><![CDATA[<p>    </p>
再下一城。
<p>BUG<span style="font-family: 宋体;">描述：当</span>RowDefinition<span style="font-family: 宋体;">的</span>Height<span style="font-family: 宋体;">属性被设置为</span>Auto<span style="font-family: 宋体;">时，</span>MaxHeight<span style="font-family: 宋体;">将不会对这个</span>Row<span style="font-family: 宋体;">的</span>Height<span style="font-family: 宋体;">起到限制作用。</span></p>
<p>&nbsp;</p>
<p>Bug<span style="font-family: 宋体;">发现过程：想做一个像</span>Visual Studio 2008<span style="font-family: 宋体;">里</span>Error List<span style="font-family: 宋体;">一样的东西。平时自动占用最小的空间，可以在适当的时候自己弹出来，但是又不要弹得过高。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体;">示例窗口代码如下：</span>&nbsp;</p>
<div class="cnblogs_code"><img id="Code_Closed_Image_233057" onclick="this.style.display='none'; document.getElementById('Code_Closed_Text_233057').style.display='none'; document.getElementById('Code_Open_Image_233057').style.display='inline'; document.getElementById('Code_Open_Text_233057').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" align="top" width="11" height="16"><img style="display: none;" id="Code_Open_Image_233057" onclick="this.style.display='none'; document.getElementById('Code_Open_Text_233057').style.display='none'; getElementById('Code_Closed_Image_233057').style.display='inline'; getElementById('Code_Closed_Text_233057').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top" width="11" height="16"><span id="Code_Closed_Text_233057" class="cnblogs_code_Collapse">Demo Window</span><span style="display: none;" id="Code_Open_Text_233057"><br />
<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" /><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">Window&nbsp;</span><span style="color: #ff0000;">x:Class</span><span style="color: #0000ff;">="InvaliMaxHeight.DemoWindow"</span><span style="color: #ff0000;"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;xmlns</span><span style="color: #0000ff;">="http://schemas.microsoft.com/winfx/2006/xaml/presentation"</span><span style="color: #ff0000;"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;xmlns:x</span><span style="color: #0000ff;">="http://schemas.microsoft.com/winfx/2006/xaml"</span><span style="color: #ff0000;"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;Title</span><span style="color: #0000ff;">="MaxHeight&nbsp;of&nbsp;RowDefinition&nbsp;NOT&nbsp;Effct"</span><span style="color: #ff0000;"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;WindowStartupLocation</span><span style="color: #0000ff;">="CenterScreen"</span><span style="color: #ff0000;"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;Height</span><span style="color: #0000ff;">="240"</span><span style="color: #ff0000;">&nbsp;Width</span><span style="color: #0000ff;">="300"</span><span style="color: #ff0000;"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;ResizeMode</span><span style="color: #0000ff;">="NoResize"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">Grid</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">Grid.RowDefinitions</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">RowDefinition</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">RowDefinition&nbsp;</span><span style="color: #ff0000;">Height</span><span style="color: #0000ff;">="5"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">RowDefinition&nbsp;</span><span style="color: #ff0000;">Height</span><span style="color: #0000ff;">="Auto"</span><span style="color: #ff0000;">&nbsp;MaxHeight</span><span style="color: #0000ff;">="50"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">Grid.RowDefinitions</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">DockPanel&nbsp;</span><span style="color: #ff0000;">Margin</span><span style="color: #0000ff;">="12"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">TextBlock&nbsp;</span><span style="color: #ff0000;">DockPanel.Dock</span><span style="color: #0000ff;">="Top"</span><span style="color: #ff0000;">&nbsp;TextWrapping</span><span style="color: #0000ff;">="Wrap"</span><span style="color: #ff0000;"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Text</span><span style="color: #0000ff;">="XXX"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">Button&nbsp;</span><span style="color: #ff0000;">Content</span><span style="color: #0000ff;">="Show&nbsp;Large&nbsp;Tab"</span><span style="color: #ff0000;"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Click</span><span style="color: #0000ff;">="OnShowLargeTabClick"</span><span style="color: #ff0000;"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HorizontalAlignment</span><span style="color: #0000ff;">="Center"</span><span style="color: #ff0000;"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;VerticalAlignment</span><span style="color: #0000ff;">="Center"</span><span style="color: #ff0000;">&nbsp;Width</span><span style="color: #0000ff;">="125"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">DockPanel</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">GridSplitter&nbsp;</span><span style="color: #ff0000;">Grid.Row</span><span style="color: #0000ff;">="1"</span><span style="color: #ff0000;">&nbsp;HorizontalAlignment</span><span style="color: #0000ff;">="Stretch"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">TabControl&nbsp;</span><span style="color: #ff0000;">Grid.Row</span><span style="color: #0000ff;">="2"</span><span style="color: #ff0000;">&nbsp;Margin</span><span style="color: #0000ff;">="12"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">TabItem&nbsp;</span><span style="color: #ff0000;">Header</span><span style="color: #0000ff;">="Empty&nbsp;Tab"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">TabItem&nbsp;</span><span style="color: #ff0000;">Header</span><span style="color: #0000ff;">="Large&nbsp;Tab"</span><span style="color: #ff0000;">&nbsp;Name</span><span style="color: #0000ff;">="largeTab"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">ListBox&nbsp;</span><span style="color: #ff0000;">Name</span><span style="color: #0000ff;">="listBox"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">TabItem</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">TabControl</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">Grid</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" /></span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">Window</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" /></span></span></div>
<p>&nbsp;</p>
<p><span style="font-family: 宋体;">注：</span>RowDefinition<span style="font-family: 宋体;">的</span>Height<span style="font-family: 宋体;">的默认值为</span>*<span style="font-family: 宋体;">。</span>&nbsp;</p>
<p><span style="font-family: 宋体;">为了避免多余代码产生不必要的误会，上面的代码中尽量减少了大小的设置。设置的</span>Margin<span style="font-family: 宋体;">是为了美观。运行效果如下图。</span>&nbsp;</p>
<div align="center"><img alt="" src="http://www.cnblogs.com/images/cnblogs_com/nankezhishi/WPFBug/InvalidMaxHeight/Startup.PNG" border="0" width="339" height="278" /></div>
<p align="center"></p>
<p align="center"><span style="font-family: 宋体;">图</span>1. Startup</p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体;">可能大家不知道</span>50px<span style="font-family: 宋体;">有多大，大概就是现在灰线下的部分的高度。就是说点击</span>Button<span style="font-family: 宋体;">之后，高度不应该有太大的变化。可是结果却是这样。</span>&nbsp;</p>
<div align="center"><img alt="" src="http://www.cnblogs.com/images/cnblogs_com/nankezhishi/WPFBug/InvalidMaxHeight/Clicked.PNG" border="0" width="344" height="284" /></div>
<p align="center"></p>
<p align="center"><span style="font-family: 宋体;">图</span>2. Clicked</p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体;">这时，如果拖一下上面的</span>GridSplitter<span style="font-family: 宋体;">，那么</span>Large Tab<span style="font-family: 宋体;">那个部分又会突然变小。</span></p>
<p><span style="font-family: 宋体;"><a href="http://www.cnblogs.com/Files/nankezhishi/InvaliMaxHeight.zip"><span style="font-family: 宋体;">程序源代码</span></a></span>&nbsp;</p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体;">同系列的其它文章：</span> <br />
</p>
<p><a href="http://www.cnblogs.com/nankezhishi/archive/2008/12/13/1354226.html">[WPF Bug<span style="font-family: 宋体;">清单](<span style="font-family: 宋体;">序</span>)<span style="font-family: 宋体;">与之</span>(1)——<span style="font-family: 宋体;">可以多选的单选</span>ListBox</span></a></p>
<p><a href="http://www.cnblogs.com/nankezhishi/archive/2008/12/14/1354913.html">[WPF Bug<span style="font-family: 宋体;">清单]<span style="font-family: 宋体;">之</span>(2)——RadioButton<span style="font-family: 宋体;">的</span>IsChecked<span style="font-family: 宋体;">绑定失效</span></span></a></p>
<p><a href="http://www.cnblogs.com/nankezhishi/archive/2008/12/20/1359078.html">[WPF Bug<span style="font-family: 宋体;">清单]<span style="font-family: 宋体;">之</span>(3)——<span style="font-family: 宋体;">暗中创建文件的打开文件对话框</span></span></a></p>
<p><a href="http://www.cnblogs.com/nankezhishi/archive/2009/01/11/1373670.html">[WPF Bug<span style="font-family: 宋体;">清单]<span style="font-family: 宋体;">之</span>(4)——<span style="font-family: 宋体;">点击</span>RadioButton<span style="font-family: 宋体;">的空白没有反应</span></span></a></p>
<p><a href="http://www.cnblogs.com/nankezhishi/archive/2009/02/05/1384897.html">[WPF Bug<span style="font-family: 宋体;">清单]<span style="font-family: 宋体;">之</span>(5)——<span style="font-family: 宋体;">隐藏模态对话框后变成非模态</span></span></a></p>
<p><a href="http://www.cnblogs.com/nankezhishi/archive/2009/02/09/1387052.html">[WPF Bug<span style="font-family: 宋体;">清单]<span style="font-family: 宋体;">之</span>(6)——Button<span style="font-family: 宋体;">的</span>IsCancel<span style="font-family: 宋体;">属性失效</span></span></a></p>
<p><a href="http://www.cnblogs.com/nankezhishi/archive/2009/02/10/1387800.html">[WPF Bug<span style="font-family: 宋体;">清单]<span style="font-family: 宋体;">之</span>(7)——<span style="font-family: 宋体;">顽固的</span>Error Template</span></a></p>
<p><a href="http://www.cnblogs.com/nankezhishi/archive/2009/03/19/1417151.html">[WPF Bug<span style="font-family: 宋体;">清单]<span style="font-family: 宋体;">之</span>(9)——<span style="font-family: 宋体;">消失的光标</span></span></a></p>
<p>&nbsp;</p>
<p>&nbsp;</p><img src ="http://www.cnblogs.com/nankezhishi/aggbug/1388706.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47949/" target="_blank">Silverlight开发大赛奖金高达10000美元</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>[WPF Bug清单]之(7)——顽固的Error Template</title><link>http://www.cnblogs.com/nankezhishi/archive/2009/02/10/1387800.html</link><dc:creator>南柯之石</dc:creator><author>南柯之石</author><pubDate>Tue, 10 Feb 2009 14:50:00 GMT</pubDate><guid>http://www.cnblogs.com/nankezhishi/archive/2009/02/10/1387800.html</guid><wfw:comment>http://www.cnblogs.com/nankezhishi/comments/1387800.html</wfw:comment><comments>http://www.cnblogs.com/nankezhishi/archive/2009/02/10/1387800.html#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://www.cnblogs.com/nankezhishi/comments/commentRss/1387800.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/nankezhishi/services/trackbacks/1387800.html</trackback:ping><description><![CDATA[<span style="font-family: 宋体;">关于</span>WPF<span style="font-family: 宋体;">数据绑定是什么，请参考</span><a href="http://msdn.microsoft.com/en-us/library/ms752347.aspx">Data Binding Overview</a><span style="font-family: 宋体;">。</span>
<p><span style="font-family: 宋体;">关于</span>WPF<span style="font-family: 宋体;">数据绑定的</span>Validation<span style="font-family: 宋体;">更多细节，请参考</span><a href="http://blogs.msdn.com/wpfsdk/archive/2007/10/02/data-validation-in-3-5.aspx">Data Validation in 3.5</a><span style="font-family: 宋体;">。</span></p>
<p><span style="font-family: 宋体;">关于</span>WPF<span style="font-family: 宋体;">数据绑定的</span>Validation<span style="font-family: 宋体;">中的</span>ErrorTemplate<span style="font-family: 宋体;">怎么用，请参考</span><a href="http://msdn.microsoft.com/en-us/library/system.windows.controls.validation.errortemplate.aspx">ErrorTemplate Attached Property</a><span style="font-family: 宋体;">。</span></p>
<p>ErrorTemplate<span style="font-family: 宋体;">将被绘制在</span>Adorner Layer<span style="font-family: 宋体;">上，关于</span>Adorner Layer<span style="font-family: 宋体;">，请参考</span><a href="http://msdn.microsoft.com/en-us/library/ms743737.aspx">Adorners Overview</a><span style="font-family: 宋体;">。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体;">在</span>Adorners Overview<span style="font-family: 宋体;">里，对</span>Adorner<span style="font-family: 宋体;">是这样解释的，</span>&nbsp;</p>
<p>Adorners are rendered in an <a href="http://msdn.microsoft.com/en-us/library/system.windows.documents.adornerlayer.aspx">AdornerLayer</a>, which is a rendering surface that is always on top of the <span style="color: red;">adorned element or a collection of adorned elements.</span></p>
<p>&nbsp;</p>
<p>Adorned element<span style="font-family: 宋体;">的红色是我加的。表面上看，这个</span>adorned element<span style="font-family: 宋体;">就是一个</span>element<span style="font-family: 宋体;">，但是这个</span>element<span style="font-family: 宋体;">的范围有多大呢？对我们的程序会有什么影响呢？看文档很难想到。用过之后才知道，影响太大了。</span>&nbsp;</p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体;">还有这样一个不太起眼的</span>Note<span style="font-family: 宋体;">。</span>&nbsp;</p>
<p>Anything placed in the adorner layer is rendered on top of the rest of any styles you have set. In other words, adorners are always visually on top and cannot be overridden using z-order.</p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体;">这句话是对的。大意就是说这个</span>Adorner layer<span style="font-family: 宋体;">里的东西，总会被绘制在它所</span>adorn<span style="font-family: 宋体;">的东西之上。这个无可厚非，人家这样设计，我们就这么用就是了。但是，问题就在于，一个</span>Window<span style="font-family: 宋体;">里的东西，是可以有层次的，有区域，有可见性的。但是</span>adorner layer<span style="font-family: 宋体;">不分青红皂白地总在最上。结果就出了问题。请看<a href="http://www.cnblogs.com/Files/nankezhishi/FixErrorTemplate.zip">下面的例子</a>。</span></p>
<p>&nbsp;</p>
<div class="cnblogs_code"><img id="Code_Closed_Image_224735" onclick="this.style.display='none'; document.getElementById('Code_Closed_Text_224735').style.display='none'; document.getElementById('Code_Open_Image_224735').style.display='inline'; document.getElementById('Code_Open_Text_224735').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" align="top" width="11" height="16"><img style="display: none;" id="Code_Open_Image_224735" onclick="this.style.display='none'; document.getElementById('Code_Open_Text_224735').style.display='none'; getElementById('Code_Closed_Image_224735').style.display='inline'; getElementById('Code_Closed_Text_224735').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top" width="11" height="16"><span id="Code_Closed_Text_224735" class="cnblogs_code_Collapse">DemoWindow</span><span style="display: none;" id="Code_Open_Text_224735"><br />
<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">Window&nbsp;</span><span style="color: #ff0000;">x:Class</span><span style="color: #0000ff;">="FixErrorTemplate.DemoWindow"</span><span style="color: #ff0000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;xmlns</span><span style="color: #0000ff;">="http://schemas.microsoft.com/winfx/2006/xaml/presentation"</span><span style="color: #ff0000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;xmlns:x</span><span style="color: #0000ff;">="http://schemas.microsoft.com/winfx/2006/xaml"</span><span style="color: #ff0000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;Title</span><span style="color: #0000ff;">="Stubborn&nbsp;Error&nbsp;Template&nbsp;Demo"</span><span style="color: #ff0000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;Height</span><span style="color: #0000ff;">="200"</span><span style="color: #ff0000;">&nbsp;Width</span><span style="color: #0000ff;">="300"</span><span style="color: #ff0000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;ResizeMode</span><span style="color: #0000ff;">="NoResize"</span><span style="color: #ff0000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;WindowStartupLocation</span><span style="color: #0000ff;">="CenterScreen"</span><span style="color: #ff0000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;Name</span><span style="color: #0000ff;">="window"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">Grid</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">Grid.RowDefinitions</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">RowDefinition&nbsp;</span><span style="color: #ff0000;">Height</span><span style="color: #0000ff;">="50"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">RowDefinition&nbsp;</span><span style="color: #ff0000;">Height</span><span style="color: #0000ff;">="5"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">RowDefinition</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">Grid.RowDefinitions</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">Grid&nbsp;</span><span style="color: #ff0000;">Height</span><span style="color: #0000ff;">="50"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">TextBox&nbsp;</span><span style="color: #ff0000;">HorizontalAlignment</span><span style="color: #0000ff;">="Center"</span><span style="color: #ff0000;">&nbsp;VerticalAlignment</span><span style="color: #0000ff;">="Center"</span><span style="color: #ff0000;">&nbsp;Width</span><span style="color: #0000ff;">="100"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">TextBox.Text</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">Binding&nbsp;</span><span style="color: #ff0000;">ValidatesOnDataErrors</span><span style="color: #0000ff;">="True"</span><span style="color: #ff0000;">&nbsp;ElementName</span><span style="color: #0000ff;">="window"</span><span style="color: #ff0000;">&nbsp;Path</span><span style="color: #0000ff;">="Value"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">TextBox.Text</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">TextBox</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">Grid</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">GridSplitter&nbsp;</span><span style="color: #ff0000;">Grid.Row</span><span style="color: #0000ff;">="1"</span><span style="color: #ff0000;">&nbsp;HorizontalAlignment</span><span style="color: #0000ff;">="Stretch"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">Grid&nbsp;</span><span style="color: #ff0000;">Grid.Row</span><span style="color: #0000ff;">="2"</span><span style="color: #ff0000;">&nbsp;Margin</span><span style="color: #0000ff;">="12"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">TabControl</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">TabItem&nbsp;</span><span style="color: #ff0000;">Header</span><span style="color: #0000ff;">="Tab1"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">TextBox&nbsp;</span><span style="color: #ff0000;">HorizontalAlignment</span><span style="color: #0000ff;">="Center"</span><span style="color: #ff0000;">&nbsp;VerticalAlignment</span><span style="color: #0000ff;">="Center"</span><span style="color: #ff0000;">&nbsp;Width</span><span style="color: #0000ff;">="100"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">TextBox.Text</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">Binding&nbsp;</span><span style="color: #ff0000;">ValidatesOnDataErrors</span><span style="color: #0000ff;">="True"</span><span style="color: #ff0000;">&nbsp;ElementName</span><span style="color: #0000ff;">="window"</span><span style="color: #ff0000;">&nbsp;Path</span><span style="color: #0000ff;">="Value"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">TextBox.Text</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">TextBox</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">TabItem</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">TabItem&nbsp;</span><span style="color: #ff0000;">Header</span><span style="color: #0000ff;">="Tab2"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">TabControl</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">Grid</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">Grid</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">Window</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span></span></div>
<p>&nbsp;</p>
<p><span style="font-family: 宋体;">这个窗口，就出了两个问题。看图。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体;">启动时如下图所示。</span></p>
<p>
</p>
<div align="center"><img alt="" src="http://www.cnblogs.com/images/cnblogs_com/nankezhishi/ErrorTemplate/Startup.PNG" border="0" width="300" height="200" /></div>
<p align="center"><span style="font-family: 宋体;">图</span>1. Startup Window</p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体;">窗体的上下由一个</span>GridSplitter<span style="font-family: 宋体;">分割，可以上下拖动。</span>&nbsp;</p>
<p><span style="font-family: 宋体;">在</span>TextBox<span style="font-family: 宋体;">中输入一个字符。会产生一个</span>Validation Error<span style="font-family: 宋体;">，并用默认的</span>ErrorTemplate<span style="font-family: 宋体;">显示出来。如图</span>2<span style="font-family: 宋体;">所示。</span></p>
<p>
</p>
<div align="center"><img alt="" src="http://www.cnblogs.com/images/cnblogs_com/nankezhishi/ErrorTemplate/MakeError.PNG" border="0" width="300" height="200" /></div>
<p align="center"><span style="font-family: 宋体;">图</span>2. TextBox in Error</p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体;">好了，我们慢慢地将</span>GridSplitter<span style="font-family: 宋体;">向上拖。慢慢地，看到什么了？</span>TextBox<span style="font-family: 宋体;">消失了，可是那个红框却赖着不走了！如图</span>3<span style="font-family: 宋体;">所示。</span></p>
<p>
</p>
<div align="center"><img alt="" src="http://www.cnblogs.com/images/cnblogs_com/nankezhishi/ErrorTemplate/MoveSplitterUp.PNG" border="0" width="300" height="200" /></div>
<p align="center"><span style="font-family: 宋体;">图</span>3. Move GridSplitter Up</p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体;">再来看看下面的红框。把</span>GridSplitter<span style="font-family: 宋体;">慢慢地向下拖。</span>TabPanel<span style="font-family: 宋体;">的空间小了，</span>TextBox<span style="font-family: 宋体;">也变矮，最后消失，那个红框也很尽忠，化成了一条线也要告诉我们那个</span>TextBox<span style="font-family: 宋体;">其实还在。如图</span>4<span style="font-family: 宋体;">所示。</span></p>
<p>
</p>
<div align="center"><img alt="" src="http://www.cnblogs.com/images/cnblogs_com/nankezhishi/ErrorTemplate/MoveSplitterDown.PNG" border="0" width="300" height="200" /></div>
<p align="center"><span style="font-family: 宋体;">图</span>4. Move GridSplitter Down</p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体;">再细看看，那个红线甚至已经在</span>TabControl<span style="font-family: 宋体;">之外了！</span></p>
<p><span style="font-family: 宋体;">当然，我们总可以想办法解决或是绕过这个问题，然后说这不是个问题。但是最自然的代码写出来的东西却不对，就象之前一篇介绍的</span><a href="http://www.cnblogs.com/nankezhishi/archive/2009/01/12/1374543.html"><span style="font-family: 宋体;">如何用代码选中一个ListBoxItem</span></a><span style="font-family: 宋体;">一样，很不爽。因为按理说，</span>adorned element<span style="font-family: 宋体;">都消失了，这个红框也应该跟着消失的。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体;">同系列的其它文章：</span> <br />
</p>
<p><a href="http://www.cnblogs.com/nankezhishi/archive/2008/12/13/1354226.html">[WPF Bug<span style="font-family: 宋体;">清单](<span style="font-family: 宋体;">序</span>)<span style="font-family: 宋体;">与之</span>(1)——<span style="font-family: 宋体;">可以多选的单选</span>ListBox</span></a></p>
<p><a href="http://www.cnblogs.com/nankezhishi/archive/2008/12/14/1354913.html">[WPF Bug<span style="font-family: 宋体;">清单]<span style="font-family: 宋体;">之</span>(2)——RadioButton<span style="font-family: 宋体;">的</span>IsChecked<span style="font-family: 宋体;">绑定失效</span></span></a></p>
<p><a href="http://www.cnblogs.com/nankezhishi/archive/2008/12/20/1359078.html">[WPF Bug<span style="font-family: 宋体;">清单]<span style="font-family: 宋体;">之</span>(3)——<span style="font-family: 宋体;">暗中创建文件的打开文件对话框</span></span></a></p>
<p><a href="http://www.cnblogs.com/nankezhishi/archive/2009/01/11/1373670.html">[WPF Bug<span style="font-family: 宋体;">清单]<span style="font-family: 宋体;">之</span>(4)——<span style="font-family: 宋体;">点击</span>RadioButton<span style="font-family: 宋体;">的空白没有反应</span></span></a></p>
<p><a href="http://www.cnblogs.com/nankezhishi/archive/2009/02/05/1384897.html">[WPF Bug<span style="font-family: 宋体;">清单]<span style="font-family: 宋体;">之</span>(5)——<span style="font-family: 宋体;">隐藏模态对话框后变成非模态</span></span></a></p>
<p><a href="http://www.cnblogs.com/nankezhishi/archive/2009/02/09/1387052.html">[WPF Bug<span style="font-family: 宋体;">清单]<span style="font-family: 宋体;">之</span>(6)——Button<span style="font-family: 宋体;">的</span>IsCancel<span style="font-family: 宋体;">属性失效</span></span></a></p>
<p><a href="http://www.cnblogs.com/nankezhishi/archive/2009/02/11/1388706.html">[WPF Bug<span style="font-family: 宋体;">清单]<span style="font-family: 宋体;">之</span>(8)——RowDefinition<span style="font-family: 宋体;">中</span>MaxHeight<span style="font-family: 宋体;">在一定条件下失效</span></span></a></p>
<p><a href="http://www.cnblogs.com/nankezhishi/archive/2009/03/19/1417151.html">[WPF Bug<span style="font-family: 宋体;">清单]<span style="font-family: 宋体;">之</span>(9)——<span style="font-family: 宋体;">消失的光标</span></span></a></p><img src ="http://www.cnblogs.com/nankezhishi/aggbug/1387800.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47947/" target="_blank">微软告攒机商第一案胜诉</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>[WPF Bug清单]之(6)——Button的IsCancel属性失效</title><link>http://www.cnblogs.com/nankezhishi/archive/2009/02/09/1387052.html</link><dc:creator>南柯之石</dc:creator><author>南柯之石</author><pubDate>Mon, 09 Feb 2009 14:03:00 GMT</pubDate><guid>http://www.cnblogs.com/nankezhishi/archive/2009/02/09/1387052.html</guid><wfw:comment>http://www.cnblogs.com/nankezhishi/comments/1387052.html</wfw:comment><comments>http://www.cnblogs.com/nankezhishi/archive/2009/02/09/1387052.html#Feedback</comments><slash:comments>16</slash:comments><wfw:commentRss>http://www.cnblogs.com/nankezhishi/comments/commentRss/1387052.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/nankezhishi/services/trackbacks/1387052.html</trackback:ping><description><![CDATA[&nbsp;
<p><span style="font-family: 宋体;">在</span><a href="http://www.cnblogs.com/nankezhishi/archive/2009/02/05/1384897.html"><span style="font-family: 宋体;">上一篇</span></a><span style="font-family: 宋体;">中，描述了模态对话框隐藏之后变成了非模态的</span>Bug<span style="font-family: 宋体;">，很多人回复表示这不算是一个</span>Bug<span style="font-family: 宋体;">，我也表示理解。</span>Bug<span style="font-family: 宋体;">只有在需求之下才有意义，不同的需求，对</span>Bug<span style="font-family: 宋体;">的界定也不一样。作为一个</span>Framework<span style="font-family: 宋体;">，</span>.NET<span style="font-family: 宋体;">只能做到在多数时候是符合最广泛群体的需求的，就可以说它合格</span><span style="font-family: 宋体;">。但是对于前一篇描述的问题，想补充一下自己的考虑。</span></p>
<p>&nbsp;</p>
<p>Window<span style="font-family: 宋体;">的</span>Show<span style="font-family: 宋体;">和</span>ShowDialog<span style="font-family: 宋体;">，用于将窗体展现（我没有用显示）出来，而</span>Close<span style="font-family: 宋体;">用于关闭。</span>Close<span style="font-family: 宋体;">之后就不能再用</span>Show<span style="font-family: 宋体;">或是</span>ShowDialog<span style="font-family: 宋体;">再次将窗体展现出来，否则会抛出异常，所以</span>5<span style="font-family: 宋体;">楼的</span>gboxcc<span style="font-family: 宋体;">回复的是错的。很同情这位</span>gboxcc<span style="font-family: 宋体;">，因为他认为我说错的那句，恰恰是我写过代码验证过的。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体;">如果想隐藏而不关闭一个窗体，显然用</span>Close<span style="font-family: 宋体;">是不行的。而且还要把所有的</span>Close<span style="font-family: 宋体;">事件</span>Cancel<span style="font-family: 宋体;">掉，保证窗体不会被</span>Close<span style="font-family: 宋体;">，然后只能用</span>Visibility <span style="font-family: 宋体;">将窗体隐藏起来。隐藏之后，如果要将窗体再次显示出来，我的第一感觉是用</span>Visibility<span style="font-family: 宋体;">，但是发现不行。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体;">从这个角度而言，</span>Window<span style="font-family: 宋体;">类，</span>Show/Close<span style="font-family: 宋体;">只在开始和结束的时候调用，因为它们不能交替调用；在窗体</span>Show<span style="font-family: 宋体;">之后，用</span>Visibility<span style="font-family: 宋体;">控制其可见性，因为可见性可以随意交替设置的。我认为这才是一个非常自然的事情。但是</span>Window<span style="font-family: 宋体;">的实际情况是，</span>Visibility<span style="font-family: 宋体;">的设置，会使</span>isShowingDialog<span style="font-family: 宋体;">变量的值发生变化，单从需求上讲，这是不应该的。所以将其做为一个</span>Bug<span style="font-family: 宋体;">提了出来。</span><a href="http://www.cnblogs.com/Cajon/">Colin Han</a><span style="font-family: 宋体;">认为这是&#8220;为了更好地用户体验，专门做出的设计。&#8221;，我亦不以为然。而且我感觉微软的</span>UX<span style="font-family: 宋体;">团队与开发团队的沟通还很不充分，比如我在</span><a href="http://www.cnblogs.com/nankezhishi/archive/2009/01/17/1377366.html"><span style="font-family: 宋体;">另一篇文章中提到的WPF<span style="font-family: 宋体;">的</span>Window</span></a><span style="font-family: 宋体;">，没有提供一个属性来设置一个窗体是否显示</span>Icon<span style="font-family: 宋体;">，这本身就不符合微软自己的</span>UX Guide<span style="font-family: 宋体;">。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体;">回复的人一致认为，再次显示这个窗体时也应该用</span>ShowDialog<span style="font-family: 宋体;">。好，这篇文章就是为次而生的。因为用</span>ShowDialog<span style="font-family: 宋体;">将窗体再次显示出来同样有问题。连代码都不用改，直接用上次的</span><a href="http://files.cnblogs.com/nankezhishi/ModelDialogBug.zip"><span style="font-family: 宋体;">代码</span></a><span style="font-family: 宋体;">就可以重现这个问题。使用</span>ShowDialog<span style="font-family: 宋体;">方法将一个窗体<strong>再次</strong>显示出来之后，窗体上的</span>&#8221;Hide Self&#8221;<span style="font-family: 宋体;">按钮失效了。注意是再次，第一次</span>ShowDialog<span style="font-family: 宋体;">出来时的行为是正常的。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体;">这里顺便介绍一下</span>IsCancel<span style="font-family: 宋体;">属性，</span>MSDN<span style="font-family: 宋体;">上对它的解释如下：<strong>获取或设置一个，该值指示</strong></span><strong>Button</strong><strong><span style="font-family: 宋体;">是否是一个&#8220;取消&#8221;按钮。用户可以通过按</span>ESC</strong><strong><span style="font-family: 宋体;">键激活&#8220;取消&#8221;按钮。</span></strong><span style="font-family: 宋体;">其实我感觉这句话对于新手而言实在是没有什么帮助。好像就告诉别人这个属性就是给</span>Button<span style="font-family: 宋体;">加了个</span>ESC<span style="font-family: 宋体;">键作为快捷键。必须要和</span>MSDN<span style="font-family: 宋体;">上的很多文档合起来看才知道这个</span>IsCancel<span style="font-family: 宋体;">按钮在不同环境下分别起什么作用，其实还不如自己写个代码试一下来得方便。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体;">对于示例中的代码而言，</span>IsCancel<span style="font-family: 宋体;">就相当于让当前窗体关闭。这是给窗体添加一个关闭按钮最简单的方式（没有之一）。因为这个</span>Bug<span style="font-family: 宋体;">用的就是上一篇的代码。所以就不给大家贴图了。自己运行一下吧。逻辑如下：</span></p>
<p>&nbsp;</p>
<p style="text-indent: -18pt; margin-left: 18pt;">1.<span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体;">点击示例中的</span>Show Model Dialog<span style="font-family: 宋体;">按钮——显示一个模态对话框。</span></p>
<p style="text-indent: -18pt; margin-left: 18pt;">2.<span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体;">可以用</span>Hide Self<span style="font-family: 宋体;">关闭弹出框。</span></p>
<p style="text-indent: -18pt; margin-left: 18pt;">3.<span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体;">再用</span>Show Model Dialog<span style="font-family: 宋体;">弹出这个对话框。</span></p>
<p style="text-indent: -18pt; margin-left: 18pt;">4.<span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体;">那个</span>Hide Self<span style="font-family: 宋体;">按钮不再起作用了。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体;">同系列的其它文章：</span> <br />
</p>
<p><a href="http://www.cnblogs.com/nankezhishi/archive/2008/12/13/1354226.html">[WPF Bug<span style="font-family: 宋体;">清单](<span style="font-family: 宋体;">序</span>)<span style="font-family: 宋体;">与之</span>(1)——<span style="font-family: 宋体;">可以多选的单选</span>ListBox</span></a></p>
<p><a href="http://www.cnblogs.com/nankezhishi/archive/2008/12/14/1354913.html">[WPF Bug<span style="font-family: 宋体;">清单]<span style="font-family: 宋体;">之</span>(2)——RadioButton<span style="font-family: 宋体;">的</span>IsChecked<span style="font-family: 宋体;">绑定失效</span></span></a></p>
<p><a href="http://www.cnblogs.com/nankezhishi/archive/2008/12/20/1359078.html">[WPF Bug<span style="font-family: 宋体;">清单]<span style="font-family: 宋体;">之</span>(3)——<span style="font-family: 宋体;">暗中创建文件的打开文件对话框</span></span></a></p>
<p><a href="http://www.cnblogs.com/nankezhishi/archive/2009/01/11/1373670.html">[WPF Bug<span style="font-family: 宋体;">清单]<span style="font-family: 宋体;">之</span>(4)——<span style="font-family: 宋体;">点击</span>RadioButton<span style="font-family: 宋体;">的空白没有反应</span></span></a></p>
<p><a href="http://www.cnblogs.com/nankezhishi/archive/2009/02/05/1384897.html">[WPF Bug<span style="font-family: 宋体;">清单]<span style="font-family: 宋体;">之</span>(5)——<span style="font-family: 宋体;">隐藏模态对话框后变成非模态</span></span></a></p>
<p><a href="http://www.cnblogs.com/nankezhishi/archive/2009/02/10/1387800.html">[WPF Bug<span style="font-family: 宋体;">清单]<span style="font-family: 宋体;">之</span>(7)——<span style="font-family: 宋体;">顽固的</span>Error Template</span></a></p>
<p><a href="http://www.cnblogs.com/nankezhishi/archive/2009/02/11/1388706.html">[WPF Bug<span style="font-family: 宋体;">清单]<span style="font-family: 宋体;">之</span>(8)——RowDefinition<span style="font-family: 宋体;">中</span>MaxHeight<span style="font-family: 宋体;">在一定条件下失效</span></span></a></p>
<p><a href="http://www.cnblogs.com/nankezhishi/archive/2009/03/19/1417151.html">[WPF Bug<span style="font-family: 宋体;">清单]<span style="font-family: 宋体;">之</span>(9)——<span style="font-family: 宋体;">消失的光标</span></span></a> <br />
</p>
<p>&nbsp;</p>
<p><em><span style="font-family: 宋体;">我是</span>MS Fan</em><em><span style="font-family: 宋体;">，但是我依然会以挑剔的眼光看它；只因为我是</span>MS Fan</em><em><span style="font-family: 宋体;">的原因是，从多数开发和娱乐和应用的角度而言，</span>MS</em><em><span style="font-family: 宋体;">是目前最好的选择。如果有一天</span>Linux</em><em><span style="font-family: 宋体;">的哪个发行版在多数方面超过了</span>MS</em><em><span style="font-family: 宋体;">，我会义无反顾地投入</span>Linux</em><em><span style="font-family: 宋体;">。不过是一个平台，不是女友，也不是&#8220;知已者&#8221;，不需要相守一生。</span></em></p><img src ="http://www.cnblogs.com/nankezhishi/aggbug/1387052.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47946/" target="_blank">Mono这只猴子招惹了谁？</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>[WPF Bug清单]之(5)——隐藏模态对话框后变成非模态</title><link>http://www.cnblogs.com/nankezhishi/archive/2009/02/05/1384897.html</link><dc:creator>南柯之石</dc:creator><author>南柯之石</author><pubDate>Thu, 05 Feb 2009 13:52:00 GMT</pubDate><guid>http://www.cnblogs.com/nankezhishi/archive/2009/02/05/1384897.html</guid><wfw:comment>http://www.cnblogs.com/nankezhishi/comments/1384897.html</wfw:comment><comments>http://www.cnblogs.com/nankezhishi/archive/2009/02/05/1384897.html#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://www.cnblogs.com/nankezhishi/comments/commentRss/1384897.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/nankezhishi/services/trackbacks/1384897.html</trackback:ping><description><![CDATA[<p><span style="font-family: 宋体;">发现这个问题时，隐约记得之前有人已经发过这个问题，想把链接放到这里，不过找了半天，实在找不到。日后如果找到了一定加上。</span></p>
<p>&nbsp;</p>
<p><strong><span style="font-family: 宋体;">问题描述：</span></strong><span style="font-family: 宋体;">用</span>ShowDialog<span style="font-family: 宋体;">方法弹出一个模态对话框，然后将此对话框的</span>Visibility<span style="font-family: 宋体;">属性设置为</span>Hidden<span style="font-family: 宋体;">，再设置回</span>Visible<span style="font-family: 宋体;">，发现这个对话框已经不是模态的了。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体;">有人会觉得关就关了得了，也不会有这个问题，干什么要把</span>Close<span style="font-family: 宋体;">取消掉然后再显示出来呢？因为这是有应用环境的。</span></p>
<p>&nbsp;</p>
<p><strong><span style="font-family: 宋体;">应用环境：</span></strong><span style="font-family: 宋体;">有些对话框，从逻辑上就是单例的，比如</span>Office<span style="font-family: 宋体;">和</span>Visual Studio<span style="font-family: 宋体;">里都有的查找对话框，显然没有必要同时显示两个。而且也没有必要每次重新实例化并显示出来，在用户关闭窗体时，将窗体隐藏起来会更好，这样上次查找的关键字还存在着。可以省去一些代码保存这个历史关键字。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体;">当然，这种方式也会有不好的地方，欢迎大家指摘。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体;">写了一个<a href="http://www.cnblogs.com/Files/nankezhishi/ModelDialogBug.zip">程序</a>来模拟这个</span>Bug<span style="font-family: 宋体;">，效果如下面三张图所示。</span></p>
<p>&nbsp;</p>
<div align="center"><img alt="" src="http://www.cnblogs.com/images/cnblogs_com/nankezhishi/WPFBug/ModalDialog/MainWindow.png" border="0" width="230" height="142" /></div>
<p align="center"></p>
<p align="center"><span style="font-family: 宋体;">图</span>1. <span style="font-family: 宋体;">主窗体，点第一个按钮</span></p>
<p>&nbsp;<span style="font-family: 宋体;">
<div align="center"><img alt="" src="http://www.cnblogs.com/images/cnblogs_com/nankezhishi/WPFBug/ModalDialog/Dialog.png" border="0" width="160" height="91" /></div>
</span>
</p>
<p>&nbsp;</p>
<p align="center"></p>
<p align="center"><span style="font-family: 宋体;">图</span>2. <span style="font-family: 宋体;">弹出的模态对话框，点击按钮将自己隐藏</span></p>
<p>&nbsp;<span style="font-family: 宋体;"><span style="font-family: 宋体;">
<div align="center"><img alt="" src="http://www.cnblogs.com/images/cnblogs_com/nankezhishi/WPFBug/ModalDialog/Reshow.png" border="0" width="230" height="142" /></div>
</span></span>
</p>
<p>&nbsp;</p>
<p align="center"></p>
<p align="center"><span style="font-family: 宋体;">图</span>3. <span style="font-family: 宋体;">再点击主窗体的最后一个按钮，显示出来，已经是非模态对话框了</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体;">以前发</span>Bug<span style="font-family: 宋体;">，一般没有去看过</span>.NET<span style="font-family: 宋体;">的源代码，这次感觉这个</span>Bug <span style="font-family: 宋体;">有点儿太不应该了，就看了看源代码，发现</span>WPF<span style="font-family: 宋体;">还特意为</span>Dialog(<span style="font-family: 宋体;">模态的</span>)<span style="font-family: 宋体;">的</span>Hidden<span style="font-family: 宋体;">做了单独的处理，感觉就更不应该有问题了，我们来看看源代码。</span></p>
<p>&nbsp;</p>
<div class="cnblogs_code"><img id="Code_Closed_Image_214939" onclick="this.style.display='none'; document.getElementById('Code_Closed_Text_214939').style.display='none'; document.getElementById('Code_Open_Image_214939').style.display='inline'; document.getElementById('Code_Open_Text_214939').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" align="top" width="11" height="16"><img style="display: none;" id="Code_Open_Image_214939" onclick="this.style.display='none'; document.getElementById('Code_Open_Text_214939').style.display='none'; getElementById('Code_Closed_Image_214939').style.display='inline'; getElementById('Code_Closed_Text_214939').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top" width="11" height="16"><span id="Code_Closed_Text_214939" class="cnblogs_code_Collapse">DoDialogHide</span><span style="display: none;" id="Code_Open_Text_214939"><br />
<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000;">[SecurityCritical,&nbsp;SecurityTreatAsSafe]<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;DoDialogHide()<br />
<img id="Codehighlighter1_68_788_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_68_788_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_68_788_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_68_788_Closed_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img style="display: none;" id="Codehighlighter1_68_788_Closed_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_68_788_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_68_788_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_68_788_Open_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" align="top"></span><span style="border: 1px solid #808080; background-color: #ffffff; display: none;" id="Codehighlighter1_68_788_Closed_Text"><img alt="" src="http://www.cnblogs.com/Images/dot.gif" /></span><span id="Codehighlighter1_68_788_Open_Text"><span style="color: #000000;">{<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;SecurityHelper.DemandUnmanagedCode();<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">bool</span><span style="color: #000000;">&nbsp;isActiveWindow&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">false</span><span style="color: #000000;">;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">this</span><span style="color: #000000;">._dispatcherFrame&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">)<br />
<img id="Codehighlighter1_188_281_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_188_281_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_188_281_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_188_281_Closed_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img style="display: none;" id="Codehighlighter1_188_281_Closed_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_188_281_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_188_281_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_188_281_Open_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="border: 1px solid #808080; background-color: #ffffff; display: none;" id="Codehighlighter1_188_281_Closed_Text"><img alt="" src="http://www.cnblogs.com/Images/dot.gif" /></span><span id="Codehighlighter1_188_281_Open_Text"><span style="color: #000000;">{<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">._dispatcherFrame.Continue&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">false</span><span style="color: #000000;">;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">._dispatcherFrame&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000;"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(</span><span style="color: #000000;">!</span><span style="color: #0000ff;">this</span><span style="color: #000000;">._dialogResult.HasValue)<br />
<img id="Codehighlighter1_324_367_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_324_367_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_324_367_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_324_367_Closed_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img style="display: none;" id="Codehighlighter1_324_367_Closed_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_324_367_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_324_367_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_324_367_Open_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="border: 1px solid #808080; background-color: #ffffff; display: none;" id="Codehighlighter1_324_367_Closed_Text"><img alt="" src="http://www.cnblogs.com/Images/dot.gif" /></span><span id="Codehighlighter1_324_367_Open_Text"><span style="color: #000000;">{<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">._dialogResult&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">false</span><span style="color: #000000;">;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000;"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">._showingAsDialog&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">false</span><span style="color: #000000;">;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">Cause&nbsp;this&nbsp;Bug</span><span style="color: #008000;"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;isActiveWindow&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">._swh.IsActiveWindow;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.EnableThreadWindows(</span><span style="color: #0000ff;">true</span><span style="color: #000000;">);<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;((isActiveWindow&nbsp;</span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">this</span><span style="color: #000000;">._dialogPreviousActiveHandle&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;IntPtr.Zero))&nbsp;</span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;">&nbsp;UnsafeNativeMethods.IsWindow(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;HandleRef(</span><span style="color: #0000ff;">this</span><span style="color: #000000;">,&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">._dialogPreviousActiveHandle)))<br />
<img id="Codehighlighter1_679_786_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_679_786_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_679_786_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_679_786_Closed_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img style="display: none;" id="Codehighlighter1_679_786_Closed_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_679_786_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_679_786_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_679_786_Open_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="border: 1px solid #808080; background-color: #ffffff; display: none;" id="Codehighlighter1_679_786_Closed_Text"><img alt="" src="http://www.cnblogs.com/Images/dot.gif" /></span><span id="Codehighlighter1_679_786_Open_Text"><span style="color: #000000;">{<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UnsafeNativeMethods.SetActiveWindow(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;HandleRef(</span><span style="color: #0000ff;">this</span><span style="color: #000000;">,&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">._dialogPreviousActiveHandle));<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000;"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="color: #000000;"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span></span></div>
<p>&nbsp;</p>
<p><span style="font-family: 宋体;">其中直接把</span>_showingAsDialog<span style="font-family: 宋体;">设置为了</span>false<span style="font-family: 宋体;">，当再次把窗体的</span>Visibility<span style="font-family: 宋体;">设置为</span>Visible<span style="font-family: 宋体;">的时候，</span>Window<span style="font-family: 宋体;">类又会根据这个变量的值来判断是否将窗体按模态的方式显示出来。而</span>MS<span style="font-family: 宋体;">对这行代码的的注释仅仅是&#8220;</span><span style="font-family: Fixedsys; color: green; font-size: 9pt;">// clears _showingAsDialog</span><span style="font-family: 宋体;">&#8221;。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体;">从源代码上来看，</span>WPF<span style="font-family: 宋体;">的</span>Window<span style="font-family: 宋体;">似乎是使用下面的代码将一个窗体从非模态变成模态的。</span></p>
<p>&nbsp;</p>
<div class="cnblogs_code"><img id="Code_Closed_Image_215107" onclick="this.style.display='none'; document.getElementById('Code_Closed_Text_215107').style.display='none'; document.getElementById('Code_Open_Image_215107').style.display='inline'; document.getElementById('Code_Open_Text_215107').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" align="top" width="11" height="16"><img style="display: none;" id="Code_Open_Image_215107" onclick="this.style.display='none'; document.getElementById('Code_Open_Text_215107').style.display='none'; getElementById('Code_Closed_Image_215107').style.display='inline'; getElementById('Code_Closed_Text_215107').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top" width="11" height="16"><span id="Code_Closed_Text_215107" class="cnblogs_code_Collapse">SetAsModal</span><span style="display: none;" id="Code_Open_Text_215107"><br />
<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">try</span><span style="color: #000000;"><br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;tell&nbsp;users&nbsp;we're&nbsp;going&nbsp;modal</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;ComponentDispatcher.PushModal();&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;_dispatcherFrame&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;DispatcherFrame();&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;Dispatcher.PushFrame(_dispatcherFrame);&nbsp;<br />
}<br />
</span><span style="color: #0000ff;">finally</span><span style="color: #000000;">&nbsp;<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;tell&nbsp;users&nbsp;we're&nbsp;going&nbsp;non-modal</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;ComponentDispatcher.PopModal();<br />
}<br />
</span></span></div>
<p>&nbsp;</p>
<p><span style="font-family: 宋体;">但是当我自己在使用里使用这个方法的时候，却发现根本达不到目的</span><span style="font-family: 宋体;">。后来突然想到一个方法，试了一下，就可以。解决方法是，不使用Visibility = Visible，使窗体再次显示出来。而且再调用一次ShowDialog方法来显示这个窗体。这个方法也许只有对WPF不熟悉或是非常熟悉的人才能想得出来（我是死马当作活马医碰对了），因为正常情况下，继续地第二次调用ShowDialog方法是会抛出异常的。类似的诡异的Window的异常在<a id="AjaxHolder_ctl01_TitleUrl" class="postTitle2" href="http://www.cnblogs.com/nankezhishi/archive/2009/01/14/1375945.html"><font color="#6faf30">[WPF]如何在关闭非模态子窗体时用消息框确认——解决最小化窗体时抛出的异常</font></a>里也有描述。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体;">另外，在非</span>UI<span style="font-family: 宋体;">线程弹出的</span>MessageBox<span style="font-family: 宋体;">也是非模态的。这个解决方法很简单，只要在</span>Dispatcher<span style="font-family: 宋体;">里弹出这个</span>MessageBox<span style="font-family: 宋体;">就可以了。</span></p>
<p><a></a><a href="http://www.cnblogs.com/nankezhishi/archive/2008/12/13/1354226.html"></a><a href="http://www.cnblogs.com/nankezhishi/archive/2008/12/13/1354226.html">更多关于WPF Bug</a>&nbsp;</p>
<p><span style="font-family: 宋体;">同系列的其它文章：</span> <br />
</p>
<p><a href="http://www.cnblogs.com/nankezhishi/archive/2008/12/13/1354226.html">[WPF Bug<span style="font-family: 宋体;">清单](<span style="font-family: 宋体;">序</span>)<span style="font-family: 宋体;">与之</span>(1)——<span style="font-family: 宋体;">可以多选的单选</span>ListBox</span></a></p>
<p><a href="http://www.cnblogs.com/nankezhishi/archive/2008/12/14/1354913.html">[WPF Bug<span style="font-family: 宋体;">清单]<span style="font-family: 宋体;">之</span>(2)——RadioButton<span style="font-family: 宋体;">的</span>IsChecked<span style="font-family: 宋体;">绑定失效</span></span></a></p>
<p><a href="http://www.cnblogs.com/nankezhishi/archive/2008/12/20/1359078.html">[WPF Bug<span style="font-family: 宋体;">清单]<span style="font-family: 宋体;">之</span>(3)——<span style="font-family: 宋体;">暗中创建文件的打开文件对话框</span></span></a></p>
<p><a href="http://www.cnblogs.com/nankezhishi/archive/2009/01/11/1373670.html">[WPF Bug<span style="font-family: 宋体;">清单]<span style="font-family: 宋体;">之</span>(4)——<span style="font-family: 宋体;">点击</span>RadioButton<span style="font-family: 宋体;">的空白没有反应</span></span></a></p>
<p><a href="http://www.cnblogs.com/nankezhishi/archive/2009/02/09/1387052.html">[WPF Bug<span style="font-family: 宋体;">清单]<span style="font-family: 宋体;">之</span>(6)——Button<span style="font-family: 宋体;">的</span>IsCancel<span style="font-family: 宋体;">属性失效</span></span></a></p>
<p><a href="http://www.cnblogs.com/nankezhishi/archive/2009/02/10/1387800.html">[WPF Bug<span style="font-family: 宋体;">清单]<span style="font-family: 宋体;">之</span>(7)——<span style="font-family: 宋体;">顽固的</span>Error Template</span></a></p>
<p><a href="http://www.cnblogs.com/nankezhishi/archive/2009/02/11/1388706.html">[WPF Bug<span style="font-family: 宋体;">清单]<span style="font-family: 宋体;">之</span>(8)——RowDefinition<span style="font-family: 宋体;">中</span>MaxHeight<span style="font-family: 宋体;">在一定条件下失效</span></span></a></p>
<p><a href="http://www.cnblogs.com/nankezhishi/archive/2009/03/19/1417151.html">[WPF Bug<span style="font-family: 宋体;">清单]<span style="font-family: 宋体;">之</span>(9)——<span style="font-family: 宋体;">消失的光标</span></span></a></p>
<p>&nbsp;</p>
<p>&nbsp;</p><img src ="http://www.cnblogs.com/nankezhishi/aggbug/1384897.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47945/" target="_blank">Firefox 3.5本月晚些时候即首次升级</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>Default Luna ComboBox Style</title><link>http://www.cnblogs.com/nankezhishi/articles/1378571.html</link><dc:creator>南柯之石</dc:creator><author>南柯之石</author><pubDate>Mon, 19 Jan 2009 13:41:00 GMT</pubDate><guid>http://www.cnblogs.com/nankezhishi/articles/1378571.html</guid><wfw:comment>http://www.cnblogs.com/nankezhishi/comments/1378571.html</wfw:comment><comments>http://www.cnblogs.com/nankezhishi/articles/1378571.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/nankezhishi/comments/commentRss/1378571.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/nankezhishi/services/trackbacks/1378571.html</trackback:ping><description><![CDATA[摘要: Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->&lt;Windowxmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.mic&nbsp;&nbsp;<a href='http://www.cnblogs.com/nankezhishi/articles/1378571.html'>阅读全文</a><img src ="http://www.cnblogs.com/nankezhishi/aggbug/1378571.html?type=2" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47944/" target="_blank">Google App Engine出现故障宕机6小时</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>WPF窗体设计不符合微软自己的UX Guide</title><link>http://www.cnblogs.com/nankezhishi/archive/2009/01/17/1377366.html</link><dc:creator>南柯之石</dc:creator><author>南柯之石</author><pubDate>Fri, 16 Jan 2009 16:11:00 GMT</pubDate><guid>http://www.cnblogs.com/nankezhishi/archive/2009/01/17/1377366.html</guid><wfw:comment>http://www.cnblogs.com/nankezhishi/comments/1377366.html</wfw:comment><comments>http://www.cnblogs.com/nankezhishi/archive/2009/01/17/1377366.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cnblogs.com/nankezhishi/comments/commentRss/1377366.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/nankezhishi/services/trackbacks/1377366.html</trackback:ping><description><![CDATA[<p><span style="font-family: 宋体">冲突的地方就在于窗体应该不应该有左上角的图标？不知大家平时有没有注意这个问题？</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体">这个谁说都没有用，看看微软的已经有的软件，主窗体都有，从主窗体弹出的绝大多数子窗体都没有。再来看看微软自己的</span><a href="http://msdn.microsoft.com/en-us/library/aa511258.aspx">UX Guide</a><span style="font-family: 宋体">上是怎么说的。</span></p>
<p>&nbsp;</p>
<p align="left"><strong><span style="font-family: 'Segoe UI','sans-serif'; color: black; font-size: 9pt">Title bars</span></strong></p>
<p align="left"><span style="font-family: SegoeUI; color: black; font-size: 4.5pt">● </span><strong><span style="color: black; font-size: 9pt">Dialog boxes don</span></strong><strong><span style="font-family: Calibri,Bold; color: black; font-size: 9pt">&#8217;</span></strong><strong><span style="color: black; font-size: 9pt">t have title bar icons. </span></strong><span style="color: black; font-size: 9pt">Title bar icons are used as a visual distinction between </span><strong><span style="color: blue; font-size: 9pt">primary windows </span></strong><span style="color: black; font-size: 9pt">and</span></p>
<p align="left"><strong><span style="color: blue; font-size: 9pt">secondary windows</span></strong><span style="color: black; font-size: 9pt">.</span></p>
<p align="left"><span style="font-family: 'Times New Roman','serif'; color: black; font-size: 4.5pt">􀀀</span><span style="font-family: AdobePiStd; color: black; font-size: 4.5pt">m </span><strong><span style="color: black; font-size: 9pt">Exception: </span></strong><span style="color: black; font-size: 9pt">If a dialog box is used to implement a primary window (such as a utility) and therefore appears on the taskbar, it does have</span></p>
<p><span style="color: black; font-size: 9pt">a title bar icon. In this case, optimize the title for display on the taskbar by concisely placing the distinguishing information first.</span></p>
<p>&nbsp;</p>
<p style="text-indent: 112.5pt"><span style="color: black; font-size: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Page 421 in pdf</span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p align="left"><strong><em><span style="font-family: 'Segoe UI','sans-serif'; font-size: 9pt">Title bar icons</span></em></strong></p>
<p align="left"><span style="font-family: SegoeUI; font-size: 4.5pt">● </span><strong><span style="font-size: 9pt">Dialog boxes don</span></strong><strong><span style="font-family: Calibri,Bold; font-size: 9pt">&#8217;</span></strong><strong><span style="font-size: 9pt">t have title bar icons.</span></strong></p>
<p align="left"><span style="font-family: 'Times New Roman','serif'; font-size: 4.5pt">􀀀</span><span style="font-family: AdobePiStd; font-size: 4.5pt">m </span><strong><span style="font-size: 9pt">Exception: </span></strong><span style="font-size: 9pt">If a dialog box is used to implement a primary window (such as a utility) and therefore appears on the taskbar, it does have</span></p>
<p><span style="font-size: 9pt">a title bar icon.</span></p>
<p>&nbsp;</p>
<p><span style="font-size: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;Page 426 in pdf</span></p>
<p>&nbsp;</p>
<p align="left"><strong><span style="font-family: 'Segoe UI','sans-serif'; font-size: 9.5pt">Icons</span></strong></p>
<p align="left"><span style="font-family: SegoeUI; font-size: 5pt">● </span><strong><span style="font-size: 9.5pt">Modal error message dialogs don</span></strong><strong><span style="font-family: Calibri,Bold; font-size: 9.5pt">&#8217;</span></strong><strong><span style="font-size: 9.5pt">t have title bar icons. </span></strong><span style="font-size: 9.5pt">Title bar icons are used as a visual distinction between primary windows</span></p>
<p><span style="font-size: 9.5pt">and secondary windows.</span></p>
<p>&nbsp;<span style="font-size: 9.5pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Page 541 in pdf</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体">程序里的不在任务栏里的弹出框实在是太常见了，而现有的程序和</span>UX Guide<span style="font-family: 宋体">都告诉我们这个弹出框上不应该有左上角的</span>Icon<span style="font-family: 宋体">。好，知道了，以后这么做就是了。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体">等等，</span>WPF<span style="font-family: 宋体">的</span>Window<span style="font-family: 宋体">不愿意给你这个机会！看看</span><a href="http://msdn.microsoft.com/en-us/library/system.windows.window.icon.aspx">WPF<span style="font-family: 宋体">的MSDN</a></span><span style="font-family: 宋体">上是怎么说的。</span></p>
<p>&nbsp;</p>
<p><strong><span style="color: red">A WPF window always displays an icon</span></strong>. When one is not provided by setting <strong>Icon</strong>, WPF chooses an icon to display based on the following rules: </p>
<ol style="margin-top: 0cm" type="1">
    <li>Use the assembly icon, if specified. </li>
    <li>If the assembly icon is not specified, use the default Microsoft Windows icon. </li>
</ol>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体">得，微软自己两个</span>TEAM<span style="font-family: 宋体">打起来了。说直接点就是，</span>WPF<span style="font-family: 宋体">的</span>Window<span style="font-family: 宋体">没有</span>WinForm<span style="font-family: 宋体">里</span>Form<span style="font-family: 宋体">里的</span>ShowIcon<span style="font-family: 宋体">属性。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体">当然人不能让尿憋死，办法总是有的。不过要直接调用</span>Win32 API<span style="font-family: 宋体">。介绍在</span><a href="http://www.danrigsby.com/blog/index.php/2008/05/26/remove-icon-from-wpf-window/"><span style="font-family: 宋体">这里</a></span><span style="font-family: 宋体">。我在项目里也试了一下（毕竟</span>UX<span style="font-family: 宋体">优先级高些），不是很好用。后来看了看</span>Form<span style="font-family: 宋体">里的</span>ShowIcon<span style="font-family: 宋体">方法是如何实现的才正确地解决了。要在上面的方法的基础上，</span>SetWindowPos<span style="font-family: 宋体">之后，再用下面的代码给</span>Window<span style="font-family: 宋体">发两个消息。</span></p>
<p>&nbsp;</p>
<p><a title="IntPtr System.Windows.Forms.Control.SendMessage(int msg, int wparam, int lparam);" href="http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://System.Windows.Forms:2.0.0.0:b77a5c561934e089/System.Windows.Forms.Control/SendMessage(Int32,Int32,Int32):IntPtr">SendMessage</a>(hwnd, 0x80, 0, 0);</p>
<p><a title="IntPtr System.Windows.Forms.Control.SendMessage(int msg, int wparam, int lparam);" href="http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://System.Windows.Forms:2.0.0.0:b77a5c561934e089/System.Windows.Forms.Control/SendMessage(Int32,Int32,Int32):IntPtr">SendMessage</a>(hwnd, 0x80, 1, 0);</p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体">才能把</span>Icon<span style="font-family: 宋体">删掉。</span></p>
 <img src ="http://www.cnblogs.com/nankezhishi/aggbug/1377366.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47943/" target="_blank">消息称Facebook今年营收将达5.5亿美元</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>WPF为我们带来了什么？</title><link>http://www.cnblogs.com/nankezhishi/archive/2009/01/16/1377348.html</link><dc:creator>南柯之石</dc:creator><author>南柯之石</author><pubDate>Fri, 16 Jan 2009 15:16:00 GMT</pubDate><guid>http://www.cnblogs.com/nankezhishi/archive/2009/01/16/1377348.html</guid><wfw:comment>http://www.cnblogs.com/nankezhishi/comments/1377348.html</wfw:comment><comments>http://www.cnblogs.com/nankezhishi/archive/2009/01/16/1377348.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.cnblogs.com/nankezhishi/comments/commentRss/1377348.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/nankezhishi/services/trackbacks/1377348.html</trackback:ping><description><![CDATA[<p><span style="font-family: 宋体">正在做的一个项目就是用</span>WPF<span style="font-family: 宋体">做的。项目初期做</span>DEMO<span style="font-family: 宋体">时也是，同时也是</span>CTO<span style="font-family: 宋体">推荐的。但是</span>CTO<span style="font-family: 宋体">的考虑却和我们不一样。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体">记得做</span>DEMO<span style="font-family: 宋体">时，把东西给</span>CTO<span style="font-family: 宋体">看后，得到的反馈之一是，为什么用</span>WPF<span style="font-family: 宋体">做这么点儿功能用了这么久？怎么还要写逻辑？</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体">不知道</span>CTO<span style="font-family: 宋体">是不是只看过</span>WPF<span style="font-family: 宋体">的广告，而没有自己涉足过。似乎在</span>CTO<span style="font-family: 宋体">的观念中，</span>WPF<span style="font-family: 宋体">是可以极大地减少代码逻辑，增加开发效率的新技术。如果</span>XAML<span style="font-family: 宋体">不属于代码的话，前半句算是正确的。但是后半句无论如何是不能做为结论的。要完成功能，就要有逻辑，无论用什么技术，总要把逻辑完整地表达出来。库多做一些，我们少做一些而已。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体">那么</span>WPF<span style="font-family: 宋体">为我们带来了什么呢？</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体">评价总要有个比较的对象，就拿</span>WinForm<span style="font-family: 宋体">或</span>MFC<span style="font-family: 宋体">作比较好了。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体">相对于上面的两种技术，</span>WPF<span style="font-family: 宋体">高度抽象控件的外观表示，分离了控件的外观与逻辑、同时为分离界面与后台逻辑提供了可能。里面的</span>Command<span style="font-family: 宋体">和</span>DataBinding<span style="font-family: 宋体">其实就是为此服务的。而</span>Template<span style="font-family: 宋体">、</span>Style<span style="font-family: 宋体">和</span>Animation<span style="font-family: 宋体">等不过是</span>UI<span style="font-family: 宋体">抽象的必然附带结果。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体">由于是新发布的产品，不足也是难免的。最直接的一个就是</span>XAML<span style="font-family: 宋体">本身其实就是</span>String<span style="font-family: 宋体">，而在当前的</span>Visual Studio 2008<span style="font-family: 宋体">中进行重构是不会对</span>XAML<span style="font-family: 宋体">进行操作的（除了部分类名），增加了代码维护的成本。比如</span>Spin<span style="font-family: 宋体">，</span>Calandar<span style="font-family: 宋体">，</span>DataTimePicker<span style="font-family: 宋体">，</span>DataGrid<span style="font-family: 宋体">，</span>Balloon<span style="font-family: 宋体">这些</span>WinForm<span style="font-family: 宋体">控件在当前的版本中并没有，</span>.NET 4<span style="font-family: 宋体">才会发布几个控件以弥补。现在</span>WPF<span style="font-family: 宋体">的缺陷在我的</span><a href="http://www.cnblogs.com/nankezhishi/archive/2008/12/13/1354226.html">WPF Bug<span style="font-family: 宋体">清单系列文章</span></a><span style="font-family: 宋体">里也有部分描述。</span></p>
<p>&nbsp;</p>
<p>另外，WPF中<span style="font-family: 宋体">所推崇的</span>MVVM<span style="font-family: 宋体">很好，但是会带来更高的设计与编码复杂度。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体">大家觉得呢？</span></p>
<img src ="http://www.cnblogs.com/nankezhishi/aggbug/1377348.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47937/" target="_blank">微软8月25日开始通过WSUS推送IE8</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>上海一年，总感觉少点儿什么</title><link>http://www.cnblogs.com/nankezhishi/archive/2009/01/16/1377316.html</link><dc:creator>南柯之石</dc:creator><author>南柯之石</author><pubDate>Fri, 16 Jan 2009 13:36:00 GMT</pubDate><guid>http://www.cnblogs.com/nankezhishi/archive/2009/01/16/1377316.html</guid><wfw:comment>http://www.cnblogs.com/nankezhishi/comments/1377316.html</wfw:comment><comments>http://www.cnblogs.com/nankezhishi/archive/2009/01/16/1377316.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cnblogs.com/nankezhishi/comments/commentRss/1377316.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/nankezhishi/services/trackbacks/1377316.html</trackback:ping><description><![CDATA[<p><span style="font-family: 宋体">我是一个土生土长的北方人，来到了上海一年多了，过着其实无论在哪儿都一样的生活——吃饭、工作、睡觉。但是安静的时候，常常感觉自己的生活缺了点什么，可是又说不上来。尤其到了年底，这种感觉就越发强烈起来。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体">晚饭没有像平时一样在公司吃。回到家里，吃着刚买回来的饺子，想起了儿时在家过年的情景。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体">不懂事的时候就发现，哪天早晨起来，吃的是腊八粥，那么就快要过年了，就要发压岁钱了。这一天，家里人还会剥些蒜，泡在醋里准备过年的时候吃。就是北方人熟知的腊八蒜。到了大年三十儿的晚上，家家都会开着屋子里所有的灯&#8220;守年关&#8221;，等着新的一年的到来。大人们总要熬到半夜，出去放炮，把一些睡着了的小孩子叫起来，一起吃饺子。虽然饺子什么时候都吃得到，但是三十儿晚上和全家人一起吃，还是更有味道的。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体">别家我不知道怎样，我从小吃饺子的时候，总会先剥几瓣生蒜，用个小碟倒上醋，滴几滴香油，最好再放些芥末。和饺子一起吃，真是舒服啊。想想都会流口水。现在眼前的醋碟里，芥末换成了&#8220;老干妈&#8221;，吃起来一样很爽。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体">到了十五，又会买来元宵，各种味道的都有，那时最爱吃山楂馅的。可是不知从什么时候起，山楂馅的元宵很难买到了。再到后来，元宵都很难买到了，满世界都是汤圆。汤圆煮出来水是清的，吃起来没有元宵那种糊糊的感觉。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体">不知听谁传的——&#8220;南甜北咸，东辣西酸。&#8221;以为南方以甜食为主，也的确见过有南方人吃馒头要放糖的。来上海之前，也充分考虑到了这点，觉得自己挺爱吃甜的，去上海应该也没有什么吃不习惯的。后来证明我错了。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体">一年前来到了上海，发现这里甜的东西比我想象的要少得多。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体">在北方，粽子里放的是枣，家里放的更是蜜腌过的枣，从小就很爱吃，还有一次一顿吃了三个，结果撑得住了院的经历。来到了上海，发现粽子里放的是肉和鸡蛋，味道更是咸的。吃了两次，就再也不去尝试适应上海的粽子了。也许上海人把粽子当饭吃吧？家里一直把粽子当零食吃。和饭一起吃的菜（粽子里的肉）应该是咸的，倒也说得通。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体">在北方，汤圆主要是芝麻的，还有山楂、五仁等口味，统一的特点就是甜。来到了上海，发现汤圆里放得还是肉。我无语了。都没吃过肉不成？得着（北方方言）个什么东西都放肉&#8230;&#8230;</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体">在北方，平时吃个饺子，吃个面条是再常见不过的。而且饺子的馅也是多种多样。家里常吃的就有&#8220;猪肉大葱（北方特色）&#8221;、&#8220;三鲜（韭菜、鸡蛋或海肠、虾仁）&#8221;、&#8220;荠菜猪肉&#8221;、&#8220;羊肉（萝卜）&#8221;、&#8220;纯牛肉&#8221;、&#8220;纯鱼肉（什么鱼忘了，不爱吃）&#8221;、别的什么白菜、芹菜、茴香多了去了。至于面条就更不用说了，单单面条的制法，山西人就想出了不少。不过我最爱吃的还是炸酱面（不是北京的），而且这个酱是要用黄豆和西瓜的汁（不是水）做的哦。而且无论是吃饺子还是面条，我都会和蒜一起吃。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体">到了上海，外面卖的饺子倒也不少。可是问起上海本地人，基本上一年不会吃几次饺子，面条就更少了。估计外卖的饺子，多是被北方人买去了。而且吃的饺子，多是肉馅的。也许把饺子当一种象征，不是当饭吃，只是一种仪式，自然要用好一些的原料——肉。</span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体">还有就是面包，很久之前在北方没有见过肉松面包的，可能也是南方传过去的吧。真是千方百计地放肉啊。冷笑。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体">现在天天吃饭，总是要想着法的多吃些菜。结果有一天，在食堂打了两份素的，结果被打卡的伙计鄙视了，说&#8220;这么省？&#8221;。自认语言比较贫乏，只是笑笑，沉默以对。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体">上海人拿着自己的价值观看着周围的人，然后得出结论说，都是一群乡巴佬儿。却不知道这群乡巴佬儿也是这么想的。上海的现在繁荣，上海的本地人有多少的份儿呢？</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体">看着眼前就要吃完的饺子，似乎找回一点感觉。家乡的感觉！一口把剩下的醋喝掉，暗笑，这就是北方人的感觉！在上海，少的就是这种感觉！</span></p>
<img src ="http://www.cnblogs.com/nankezhishi/aggbug/1377316.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47937/" target="_blank">微软8月25日开始通过WSUS推送IE8</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item></channel></rss>