<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_{CODE @CODING完美世界</title><subtitle type="text">学而不思则罔，思而不学则殆。</subtitle><id>http://feed.cnblogs.com/blog/u/15721/rss</id><updated>2011-10-09T10:05:32Z</updated><author><name>同一片海</name><uri>http://www.cnblogs.com/chinadhf/</uri></author><generator>CNBlogs BlogServer</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/chinadhf/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/15721/rss"/><entry><id>http://www.cnblogs.com/chinadhf/archive/2011/10/09/2203983.html</id><title type="text">浏览器外部署Silverlight更新检查失败的原因及对策</title><summary type="text">浏览器外部署Silverlight时，为了让部署到本地的Silverlight应用程序保持最新，通常需要在应用程序中添加更新检查的功能。</summary><published>2011-10-09T10:06:00Z</published><updated>2011-10-09T10:06:00Z</updated><author><name>同一片海</name><uri>http://www.cnblogs.com/chinadhf/</uri></author><link rel="alternate" href="http://www.cnblogs.com/chinadhf/archive/2011/10/09/2203983.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/chinadhf/archive/2011/10/09/2203983.html"/><content type="html">&lt;p&gt;浏览器外部署Silverlight时，为了让部署到本地的Silverlight应用程序保持最新，通常需要在应用程序中添加更新检查的功能。具体实现可参见&lt;a href="http://msdn.microsoft.com/zh-cn/library/system.windows.application.checkanddownloadupdateasync(v=vs.95).aspx" target="_blank"&gt;这儿&lt;/a&gt;。&lt;/p&gt;&#xD;
&lt;p&gt;除了文中提到的&amp;ldquo;应用程序中使用了用户尚未安装的Silverlight新版本&amp;rdquo;会造成检查更新失败外，可能还会遇到&amp;ldquo;无法更新应用程序，已安装的应用程序和更新备选程序的证书/签名状态不同。&amp;rdquo;的错误。Silverlight的安全机制要求已安装的应用程序和更新备选程序必须具有相同的证书/签名状态，如果未对XAP包进行签名，则不能满足该要求。因此，如果准备在正式环境中（本机开发环境中一般是遇不到的）实现Silverlight应用程序浏览器外部署时的更新检查，必须对XAP包进行签名。&lt;/p&gt;&#xD;
&lt;p&gt;如果能申请正式的数字证书当然是最好的解决方案，如果只是在企业内部或小范围内应用，也可以采用自制证书对XAP包进行签名，步骤如下：&lt;/p&gt;&#xD;
&lt;p&gt;1、使用makecert建立自制的数字签名：&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;makecert -r -pe -ss Privatecertstore -n "CN=MyName" MyCert.cer&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;如果出现&amp;ldquo; &amp;lsquo;makecert&amp;rsquo;不是内部或外部命令... &amp;rdquo;的提示，是因为makecert所在的路径未加入到系统环境变量Path中，利用Visual Studio Command Prompt可以避免这个问题。&lt;/p&gt;&#xD;
&lt;p&gt;2、利用上一步生成的证书对XAP包进行签名：&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;signtool sign /v /s Privatecertstore /n MyName MyApp.xap&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;由于证书是自制的且未添加到受信任区域，安装Silverlight应用程序到本地时仍会出现&amp;ldquo;无法验证发布者。&amp;rdquo;的警告，但通过以上步骤签名后的Silverlight应用程序已经可以满足&amp;ldquo;已安装的应用程序和更新备选程序必须具有相同的证书/签名状态&amp;rdquo;的要求。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/chinadhf/aggbug/2203983.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/chinadhf/archive/2011/10/09/2203983.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/chinadhf/archive/2010/11/13/1876345.html</id><title type="text">C#调用非托管Dll时的参数传递</title><summary type="text">C#调用非托管Dll时，如果非托管Dll中的方法的参数为char*型，如果将参数单向传递给Dll，C#中应使用string类型参数；如果Dll可能对参数进行修改并返回，C#中应使用StringBuilder类型参数，并注意设置StringBuilder的Capacity使其足以容纳Dll返回的字符串。基本格式类似于：[代码]</summary><published>2010-11-13T02:43:00Z</published><updated>2010-11-13T02:43:00Z</updated><author><name>同一片海</name><uri>http://www.cnblogs.com/chinadhf/</uri></author><link rel="alternate" href="http://www.cnblogs.com/chinadhf/archive/2010/11/13/1876345.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/chinadhf/archive/2010/11/13/1876345.html"/><content type="html">&lt;p&gt;C#调用非托管Dll时，如果非托管Dll中的方法的参数为char*型，如果将参数单向传递给Dll，C#中应使用string类型参数；如果Dll可能对参数进行修改并返回，C#中应使用StringBuilder类型参数，并注意设置StringBuilder的Capacity使其足以容纳Dll返回的字符串。基本格式类似于：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&lt;div&gt;&lt;!--&lt;br/ /&gt;&lt;br/ /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br/ /&gt;http://www.CodeHighlighter.com/&lt;br/ /&gt;&lt;br/ /&gt;--&gt;&lt;span style="color: #000000;"&gt;[DllImport(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;ICCard.dll&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&amp;nbsp;CharSet&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;CharSet.Ansi)]&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;private&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;static&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;extern&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;Rcard(StringBuilder&amp;nbsp;text,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;track);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/chinadhf/aggbug/1876345.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/chinadhf/archive/2010/11/13/1876345.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/chinadhf/archive/2010/09/03/1817336.html</id><title type="text">使用ATL开发ActiveX控件</title><summary type="text">本文描述了使用ATL开发一个ActiveX控件的完整过程。</summary><published>2010-09-03T11:38:00Z</published><updated>2010-09-03T11:38:00Z</updated><author><name>同一片海</name><uri>http://www.cnblogs.com/chinadhf/</uri></author><link rel="alternate" href="http://www.cnblogs.com/chinadhf/archive/2010/09/03/1817336.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/chinadhf/archive/2010/09/03/1817336.html"/><content type="html">&lt;p&gt;本文描述了使用ATL开发一个ActiveX控件的完整过程。&lt;/p&gt;  &lt;p&gt;一、创建项目&lt;/p&gt;  &lt;p&gt;单击起始页中的“New Project…”，选择“ATL”分类下的“ATL Project”项目，项目名称为“Calculator”。在随后出现的项目向导中，使用默认配置即可。&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/chinadhf/WindowsLiveWriter/ATLActiveX_1089F/image_2.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/chinadhf/WindowsLiveWriter/ATLActiveX_1089F/image_thumb.png" width="652" height="552" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;二、添加控件&lt;/p&gt;  &lt;p&gt;在解决方案管理器中的项目上右击，依次选择“Add”、“Class”，在添加类对话框中选择ATL分类下的ATL Control类型。单击“Add”按钮，将会出现添加ATL Control向导。&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/chinadhf/WindowsLiveWriter/ATLActiveX_1089F/image_4.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/chinadhf/WindowsLiveWriter/ATLActiveX_1089F/image_thumb_1.png" width="648" height="553" /&gt;&lt;/a&gt;&amp;#160; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/chinadhf/WindowsLiveWriter/ATLActiveX_1089F/image_6.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/chinadhf/WindowsLiveWriter/ATLActiveX_1089F/image_thumb_2.png" width="649" height="549" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;在向导的第二步中，将接口类型选择为“Dual”，为控件支持事件做为准备，在Support选项中，选中“Connection points”复选框。&lt;/p&gt;  &lt;p&gt;随后出现选择控件要实现的接口的界面，除VS默认添加的实现外，再添加IObjectSafety接口，实现该接口可以避免控件在IE中使用时IE弹出运行的脚本不安全的提示。&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/chinadhf/WindowsLiveWriter/ATLActiveX_1089F/image_8.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/chinadhf/WindowsLiveWriter/ATLActiveX_1089F/image_thumb_3.png" width="655" height="552" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;三、为控件添加并实现方法&lt;/p&gt;  &lt;p&gt;在Class View窗口中右击ICalc接口，依次选择“Add”、“Add Method…”，此处假定我们实现一个加法运算，将方法命名为“Add”，然后添加参数：&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/chinadhf/WindowsLiveWriter/ATLActiveX_1089F/image_10.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/chinadhf/WindowsLiveWriter/ATLActiveX_1089F/image_thumb_4.png" width="643" height="548" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;需要注意的是对返回值的处理。应将参数类型选定为DOUBLE*，并选中“retval”复选框。&lt;/p&gt;  &lt;p&gt;向导结束后，VS自动在Calc.cpp中添加了该方法的空实现，略加修改后的方法代码为：&lt;/p&gt;  &lt;div style="border-bottom: #ccc 1px solid; border-left: #ccc 1px solid; padding-bottom: 3px; background-color: #eee; padding-left: 6px; padding-right: 6px; font-family: courier new, arial; max-height: 300px; overflow: auto; border-top: #ccc 1px solid; border-right: #ccc 1px solid; padding-top: 3px"&gt;   &lt;pre&gt;STDMETHODIMP CCalc::Add(DOUBLE a, DOUBLE b, DOUBLE* result)&#xD;
{&#xD;
	*result = a + b;&#xD;
&#xD;
	&lt;span style="color: #0000ff"&gt;return&lt;/span&gt; S_OK;&#xD;
}&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&#xD;
&lt;br /&gt;&#xD;
&#xD;
&lt;p&gt;测试该方法：&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;由于只是调用该控件进行加法运算，并不需要该控件的界面展示，因此在测试控件之前，可以将VS自动生成的OnDraw方法中的其他代码删除，直接返回 S_OK 即可。&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;对VS自动生成的用于测试的htm略做修改来测试添加的方法。修改后的完整htm代码如下：&lt;/p&gt;&#xD;
&#xD;
&lt;div style="border-bottom: #ccc 1px solid; border-left: #ccc 1px solid; padding-bottom: 3px; background-color: #eee; padding-left: 6px; padding-right: 6px; font-family: courier new, arial; max-height: 300px; overflow: auto; border-top: #ccc 1px solid; border-right: #ccc 1px solid; padding-top: 3px"&gt;&#xD;
  &lt;pre&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;HTML&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;HEAD&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;TITLE&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;ATL 8.0 test page for object Calc&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;TITLE&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;HEAD&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;BODY&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
&#xD;
&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;OBJECT&lt;/span&gt; &lt;span style="color: #ff0000"&gt;ID&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;Calc&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;CLASSID&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;CLSID:59443E6F-7B99-4F75-A7AF-6FEE5B8208CD&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;OBJECT&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
&#xD;
&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;input&lt;/span&gt; &lt;span style="color: #ff0000"&gt;type&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;button&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;value&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;Add&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;onclick&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;add();&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&#xD;
&#xD;
&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;script&lt;/span&gt; &lt;span style="color: #ff0000"&gt;type&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;text/javascript&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
    function add() {&#xD;
        var calc = document.getElementById('Calc');&#xD;
        var result = calc.Add(2, 3);&#xD;
        alert(result);&#xD;
    }&#xD;
&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;script&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
&#xD;
&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;BODY&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;HTML&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&#xD;
&lt;br /&gt;&#xD;
&#xD;
&lt;p&gt;点击“Add”按钮后的运行效果：&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/chinadhf/WindowsLiveWriter/ATLActiveX_1089F/image_12.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/chinadhf/WindowsLiveWriter/ATLActiveX_1089F/image_thumb_5.png" width="374" height="274" /&gt;&lt;/a&gt; &lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;四、为控件添加事件&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;假定控件进行的是一个非常复杂的运算，为了在调用运算时不阻塞调用者线程，可以使用异步方式完成运算。控件在完成运算时需要通知调用者，这时便需要事件。&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;首先按照步骤三中的方法，添加一个异步调用加法运算的方法AddAsync，然后为控件添加运算完成的事件AddCompleted。&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;在Class View窗口中右击_ICalcEvents接口，依次选择“Add”、“Add Method…”，根据添加方法向导添加AddCompleted方法，如下图所示：&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/chinadhf/WindowsLiveWriter/ATLActiveX_1089F/image_14.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/chinadhf/WindowsLiveWriter/ATLActiveX_1089F/image_thumb_6.png" width="657" height="552" /&gt;&lt;/a&gt; &lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;然后在Class View窗口中右击CCalc类，依次选择“Add”、“Add Connection Point…”，在弹出的实现连接点窗口中实现_ICalcEvents接口。&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/chinadhf/WindowsLiveWriter/ATLActiveX_1089F/image_18.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/chinadhf/WindowsLiveWriter/ATLActiveX_1089F/image_thumb_8.png" width="658" height="556" /&gt;&lt;/a&gt; &lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&amp;#160;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;完成向导后，VS会自动为我们生成基本框架，包括引发事件的方法Fire_AddCompleted。我们只需在AddAsync方法中添加运算并在运算结束时调用Fire_AddCompleted的代码：&lt;/p&gt;&#xD;
&#xD;
&lt;div style="border-bottom: #ccc 1px solid; border-left: #ccc 1px solid; padding-bottom: 3px; background-color: #eee; padding-left: 6px; padding-right: 6px; font-family: courier new, arial; max-height: 300px; overflow: auto; border-top: #ccc 1px solid; border-right: #ccc 1px solid; padding-top: 3px"&gt;&#xD;
  &lt;pre&gt;STDMETHODIMP CCalc::AddAsync(DOUBLE a, DOUBLE b)&#xD;
{&#xD;
	&lt;span style="color: #0000ff"&gt;double&lt;/span&gt; result;&#xD;
	result = a + b;&#xD;
	Fire_AddCompleted(&amp;amp;result);&#xD;
&#xD;
	&lt;span style="color: #0000ff"&gt;return&lt;/span&gt; S_OK;&#xD;
}&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&#xD;
&lt;br /&gt;&#xD;
&#xD;
&lt;p&gt;在网页中添加异步计算的代码进行测试（添加的javascript代码如下），应该能够得到我们想要的效果。&lt;/p&gt;&#xD;
&#xD;
&lt;div style="border-bottom: #ccc 1px solid; border-left: #ccc 1px solid; padding-bottom: 3px; background-color: #eee; padding-left: 6px; padding-right: 6px; font-family: courier new, arial; max-height: 300px; overflow: auto; border-top: #ccc 1px solid; border-right: #ccc 1px solid; padding-top: 3px"&gt;&#xD;
  &lt;pre&gt;&amp;lt;script type=&amp;quot;&lt;span style="color: #8b0000"&gt;text/javascript&lt;/span&gt;&amp;quot;&amp;gt;&#xD;
    function addAsync() {&#xD;
        var calc = document.getElementById('Calc');&#xD;
        calc.attachEvent(&amp;quot;&lt;span style="color: #8b0000"&gt;AddCompleted&lt;/span&gt;&amp;quot;, OnAddCompleted);&#xD;
        calc.AddAsync(3, 4);&#xD;
    }&#xD;
&#xD;
    function OnAddCompleted(result) {&#xD;
        alert(result);&#xD;
    }&#xD;
&amp;lt;/script&amp;gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&#xD;
&lt;br /&gt;&#xD;
&#xD;
&lt;p&gt;五、ActiveX控件的事件与多线程&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;细心的读者一定会发现步骤四中所谓的“异步”是假的：虽然在运算结束后使用事件对调用者进行通知，但由于运算是在主线程上进行的，所以调用过程仍是同步的。步骤四其实只是展示了一下事件的简单用法，如果真正实现异步，则需要在控件中使用多线程。&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;在ActiveX控件中使用多线程时需要注意的是：引发事件（即调用Fire_XXXX）必须在窗口线程中进行，否则会导致事件不能被ActiveX控件的容器处理。如果事件发生时执行代码的线程不是窗口线程。那么应该使用PostMessage或SendMessage来通知窗口线程，并在消息处理函数中执行Fire_XXXX。为了使用控件的消息机制，还应该在CCalc的构造函数中将m_bWindowOnly字段设置为TRUE。&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;以下是改为多线程后的部分示例代码：&lt;/p&gt;&#xD;
&#xD;
&lt;div style="border-bottom: #ccc 1px solid; border-left: #ccc 1px solid; padding-bottom: 3px; background-color: #eee; padding-left: 6px; padding-right: 6px; font-family: courier new, arial; max-height: 300px; overflow: auto; border-top: #ccc 1px solid; border-right: #ccc 1px solid; padding-top: 3px"&gt;&#xD;
  &lt;pre&gt;STDMETHODIMP CCalc::AddAsync(DOUBLE a, DOUBLE b)&#xD;
{&#xD;
	m_a = a;&#xD;
	m_b = b;&#xD;
&#xD;
	_beginthreadex(NULL, NULL, AddMethod, this, NULL, NULL);&#xD;
&#xD;
	&lt;span style="color: #0000ff"&gt;return&lt;/span&gt; S_OK;&#xD;
}&#xD;
&#xD;
&lt;span style="color: #0000ff"&gt;unsigned&lt;/span&gt; __stdcall CCalc::AddMethod(LPVOID arg)&#xD;
{&#xD;
	CCalc* pThis = (CCalc*)arg;&#xD;
	pThis-&amp;gt;m_result = pThis-&amp;gt;m_a + pThis-&amp;gt;m_b;&#xD;
&#xD;
	pThis-&amp;gt;SendMessage(WM_ADDCOMPLETED);&#xD;
&#xD;
	&lt;span style="color: #0000ff"&gt;return&lt;/span&gt; 0;&#xD;
}&#xD;
&#xD;
LRESULT CCalc::OnAddCompleted(UINT &lt;span style="color: #008000"&gt;/*uMsg*/&lt;/span&gt;, WPARAM &lt;span style="color: #008000"&gt;/*wParam*/&lt;/span&gt;, LPARAM &lt;span style="color: #008000"&gt;/*lParam*/&lt;/span&gt;, BOOL&amp;amp; &lt;span style="color: #008000"&gt;/*bHandled*/&lt;/span&gt;)&#xD;
{&#xD;
	Fire_AddCompleted(&amp;amp;m_result);&#xD;
&#xD;
	&lt;span style="color: #0000ff"&gt;return&lt;/span&gt; 0;&#xD;
}&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&#xD;
&lt;br /&gt;&#xD;
&#xD;
&lt;p&gt;至此，一个简单的ActiveX控件就开发完成了。关于ActiveX控件的打包部署等问题，可以参考以下内容：&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;1、&lt;a href="http://www.cnblogs.com/chinhr/archive/2008/02/25/1080775.html" target="_blank"&gt;Web发布cab文件打包的ActiveX控件总结&lt;/a&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;2、&lt;a href="http://www.javaeye.com/topic/110834"&gt;ActiveX控件打包成Cab置于网页中自动下载安装&lt;/a&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;3、&lt;a href="http://blog.csdn.net/czbever/archive/2010/03/14/5379740.aspx"&gt;VS2005下MFC开发的ActiveX控件的部分总结&lt;/a&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;本文示例所使用的开发环境为Visual Studio 2010。&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&amp;#160;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;附：使用VC6开发时的注意事项&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;在今天看来，VC6显得有些古老，但由于目前能见到的大多数版本的Windows操作系统已经内置了运行VC6开发的应用程序所需要的库，因此从方便发布的角度看，使用VC6来开发ActiveX控件不失为一个好的选择。&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;使用VC6开发ActiveX控件与上文所述步骤大同小异，但是需要注意微软给开发者留下的两道试题--使用VC6向导生成的代码中包含两处错误：&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;第一处错误位于连接点映射，&lt;strong&gt;DIID__IXXXXEvents&lt;/strong&gt;中的第一个字符‘D’需手动添加。&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;示例代码：&lt;/p&gt;&#xD;
&#xD;
&lt;div style="border-bottom: #ccc 1px solid; border-left: #ccc 1px solid; padding-bottom: 3px; background-color: #eee; padding-left: 6px; padding-right: 6px; font-family: courier new, arial; max-height: 300px; overflow: auto; border-top: #ccc 1px solid; border-right: #ccc 1px solid; padding-top: 3px"&gt;&#xD;
  &lt;pre&gt;BEGIN_CONNECTION_POINT_MAP(CCalc)&#xD;
	CONNECTION_POINT_ENTRY(DIID__ICalcEvents)	&lt;span style="color: #008000"&gt;// 修改 IID_XXXX 为 DIID_XXXX&lt;/span&gt;&#xD;
END_CONNECTION_POINT_MAP()&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&#xD;
&lt;br /&gt;&#xD;
&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;该错误会造成生成失败，比较容易发现。&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;第二处错误位于&lt;strong&gt;Fire_XXXX&lt;/strong&gt;方法内，不会造成生成失败但会造成运行结果莫名其妙，因此该错误更隐蔽一些。&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;示例代码：&lt;/p&gt;&#xD;
&#xD;
&lt;div style="border-bottom: #ccc 1px solid; border-left: #ccc 1px solid; padding-bottom: 3px; background-color: #eee; padding-left: 6px; padding-right: 6px; font-family: courier new, arial; max-height: 300px; overflow: auto; border-top: #ccc 1px solid; border-right: #ccc 1px solid; padding-top: 3px"&gt;&#xD;
  &lt;pre&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (pConnection)&#xD;
{&#xD;
  CComVariant avarParams[1];&#xD;
  avarParams[0].byref = result;    &lt;span style="color: #008000"&gt;//此处自动生成的代码有错误，应去掉原代码中的取址运算&lt;/span&gt;&#xD;
  avarParams[0].vt = VT_R8|VT_BYREF;&#xD;
  CComVariant varResult;&#xD;
&#xD;
  &lt;span style="color: #008000"&gt;//...&lt;/span&gt;&#xD;
}&lt;/pre&gt;&#xD;
&lt;/div&gt;&lt;img src="http://www.cnblogs.com/chinadhf/aggbug/1817336.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/chinadhf/archive/2010/09/03/1817336.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/chinadhf/archive/2010/09/02/1816321.html</id><title type="text">大数据量传输时配置WCF的注意事项</title><summary type="text">WCF传输数据量的能力受到许多因素的制约，如果程序中出现因需要传输的数据量较大而导致调用WCF服务失败的问题，应注意以下配置...</summary><published>2010-09-02T11:35:00Z</published><updated>2010-09-02T11:35:00Z</updated><author><name>同一片海</name><uri>http://www.cnblogs.com/chinadhf/</uri></author><link rel="alternate" href="http://www.cnblogs.com/chinadhf/archive/2010/09/02/1816321.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/chinadhf/archive/2010/09/02/1816321.html"/><content type="html">&lt;p&gt;WCF传输数据量的能力受到许多因素的制约，如果程序中出现因需要传输的数据量较大而导致调用WCF服务失败的问题，应注意以下配置：&lt;/p&gt;  &lt;p&gt;1、MaxReceivedMessageSize：获取或设置配置了此绑定的通道上可以接收的消息的最大大小。&lt;/p&gt;  &lt;p&gt;basicHttpBinding等预定义的绑定一般具有MaxReceivedMessageSize属性，CustomBinding则需要在Transport中定义。&lt;/p&gt;  &lt;p&gt;示例代码：&lt;/p&gt;  &lt;div style="border-bottom: #ccc 1px solid; border-left: #ccc 1px solid; padding-bottom: 3px; background-color: #eee; padding-left: 6px; padding-right: 6px; font-family: courier new, arial; max-height: 300px; overflow: auto; border-top: #ccc 1px solid; border-right: #ccc 1px solid; padding-top: 3px"&gt;   &lt;pre&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;bindings&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
  &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;customBinding&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;binding&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"customBinding"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
      &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;binaryMessageEncoding&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
      &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;binaryMessageEncoding&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
      &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;httpTransport&lt;/span&gt; &lt;span style="color: #ff0000"&gt;maxReceivedMessageSize&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"2147483647"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
      &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;httpTransport&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
    &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;binding&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
  &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;customBinding&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
  &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;basicHttpBinding&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;binding&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"basicBinding"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;maxReceivedMessageSize&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"2147483647"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;binding&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
  &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;basicHttpBinding&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;bindings&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&#xD;
&lt;br /&gt;&#xD;
&#xD;
&lt;p&gt;网上许多地方说应同时设置MaxBufferSize（获取或设置缓冲区的最大大小，该缓冲区用于接收来自通道的消息。），根据MSDN上的解释:&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&amp;#8220;MaxBufferSize 属性的值及其重要性有所不同，这取决于是否在接收消息的通道上对消息进行缓冲或流处理： &lt;/p&gt;&#xD;
&#xD;
&lt;ul&gt;&#xD;
  &lt;li&gt;&#xD;
    &lt;p&gt;对于缓冲传输，（&lt;a href="http://msdn.microsoft.com/zh-cn/library/system.servicemodel.basichttpbinding.transfermode.aspx"&gt;TransferMode&lt;/a&gt; 设置为 &lt;a href="http://msdn.microsoft.com/zh-cn/library/system.servicemodel.transfermode.buffered.aspx"&gt;Buffered&lt;/a&gt;）。该值始终等于由 &lt;a href="http://msdn.microsoft.com/zh-cn/library/system.servicemodel.basichttpbinding.maxreceivedmessagesize.aspx"&gt;MaxReceivedMessageSize&lt;/a&gt; 指定的值。&lt;/p&gt;&#xD;
  &lt;/li&gt;&#xD;
&#xD;
  &lt;li&gt;&#xD;
    &lt;p&gt;对于流传输（&lt;a href="http://msdn.microsoft.com/zh-cn/library/system.servicemodel.basichttpbinding.transfermode.aspx"&gt;TransferMode&lt;/a&gt; 设置为 &lt;a href="http://msdn.microsoft.com/zh-cn/library/system.servicemodel.transfermode.streamed.aspx"&gt;Streamed&lt;/a&gt;），必须对 SOAP 标头进行缓冲才能生成消息。可根据需要对正文进行流处理。在此情况下，MaxBufferSize 小于或等于&lt;a href="http://msdn.microsoft.com/zh-cn/library/system.servicemodel.basichttpbinding.maxreceivedmessagesize.aspx"&gt;MaxReceivedMessageSize&lt;/a&gt;，其中 &lt;a href="http://msdn.microsoft.com/zh-cn/library/system.servicemodel.basichttpbinding.maxreceivedmessagesize.aspx"&gt;MaxReceivedMessageSize&lt;/a&gt; 限制整个消息（标头和正文）的大小，而 MaxBufferSize 仅限制 SOAP 标头的大小。&amp;#8221;&lt;/p&gt;&#xD;
  &lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&#xD;
&lt;p&gt;可见，对于默认的缓冲传输，设置该属性是不必要的。&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;2、ReaderQuotas：获取或设置可由配置了此绑定的终结点处理的 SOAP 消息的复杂性约束。&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;该属性是&lt;a href="http://msdn.microsoft.com/zh-cn/library/system.servicemodel.configuration.xmldictionaryreaderquotaselement(v=VS.90).aspx"&gt;XmlDictionaryReaderQuotasElement&lt;/a&gt;类型，一般需要设置该属性的&lt;a href="http://msdn.microsoft.com/zh-cn/library/system.servicemodel.configuration.xmldictionaryreaderquotaselement.maxarraylength(v=VS.90).aspx"&gt;MaxArrayLength&lt;/a&gt;、&lt;a href="http://msdn.microsoft.com/zh-cn/library/system.servicemodel.configuration.xmldictionaryreaderquotaselement.maxstringcontentlength(v=VS.90).aspx"&gt;MaxStringContentLength&lt;/a&gt;及&lt;a href="http://msdn.microsoft.com/zh-cn/library/system.servicemodel.configuration.xmldictionaryreaderquotaselement.maxdepth(v=VS.90).aspx"&gt;MaxDepth&lt;/a&gt;属性。&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;示例代码：&lt;/p&gt;&#xD;
&#xD;
&lt;div style="border-bottom: #ccc 1px solid; border-left: #ccc 1px solid; padding-bottom: 3px; background-color: #eee; padding-left: 6px; padding-right: 6px; font-family: courier new, arial; max-height: 300px; overflow: auto; border-top: #ccc 1px solid; border-right: #ccc 1px solid; padding-top: 3px"&gt;&#xD;
  &lt;pre&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;bindings&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
  &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;customBinding&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;binding&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"customBinding"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
      &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;binaryMessageEncoding&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
        &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;readerQuotas&lt;/span&gt; &lt;span style="color: #ff0000"&gt;maxArrayLength&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"2147483647"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;maxStringContentLength&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"2147483647"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;maxDepth&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"64"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&#xD;
      &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;binaryMessageEncoding&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
      &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;httpTransport&lt;/span&gt; &lt;span style="color: #ff0000"&gt;maxReceivedMessageSize&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"2147483647"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
      &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;httpTransport&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
    &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;binding&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
  &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;customBinding&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
  &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;basicHttpBinding&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;binding&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"basicBinding"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;maxReceivedMessageSize&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"2147483647"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
      &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;readerQuotas&lt;/span&gt; &lt;span style="color: #ff0000"&gt;maxArrayLength&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"2147483647"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;maxStringContentLength&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"2147483647"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;maxDepth&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"64"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&#xD;
    &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;binding&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
  &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;basicHttpBinding&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;bindings&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&#xD;
&lt;p&gt;3、MaxItemsInObjectGraph：获取对象图中要序列化或反序列化的最大项数。&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;该属性属于&lt;a href="http://msdn.microsoft.com/zh-cn/library/system.runtime.serialization.datacontractserializer.aspx"&gt;DataContractSerializer&lt;/a&gt;类，需要在serviceBehaviors下的behavior节中配置。&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;示例代码：&lt;/p&gt;&#xD;
&#xD;
&lt;div style="border-bottom: #ccc 1px solid; border-left: #ccc 1px solid; padding-bottom: 3px; background-color: #eee; padding-left: 6px; padding-right: 6px; font-family: courier new, arial; max-height: 300px; overflow: auto; border-top: #ccc 1px solid; border-right: #ccc 1px solid; padding-top: 3px"&gt;&#xD;
  &lt;pre&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;behaviors&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
  &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;serviceBehaviors&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;behavior&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"Wcf4BigData.Web.BigDataServiceBehavior"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
      &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;serviceMetadata&lt;/span&gt; &lt;span style="color: #ff0000"&gt;httpGetEnabled&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"true"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&#xD;
      &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;serviceDebug&lt;/span&gt; &lt;span style="color: #ff0000"&gt;includeExceptionDetailInFaults&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"false"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&#xD;
      &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;dataContractSerializer&lt;/span&gt; &lt;span style="color: #ff0000"&gt;maxItemsInObjectGraph&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"2147483647"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&#xD;
    &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;behavior&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
  &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;serviceBehaviors&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;behaviors&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&#xD;
&lt;p&gt;以上是传输大数据量时可能需要设置的属于WCF的几个属性，示例代码中大多将属性值设置为允许的最大值，但设置后并不能保证WCF一定具有传输如此大数据量的能力。另外，这些属性一般需要在服务端和客户端同时设置，但如果使用Silverlight客户端，部分属性如ReaderQuotas并不被支持。&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;4、MaxRequestLength：获取或设置请求的最大大小。&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;如果WCF以IIS作为宿主，WCF传输数据量的能力还受到HttpRunttime设置的制约，可能需要同时HttpRunttime（在system.Web节中）的MaxRequestLength属性。MaxRequestLength属性表示请求的最大大小（以千字节为单位）。默认大小为 4096 KB (4 MB)，允许的最大值是2097151。&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;示例代码：&lt;/p&gt;&#xD;
&#xD;
&lt;div style="border-bottom: #ccc 1px solid; border-left: #ccc 1px solid; padding-bottom: 3px; background-color: #eee; padding-left: 6px; padding-right: 6px; font-family: courier new, arial; max-height: 300px; overflow: auto; border-top: #ccc 1px solid; border-right: #ccc 1px solid; padding-top: 3px"&gt;&#xD;
  &lt;pre&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;httpRuntime&lt;/span&gt; &lt;span style="color: #ff0000"&gt;maxRequestLength&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"2097151"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&#xD;
&lt;br /&gt;&#xD;
&#xD;
&lt;p&gt;&lt;br /&gt;使用以上配置进行测试，从WCF端获取1000万条长度为10的字符串是成功的。每个长度为10的字符串编码后约占32个字节，如此算来，成功传输的数据已经超过300M了，算得上不小的数字了，如果数据量比这还要大的话，怕是网速已经不能满足要求了，这时需要考虑其他的解决方案。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/chinadhf/aggbug/1816321.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/chinadhf/archive/2010/09/02/1816321.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/chinadhf/archive/2010/06/08/1754224.html</id><title type="text">Silverlight自定义主题</title><summary type="text">《在Silverlight 3中使用主题》一文中已经对在Silverlight中使用ToolKit提供的主题做了介绍，本文将介绍在Silverlight中实现并使用自定义主题。</summary><published>2010-06-08T10:37:00Z</published><updated>2010-06-08T10:37:00Z</updated><author><name>同一片海</name><uri>http://www.cnblogs.com/chinadhf/</uri></author><link rel="alternate" href="http://www.cnblogs.com/chinadhf/archive/2010/06/08/1754224.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/chinadhf/archive/2010/06/08/1754224.html"/><content type="html">&lt;p&gt;《&lt;a href="http://www.cnblogs.com/chinadhf/archive/2010/06/07/1753419.html" target="_blank"&gt;在Silverlight 3中使用主题&lt;/a&gt;》一文中已经对在Silverlight中使用ToolKit提供的主题做了介绍，本文将介绍在Silverlight中实现并使用自定义主题。&lt;/p&gt;  &lt;p&gt;有时候我们可能想开发一套具有特色的主题而不是采用ToolKit提供的默认主题，或者我们可能只是为了统一程序的风格而做一些统一处理（例如将所有TextBlock的Margin定义为5），这时我们就需要自定义主题。使用自定义主题时同样需要添加对Silverlight ToolKit中的System.Windows.Controls.Theming.Toolkit程序集的引用。&lt;/p&gt;  &lt;p&gt;以下是实现并使用自定义主题的几种方式：&lt;/p&gt;  &lt;p&gt;一、使用自定义主题文件&lt;/p&gt;  &lt;p&gt;实现步骤：&lt;/p&gt;  &lt;p&gt;1、在项目中添加新项，并选择&amp;#8220;Silverlight 资源字典&amp;#8221;模板。&lt;/p&gt;  &lt;p&gt;本示例添加的主题资源文件名为&amp;#8220;CustomTheme.xaml&amp;#8221;。&lt;/p&gt;  &lt;p&gt;注意：需要将添加的主题资源文件的生成操作设置为&amp;#8220;内容&amp;#8221;。&lt;/p&gt;  &lt;p&gt;2、在主题资源文件中添加样式。&lt;/p&gt;  &lt;p&gt;注意：添加样式时只需指定TargetType属性，无需也不能指定 x:Key。&lt;/p&gt;  &lt;p&gt;CustomTheme.xaml源码：&lt;/p&gt;  &lt;div style="border-bottom: #ccc 1px solid; border-left: #ccc 1px solid; padding-bottom: 3px; background-color: #eee; padding-left: 6px; padding-right: 6px; font-family: courier new, arial; max-height: 300px; overflow: auto; border-top: #ccc 1px solid; border-right: #ccc 1px solid; padding-top: 3px"&gt;   &lt;pre&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;ResourceDictionary&lt;/span&gt;&#xD;
    &lt;span style="color: #ff0000"&gt;xmlns&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"http://schemas.microsoft.com/winfx/2006/xaml/presentation"&lt;/span&gt; &#xD;
    &lt;span style="color: #ff0000"&gt;xmlns&lt;/span&gt;:&lt;span style="color: #ff0000"&gt;x&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"http://schemas.microsoft.com/winfx/2006/xaml"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
&#xD;
    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Style&lt;/span&gt; &lt;span style="color: #ff0000"&gt;TargetType&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"Button"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
        &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Setter&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Property&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"Foreground"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Value&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"Red"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;Setter&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
    &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;Style&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
&#xD;
    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Style&lt;/span&gt; &lt;span style="color: #ff0000"&gt;TargetType&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"TextBox"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
        &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Setter&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Property&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"Foreground"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Value&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"Red"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;Setter&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
    &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;Style&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
&#xD;
&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;ResourceDictionary&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&#xD;
&lt;br /&gt;&#xD;
&#xD;
&lt;p&gt;3、使用ImplicitStyleManager类提供的附加属性将样式应用到控件&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;MainPage.xaml源码：&lt;/p&gt;&#xD;
&#xD;
&lt;div style="border-bottom: #ccc 1px solid; border-left: #ccc 1px solid; padding-bottom: 3px; background-color: #eee; padding-left: 6px; padding-right: 6px; font-family: courier new, arial; max-height: 300px; overflow: auto; border-top: #ccc 1px solid; border-right: #ccc 1px solid; padding-top: 3px"&gt;&#xD;
  &lt;pre&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;UserControl&lt;/span&gt; &#xD;
    &lt;span style="color: #ff0000"&gt;x&lt;/span&gt;:&lt;span style="color: #ff0000"&gt;Class&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"ThemeSample.MainPage"&lt;/span&gt;&#xD;
    &lt;span style="color: #ff0000"&gt;xmlns&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"http://schemas.microsoft.com/winfx/2006/xaml/presentation"&lt;/span&gt; &#xD;
    &lt;span style="color: #ff0000"&gt;xmlns&lt;/span&gt;:&lt;span style="color: #ff0000"&gt;x&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"http://schemas.microsoft.com/winfx/2006/xaml"&lt;/span&gt;&#xD;
    &lt;span style="color: #ff0000"&gt;xmlns&lt;/span&gt;:&lt;span style="color: #ff0000"&gt;Theming&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"clr-namespace:System.Windows.Controls.Theming;assembly=System.Windows.Controls.Theming.Toolkit"&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;StackPanel&lt;/span&gt; &lt;span style="color: #ff0000"&gt;x&lt;/span&gt;:&lt;span style="color: #ff0000"&gt;Name&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"LayoutRoot"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Width&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"160"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Margin&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"100"&lt;/span&gt;&#xD;
                    &lt;span style="color: #ff0000"&gt;Theming&lt;/span&gt;:&lt;span style="color: #ff0000"&gt;ImplicitStyleManager&lt;/span&gt;.&lt;span style="color: #ff0000"&gt;ApplyMode&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"Auto"&lt;/span&gt; &#xD;
                    &lt;span style="color: #ff0000"&gt;Theming&lt;/span&gt;:&lt;span style="color: #ff0000"&gt;ImplicitStyleManager&lt;/span&gt;.&lt;span style="color: #ff0000"&gt;ResourceDictionaryUri&lt;/span&gt;= &lt;span style="color: #0000ff"&gt;"Themes/CustomTheme.xaml"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
        &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Button&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Content&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"Button"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Margin&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"10"&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;Button&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
        &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;TextBox&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Text&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"TextBox"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Margin&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"10"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;TextBox&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
    &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;StackPanel&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;UserControl&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&#xD;
&lt;br /&gt;&#xD;
&#xD;
&lt;p&gt;效果预览：&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/chinadhf/WindowsLiveWriter/Silverlight_FC48/image_2.png" target="_blank"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/chinadhf/WindowsLiveWriter/Silverlight_FC48/image_thumb.png" width="281" height="165" /&gt;&lt;/a&gt; &lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;二、自定义主题控件&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;如果想将自定义主题以程序集的方式发布并提供给第三方使用，就需要自定义主题控件。&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;本示例将以第一种方式所添加的样式文件做为基础实现一个自定义主题控件。&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;实现步骤：&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;1、将CustomTheme.xaml文件的生成操作设置为&amp;#8220;嵌入的资源&amp;#8221;。&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;2、在项目中添加类，并将类定义为从System.Windows.Controls.Theming.Theme类继承。&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;本示例添加的类名为CustomTheme。&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;3、为类添加默认构造函数并为基类的构造函数提供参数。&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;CustomTheme.cs源码：&lt;/p&gt;&#xD;
&#xD;
&lt;div style="border-bottom: #ccc 1px solid; border-left: #ccc 1px solid; padding-bottom: 3px; background-color: #eee; padding-left: 6px; padding-right: 6px; font-family: courier new, arial; max-height: 300px; overflow: auto; border-top: #ccc 1px solid; border-right: #ccc 1px solid; padding-top: 3px"&gt;&#xD;
  &lt;pre&gt;&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Windows.Controls.Theming;&#xD;
&#xD;
&lt;span style="color: #0000ff"&gt;namespace&lt;/span&gt; ThemeSample&#xD;
{&#xD;
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; CustomTheme : Theme&#xD;
    {&#xD;
        &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; CustomTheme()&#xD;
            : &lt;span style="color: #0000ff"&gt;base&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;typeof&lt;/span&gt;(CustomTheme).Assembly, "&lt;span style="color: #8b0000"&gt;ThemeSample.Themes.CustomTheme.xaml&lt;/span&gt;")&#xD;
        {}&#xD;
    }&#xD;
}&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&#xD;
&lt;br /&gt;&#xD;
&#xD;
&lt;p&gt;注意主题资源文件的写法类似于命名空间+文件名，而不是普通路径。&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;4、使用自定义主题控件。&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;MainPage.xaml源码：&lt;/p&gt;&#xD;
&#xD;
&lt;div style="border-bottom: #ccc 1px solid; border-left: #ccc 1px solid; padding-bottom: 3px; background-color: #eee; padding-left: 6px; padding-right: 6px; font-family: courier new, arial; max-height: 300px; overflow: auto; border-top: #ccc 1px solid; border-right: #ccc 1px solid; padding-top: 3px"&gt;&#xD;
  &lt;pre&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;UserControl&lt;/span&gt; &#xD;
    &lt;span style="color: #ff0000"&gt;x&lt;/span&gt;:&lt;span style="color: #ff0000"&gt;Class&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"ThemeSample.MainPage"&lt;/span&gt;&#xD;
    &lt;span style="color: #ff0000"&gt;xmlns&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"http://schemas.microsoft.com/winfx/2006/xaml/presentation"&lt;/span&gt; &#xD;
    &lt;span style="color: #ff0000"&gt;xmlns&lt;/span&gt;:&lt;span style="color: #ff0000"&gt;x&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"http://schemas.microsoft.com/winfx/2006/xaml"&lt;/span&gt;&#xD;
    &lt;span style="color: #ff0000"&gt;xmlns&lt;/span&gt;:&lt;span style="color: #ff0000"&gt;local&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"clr-namespace:ThemeSample"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;local&lt;/span&gt;:&lt;span style="color: #800000"&gt;CustomTheme&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
        &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;StackPanel&lt;/span&gt; &lt;span style="color: #ff0000"&gt;x&lt;/span&gt;:&lt;span style="color: #ff0000"&gt;Name&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"LayoutRoot"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Width&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"160"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Margin&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"100"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
            &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Button&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Content&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"Button"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Margin&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"10"&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;Button&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
            &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;TextBox&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Text&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"TextBox"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Margin&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"10"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;TextBox&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
        &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;StackPanel&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
    &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #c71585"&gt;local&lt;/span&gt;:&lt;span style="color: #800000"&gt;CustomTheme&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;UserControl&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&#xD;
&lt;br /&gt;&#xD;
&#xD;
&lt;p&gt;使用自定义主题控件后的效果与使用第一种方式的效果一致，此处不再展示效果图。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/chinadhf/aggbug/1754224.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/chinadhf/archive/2010/06/08/1754224.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/chinadhf/archive/2010/06/07/1753419.html</id><title type="text">在Silverlight 3中使用主题</title><summary type="text">Silverlight为我们提供了功能非常强大的样式，却没有提供快速应用样式的方法。Silverlight ToolKit中提供的默认样式管理器稍微弥补了这一缺憾，通过默认样式管理器，我们可以相对方便的在应用程序中使用主题。本文介绍了在Silverlight中如何使用主题。</summary><published>2010-06-07T10:50:00Z</published><updated>2010-06-07T10:50:00Z</updated><author><name>同一片海</name><uri>http://www.cnblogs.com/chinadhf/</uri></author><link rel="alternate" href="http://www.cnblogs.com/chinadhf/archive/2010/06/07/1753419.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/chinadhf/archive/2010/06/07/1753419.html"/><content type="html">&lt;p&gt;Silverlight为我们提供了功能非常强大的样式，却没有提供快速应用样式的方法，例如，我们不能像在WPF中那样根据资源中的样式的TargetType将样式自动应用到所有目标类型的元素上（好消息是，在Silverlight 4中已经可以这么做了）。Silverlight ToolKit（本文示例代码引用的ToolKit版本：Microsoft Silverlight 3 Toolkit November 2009）中提供的默认样式管理器（ImplicitStyleManager）稍微弥补了这一缺憾，通过默认样式管理器，我们可以相对方便的在应用程序中使用主题。本文介绍了在Silverlight中如何使用主题。&lt;/p&gt;  &lt;p&gt;前提条件：&lt;/p&gt;  &lt;p&gt;在Silverlight 3中使用主题，首先需要在项目中添加对Silverlight ToolKit中的System.Windows.Controls.Theming.Toolkit程序集的引用。如果使用ToolKit中提供的主题（如TwilightBlue主题等），则需要添加相应主题程序集的引用或使用相应主题的样式文件。&lt;/p&gt;  &lt;p&gt;使用主题的几种方式：&lt;/p&gt;  &lt;p&gt;一、使用主题控件&lt;/p&gt;  &lt;p&gt;&amp;#8220;主题控件&amp;#8221;这种叫法有些别扭，但如果观察一下主题的类继承层次，会发现所有主题均从纯虚类&lt;/p&gt;  &lt;p&gt;System.Windows.Controls.Theming.Theme（简称Theme）中继承，而Theme类则直接继承自ContentControl，因此主题确实是一个控件。&lt;/p&gt;  &lt;p&gt;使用步骤：&lt;/p&gt;  &lt;p&gt;1、添加对相应主题程序集的引用，例如，使用TwilightBlue主题需要添加对System.Windows.Controls.Theming.TwilightBlue程序集的引用。&lt;/p&gt;  &lt;p&gt;2、将需要应用主题的元素放到主题控件的内容中。&lt;/p&gt;  &lt;p&gt;示例代码：&lt;/p&gt;  &lt;div style="border-bottom: #ccc 1px solid; border-left: #ccc 1px solid; padding-bottom: 3px; background-color: #eee; padding-left: 6px; padding-right: 6px; font-family: courier new, arial; max-height: 300px; overflow: auto; border-top: #ccc 1px solid; border-right: #ccc 1px solid; padding-top: 3px"&gt;   &lt;pre&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;UserControl&lt;/span&gt; &#xD;
    &lt;span style="color: #ff0000"&gt;x&lt;/span&gt;:&lt;span style="color: #ff0000"&gt;Class&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"ThemeSample.MainPage"&lt;/span&gt;&#xD;
    &lt;span style="color: #ff0000"&gt;xmlns&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"http://schemas.microsoft.com/winfx/2006/xaml/presentation"&lt;/span&gt; &#xD;
    &lt;span style="color: #ff0000"&gt;xmlns&lt;/span&gt;:&lt;span style="color: #ff0000"&gt;x&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"http://schemas.microsoft.com/winfx/2006/xaml"&lt;/span&gt;&#xD;
    &lt;span style="color: #ff0000"&gt;xmlns&lt;/span&gt;:&lt;span style="color: #ff0000"&gt;TwilightBlueTheme&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"clr-namespace:System.Windows.Controls.Theming;assembly=System.Windows.Controls.Theming.TwilightBlue"&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;TwilightBlueTheme&lt;/span&gt;:&lt;span style="color: #800000"&gt;TwilightBlueTheme&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
        &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;StackPanel&lt;/span&gt; &lt;span style="color: #ff0000"&gt;x&lt;/span&gt;:&lt;span style="color: #ff0000"&gt;Name&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"LayoutRoot"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Width&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"160"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Margin&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"100"&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
            &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Button&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Content&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"Button"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Margin&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"10"&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;Button&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
            &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;TextBox&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Text&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"TextBox"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Margin&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"10"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;TextBox&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
        &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;StackPanel&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
    &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #c71585"&gt;TwilightBlueTheme&lt;/span&gt;:&lt;span style="color: #800000"&gt;TwilightBlueTheme&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;UserControl&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&#xD;
&lt;br /&gt;&#xD;
&#xD;
&lt;p&gt;效果预览：&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/chinadhf/WindowsLiveWriter/Silverlight3_FBA1/image_2.png" target="_blank"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/chinadhf/WindowsLiveWriter/Silverlight3_FBA1/image_thumb.png" width="307" height="175" /&gt;&lt;/a&gt; &lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;二、使用ImplicitStyleManager类提供的附加属性&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;使用该方式时无需添加对相应主题程序集的引用，但是需要使用相应主题提供的样式文件，例如使用TwilightBlue主题时需要System.Windows.Controls.Theming.TwilightBlue.xaml文件，如果已经正确安装了ToolKit，应该能在C:\Program Files\Microsoft SDKs\Silverlight\v3.0\Toolkit\Nov09\Themes\Xaml文件夹找到。&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;使用步骤：&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;1、将样式文件添加到项目中，并将生成操作设置为&amp;#8220;内容&amp;#8221;。&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;2、对需要应用主题的元素设置附件属性。&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;示例代码：&lt;/p&gt;&#xD;
&#xD;
&lt;div style="border-bottom: #ccc 1px solid; border-left: #ccc 1px solid; padding-bottom: 3px; background-color: #eee; padding-left: 6px; padding-right: 6px; font-family: courier new, arial; max-height: 300px; overflow: auto; border-top: #ccc 1px solid; border-right: #ccc 1px solid; padding-top: 3px"&gt;&#xD;
  &lt;pre&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;UserControl&lt;/span&gt; &#xD;
    &lt;span style="color: #ff0000"&gt;x&lt;/span&gt;:&lt;span style="color: #ff0000"&gt;Class&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"ThemeSample.MainPage"&lt;/span&gt;&#xD;
    &lt;span style="color: #ff0000"&gt;xmlns&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"http://schemas.microsoft.com/winfx/2006/xaml/presentation"&lt;/span&gt; &#xD;
    &lt;span style="color: #ff0000"&gt;xmlns&lt;/span&gt;:&lt;span style="color: #ff0000"&gt;x&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"http://schemas.microsoft.com/winfx/2006/xaml"&lt;/span&gt;&#xD;
    &lt;span style="color: #ff0000"&gt;xmlns&lt;/span&gt;:&lt;span style="color: #ff0000"&gt;Theming&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"clr-namespace:System.Windows.Controls.Theming;assembly=System.Windows.Controls.Theming.Toolkit"&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
        &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;StackPanel&lt;/span&gt; &lt;span style="color: #ff0000"&gt;x&lt;/span&gt;:&lt;span style="color: #ff0000"&gt;Name&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"LayoutRoot"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Width&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"160"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Margin&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"100"&lt;/span&gt;  &#xD;
                    &lt;span style="color: #ff0000"&gt;Theming&lt;/span&gt;:&lt;span style="color: #ff0000"&gt;ImplicitStyleManager&lt;/span&gt;.&lt;span style="color: #ff0000"&gt;ApplyMode&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"Auto"&lt;/span&gt; &#xD;
                    &lt;span style="color: #ff0000"&gt;Theming&lt;/span&gt;:&lt;span style="color: #ff0000"&gt;ImplicitStyleManager&lt;/span&gt;.&lt;span style="color: #ff0000"&gt;ResourceDictionaryUri&lt;/span&gt;= &lt;span style="color: #0000ff"&gt;"Themes/TwilightBlue.xaml"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
            &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Button&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Content&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"Button"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Margin&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"10"&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;Button&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
            &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;TextBox&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Text&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"TextBox"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Margin&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"10"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;TextBox&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
        &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;StackPanel&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;UserControl&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&#xD;
&lt;br /&gt;&#xD;
&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;ApplyMode属性有三个可选值: None， OneTime和Auto。 &#xD;
  &lt;br /&gt;None: 不使用样式 &#xD;
&#xD;
  &lt;br /&gt;OneTime: 在页面加载后接受一次指定的样式 &#xD;
&#xD;
  &lt;br /&gt;Auto: 在运行时动态添加的控件也将会使用指定样式&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;效果预览：&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/chinadhf/WindowsLiveWriter/Silverlight3_FBA1/image_4.png" target="_blank"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/chinadhf/WindowsLiveWriter/Silverlight3_FBA1/image_thumb_1.png" width="313" height="184" /&gt;&lt;/a&gt; &lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;三、使用CSharp代码动态改变主题&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;该方式是第二种方式的CSharp实现，同样不需要相应主题的程序集而只需相应主题的样式文件。为方便演示，示例用户控件中添加了一个ComboBox用来动态改变主题。&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;示例代码（XAML）：&lt;/p&gt;&#xD;
&#xD;
&lt;div style="border-bottom: #ccc 1px solid; border-left: #ccc 1px solid; padding-bottom: 3px; background-color: #eee; padding-left: 6px; padding-right: 6px; font-family: courier new, arial; max-height: 300px; overflow: auto; border-top: #ccc 1px solid; border-right: #ccc 1px solid; padding-top: 3px"&gt;&#xD;
  &lt;pre&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;UserControl&lt;/span&gt; &#xD;
    &lt;span style="color: #ff0000"&gt;x&lt;/span&gt;:&lt;span style="color: #ff0000"&gt;Class&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"ThemeSample.MainPage"&lt;/span&gt;&#xD;
    &lt;span style="color: #ff0000"&gt;xmlns&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"http://schemas.microsoft.com/winfx/2006/xaml/presentation"&lt;/span&gt; &#xD;
    &lt;span style="color: #ff0000"&gt;xmlns&lt;/span&gt;:&lt;span style="color: #ff0000"&gt;x&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"http://schemas.microsoft.com/winfx/2006/xaml"&lt;/span&gt;&#xD;
    &lt;span style="color: #ff0000"&gt;xmlns&lt;/span&gt;:&lt;span style="color: #ff0000"&gt;sys&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"clr-namespace:System;assembly=mscorlib"&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
        &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;StackPanel&lt;/span&gt; &lt;span style="color: #ff0000"&gt;x&lt;/span&gt;:&lt;span style="color: #ff0000"&gt;Name&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"LayoutRoot"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Width&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"160"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Margin&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"100"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
            &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Button&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Content&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"Button"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Margin&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"10"&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;Button&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
            &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;TextBox&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Text&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"TextBox"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Margin&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"10"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;TextBox&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
            &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;ComboBox&lt;/span&gt; &lt;span style="color: #ff0000"&gt;SelectionChanged&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"ComboBox_SelectionChanged"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Margin&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"10"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
                &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;sys&lt;/span&gt;:&lt;span style="color: #800000"&gt;String&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;ShinyRed&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #c71585"&gt;sys&lt;/span&gt;:&lt;span style="color: #800000"&gt;String&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
                &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;sys&lt;/span&gt;:&lt;span style="color: #800000"&gt;String&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;TwilightBlue&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #c71585"&gt;sys&lt;/span&gt;:&lt;span style="color: #800000"&gt;String&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
            &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;ComboBox&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
        &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;StackPanel&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;UserControl&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&#xD;
&lt;br /&gt;&#xD;
&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;示例代码（cs）：&lt;/p&gt;&#xD;
&#xD;
&lt;div style="border-bottom: #ccc 1px solid; border-left: #ccc 1px solid; padding-bottom: 3px; background-color: #eee; padding-left: 6px; padding-right: 6px; font-family: courier new, arial; max-height: 300px; overflow: auto; border-top: #ccc 1px solid; border-right: #ccc 1px solid; padding-top: 3px"&gt;&#xD;
  &lt;pre&gt;&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System;&#xD;
&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Windows;&#xD;
&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Windows.Controls;&#xD;
&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Windows.Controls.Theming;&#xD;
&#xD;
&lt;span style="color: #0000ff"&gt;namespace&lt;/span&gt; ThemeSample&#xD;
{&#xD;
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; partial &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; MainPage : UserControl&#xD;
    {&#xD;
        &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; MainPage()&#xD;
        {&#xD;
            InitializeComponent();&#xD;
        }&#xD;
&#xD;
        &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; ComboBox_SelectionChanged(&lt;span style="color: #0000ff"&gt;object&lt;/span&gt; sender, SelectionChangedEventArgs e)&#xD;
        {&#xD;
            &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; themeName = (sender &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; ComboBox).SelectedItem &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt;;&#xD;
            &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;.IsNullOrEmpty(themeName)) &lt;span style="color: #0000ff"&gt;return&lt;/span&gt;;&#xD;
&#xD;
            Uri uri = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Uri(&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;.Format("&lt;span style="color: #8b0000"&gt;Themes/{0}.xaml&lt;/span&gt;", themeName), UriKind.Relative);&#xD;
&#xD;
            ImplicitStyleManager.SetResourceDictionaryUri(LayoutRoot, uri);&#xD;
            ImplicitStyleManager.SetApplyMode(LayoutRoot, ImplicitStylesApplyMode.Auto);&#xD;
        }&#xD;
    }&#xD;
}&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&#xD;
&lt;br /&gt;&#xD;
&#xD;
&lt;p&gt;效果预览：&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/chinadhf/WindowsLiveWriter/Silverlight3_FBA1/image_6.png" target="_blank"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/chinadhf/WindowsLiveWriter/Silverlight3_FBA1/image_thumb_2.png" width="294" height="188" /&gt;&lt;/a&gt; &lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;Silverlight主题存在的缺陷：&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;ToolKit中提供的主题已经能基本满足一般项目中使用主题的要求，但也存在以下缺陷：&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;1、通过将主题应用到容器控件上或将容器控件放在主题控件的内容中的方式，可以将主题自动应用到控件的所有子元素，但无法将主题直接应用到所有页面或用户控件中（当然可以将页面或用户控件作为子元素出现）。&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;2、更糟的是：ChildWindow咋办？&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;在页面或用户控件中应用的主题不能自动应用到打开的子窗口中，虽然我们可以对子窗口应用主题，但应用主题后的子窗口还是会留下很不协调的边框，如下图：&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/chinadhf/WindowsLiveWriter/Silverlight3_FBA1/image_8.png" target="_blank"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/chinadhf/WindowsLiveWriter/Silverlight3_FBA1/image_thumb_3.png" width="336" height="222" /&gt;&lt;/a&gt; &lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;看来要实现对ChildWindow应用主题，还是要靠我们自己写样式和模板，这无疑给应用主题带来了一些困难。同样存在的好消息是，Silverlight 4中，主题已经可以应用到ChildWindow了，下图是一个Window 7风格的ChildWindow：&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/chinadhf/WindowsLiveWriter/Silverlight3_FBA1/image_10.png" target="_blank"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/chinadhf/WindowsLiveWriter/Silverlight3_FBA1/image_thumb_4.png" width="435" height="325" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;以上介绍了如何在Silverlight中使用ToolKit提供的默认主题，&amp;nbsp;如果想了解自定义主题，请阅读《&lt;a title="Silverlight自定义主题" href="http://www.cnblogs.com/chinadhf/archive/2010/06/08/1754224.html" target="_blank"&gt;Silverlight自定义主题&lt;/a&gt;》。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/chinadhf/aggbug/1753419.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/chinadhf/archive/2010/06/07/1753419.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/chinadhf/archive/2010/05/04/1727367.html</id><title type="text">[Silverlight]Selector类到底有没有SelectedValue属性？</title><summary type="text">无论MSDN文档、Visual Studio 2008的对象浏览器、Reflector都证明Selector是没有SelectedValue属性的，但一次调试程序时的偶然发现使我不得不质疑这个问题。</summary><published>2010-05-04T09:18:00Z</published><updated>2010-05-04T09:18:00Z</updated><author><name>同一片海</name><uri>http://www.cnblogs.com/chinadhf/</uri></author><link rel="alternate" href="http://www.cnblogs.com/chinadhf/archive/2010/05/04/1727367.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/chinadhf/archive/2010/05/04/1727367.html"/><content type="html">&lt;p&gt;无论MSDN文档、Visual Studio 2008的对象浏览器、Reflector都证明Selector是没有SelectedValue属性的，但一次调试程序时的偶然发现使我不得不质疑这个问题。&lt;/p&gt;  &lt;p&gt;我的XAML用户控件中有一个名为cmbNormal的ComboBox（ComboBox类是从Selector继承的），以下是调试时的局部变量窗口截图：&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/chinadhf/WindowsLiveWriter/SilverlightSelectorSelectedValue_F31A/image_4.png" target="_blank"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/chinadhf/WindowsLiveWriter/SilverlightSelectorSelectedValue_F31A/image_thumb_1.png" width="906" height="200" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;注意一下选中行，从图中可以看到ComboBox是有SelectedValue和SelectedValuePath这两个属性的，且这两个属性是从Selector类中继承。但是用我所想到的任何其他方法都找不到这两个属性，更无法使用这两个属性，这是为什么？？？&lt;/p&gt;  &lt;p&gt;答案貌似已经揭晓：&lt;/p&gt;  &lt;p&gt;&lt;font color="#ff0000"&gt;Silverlight 3 中的Selector类是没有这两个属性的，但Silverlight 4中的Selector类有这两个属性。&lt;/font&gt;用Silverlight 3 开发竟然把Silverlight 4中的属性显示出来了，晕！&lt;/p&gt;&lt;img src="http://www.cnblogs.com/chinadhf/aggbug/1727367.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/chinadhf/archive/2010/05/04/1727367.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/chinadhf/archive/2010/04/29/1724388.html</id><title type="text">WCF安全之ASP.NET兼容模式</title><summary type="text">本文是利用ASP.NET兼容模式实现WCF安全的一个完整示例，其中用到了ASP.NET的Forms身份验证及Membership，并启用了角色管理。</summary><published>2010-04-29T11:09:00Z</published><updated>2010-04-29T11:09:00Z</updated><author><name>同一片海</name><uri>http://www.cnblogs.com/chinadhf/</uri></author><link rel="alternate" href="http://www.cnblogs.com/chinadhf/archive/2010/04/29/1724388.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/chinadhf/archive/2010/04/29/1724388.html"/><content type="html">&lt;p&gt;本文是利用ASP.NET兼容模式实现WCF安全的一个完整示例，其中用到了ASP.NET的Forms身份验证及Membership，并启用了角色管理。&lt;/p&gt;  &lt;p&gt;由于整套安全方案完全利用ASP.NET相关功能实现，而未用到WCF安全策略相关的包括WCF身份验证、WCF授权及WCF传输安全等元素，所以严格的说，这种模式不能算是WCF的安全模式，但该方案确实实现了特定应用场景下的WCF安全。&lt;/p&gt;  &lt;p&gt;相比而言，该方案提供的安全程度比WCF的安全策要低一些（例如，未提供全过程的数据传输安全），因此，本方案适应对安全性要求不高的，以IIS为宿主的WCF应用。&lt;/p&gt;  &lt;p&gt;本方案中的WCF服务需要以IIS为宿主，可以通过添加“启用Silverlight功能的WCF服务”的方式建立WCF服务。客户端为Silverlight，并在访问WCF服务时使用了Visual Studio 2008自动生成的代理类。&lt;/p&gt;  &lt;p&gt;1、建立项目&lt;/p&gt;  &lt;p&gt;通过创建“Silverlight应用程序”建立新的项目WcfSecSample，并建立承载该Silverlight的网站WcfSecSample.Web。&lt;/p&gt;  &lt;p&gt;2、在Web项目中建立Service目录，并在该目录下添加WCF服务WeatherService，服务类的完整代码如下：&lt;/p&gt;  &lt;div style="border-bottom: #ccc 1px solid; border-left: #ccc 1px solid; padding-bottom: 3px; background-color: #eee; padding-left: 6px; padding-right: 6px; font-family: courier new, arial; overflow: auto; border-top: #ccc 1px solid; border-right: #ccc 1px solid; padding-top: 3px"&gt;   &lt;pre&gt;&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System;&#xD;
&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Linq;&#xD;
&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Runtime.Serialization;&#xD;
&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Security.Principal;&#xD;
&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.ServiceModel;&#xD;
&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.ServiceModel.Activation;&#xD;
&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Collections.Generic;&#xD;
&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Text;&#xD;
&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Web;&#xD;
&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Web.Security;&#xD;
&#xD;
&lt;span style="color: #0000ff"&gt;namespace&lt;/span&gt; WcfSecSample.Web&#xD;
{&#xD;
    [ServiceContract(Namespace = &amp;quot;&lt;span style="color: #8b0000"&gt;&lt;/span&gt;&amp;quot;)]&#xD;
    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]&#xD;
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; WeatherService&#xD;
    {&#xD;
        &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; s_weather = &amp;quot;&lt;span style="color: #8b0000"&gt;Sunny&lt;/span&gt;&amp;quot;;&#xD;
&#xD;
        [OperationContract]&#xD;
        &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; SetWeather(&lt;span style="color: #0000ff"&gt;string&lt;/span&gt; weather)&#xD;
        {&#xD;
            &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (!HttpContext.Current.User.IsInRole(&amp;quot;&lt;span style="color: #8b0000"&gt;Admin&lt;/span&gt;&amp;quot;)) &lt;span style="color: #0000ff"&gt;throw&lt;/span&gt; &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; ApplicationException(&amp;quot;&lt;span style="color: #8b0000"&gt;无权限。&lt;/span&gt;&amp;quot;);&#xD;
&#xD;
            s_weather = weather;&#xD;
        }&#xD;
&#xD;
        [OperationContract]&#xD;
        &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; GetWeather()&#xD;
        {&#xD;
            &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (!HttpContext.Current.User.IsInRole(&amp;quot;&lt;span style="color: #8b0000"&gt;Guest&lt;/span&gt;&amp;quot;)) &lt;span style="color: #0000ff"&gt;throw&lt;/span&gt; &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; ApplicationException(&amp;quot;&lt;span style="color: #8b0000"&gt;无权限。&lt;/span&gt;&amp;quot;);&#xD;
&#xD;
            &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; s_weather;&#xD;
        }&#xD;
    }&#xD;
}&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&#xD;
&lt;p&gt;3、在Web项目中添加用于登录的WCF服务LoginService，该服务类的完整代码如下：&lt;/p&gt;&#xD;
&#xD;
&lt;div style="border-bottom: #ccc 1px solid; border-left: #ccc 1px solid; padding-bottom: 3px; background-color: #eee; padding-left: 6px; padding-right: 6px; font-family: courier new, arial; overflow: auto; border-top: #ccc 1px solid; border-right: #ccc 1px solid; padding-top: 3px"&gt;&#xD;
  &lt;pre&gt;&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System;&#xD;
&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Linq;&#xD;
&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Runtime.Serialization;&#xD;
&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.ServiceModel;&#xD;
&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.ServiceModel.Activation;&#xD;
&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Collections.Generic;&#xD;
&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Text;&#xD;
&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Web.Security;&#xD;
&#xD;
&lt;span style="color: #0000ff"&gt;namespace&lt;/span&gt; WcfSecSample.Web&#xD;
{&#xD;
    [ServiceContract(Namespace = &amp;quot;&lt;span style="color: #8b0000"&gt;&lt;/span&gt;&amp;quot;)]&#xD;
    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]&#xD;
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; LoginService&#xD;
    {&#xD;
        [OperationContract]&#xD;
        &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;bool&lt;/span&gt; Login(&lt;span style="color: #0000ff"&gt;string&lt;/span&gt; userName, &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; password)&#xD;
        {&#xD;
            &lt;span style="color: #0000ff"&gt;bool&lt;/span&gt; isValid = Membership.ValidateUser(userName, password);&#xD;
&#xD;
            &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (isValid) FormsAuthentication.SetAuthCookie(userName, &lt;span style="color: #0000ff"&gt;false&lt;/span&gt;);&#xD;
&#xD;
            &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; isValid;&#xD;
        }&#xD;
&#xD;
        [OperationContract]&#xD;
        &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; SignOut()&#xD;
        {&#xD;
            FormsAuthentication.SignOut();&#xD;
        }&#xD;
    }&#xD;
}&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&#xD;
&lt;p&gt;4、在Web项目中添加继承自MembershipProvider类的CustomerMembershipProvider类，暂时只实现了本方案所需要的ValidateUser方法。ValidateUser方法的代码如下：&lt;/p&gt;&#xD;
&#xD;
&lt;div style="border-bottom: #ccc 1px solid; border-left: #ccc 1px solid; padding-bottom: 3px; background-color: #eee; padding-left: 6px; padding-right: 6px; font-family: courier new, arial; overflow: auto; border-top: #ccc 1px solid; border-right: #ccc 1px solid; padding-top: 3px"&gt;&#xD;
  &lt;pre&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;override&lt;/span&gt; &lt;span style="color: #0000ff"&gt;bool&lt;/span&gt; ValidateUser(&lt;span style="color: #0000ff"&gt;string&lt;/span&gt; username, &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; password)&#xD;
        {&#xD;
            &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; username == &amp;quot;&lt;span style="color: #8b0000"&gt;admin&lt;/span&gt;&amp;quot; &amp;amp;&amp;amp; password == &amp;quot;&lt;span style="color: #8b0000"&gt;123456&lt;/span&gt;&amp;quot; || username == &amp;quot;&lt;span style="color: #8b0000"&gt;guest&lt;/span&gt;&amp;quot;;&#xD;
        }&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&#xD;
&lt;p&gt;5、在Web项目中添加继承自RoleProvider类的CustomRoleProvider类，暂时只实现了本方案所需要的GetRolesForUser方法。GetRolesForUser方法的代码如下：&lt;/p&gt;&#xD;
&#xD;
&lt;div style="border-bottom: #ccc 1px solid; border-left: #ccc 1px solid; padding-bottom: 3px; background-color: #eee; padding-left: 6px; padding-right: 6px; font-family: courier new, arial; overflow: auto; border-top: #ccc 1px solid; border-right: #ccc 1px solid; padding-top: 3px"&gt;&#xD;
  &lt;pre&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;override&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt;[] GetRolesForUser(&lt;span style="color: #0000ff"&gt;string&lt;/span&gt; username)&#xD;
        {&#xD;
            &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (username == &amp;quot;&lt;span style="color: #8b0000"&gt;admin&lt;/span&gt;&amp;quot;) &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; []{&amp;quot;&lt;span style="color: #8b0000"&gt;Admin&lt;/span&gt;&amp;quot;, &amp;quot;&lt;span style="color: #8b0000"&gt;Guest&lt;/span&gt;&amp;quot;};&#xD;
            &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff"&gt;new&lt;/span&gt;[] { &amp;quot;&lt;span style="color: #8b0000"&gt;Guest&lt;/span&gt;&amp;quot; };&#xD;
        }&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&#xD;
&lt;p&gt;需要注意的是，虽然凭感觉HttpContext.Current.User.IsInRole方法应该最终调用RoleProvider类的IsUserInRole方法，但事实却是最终调用了RoleProvider类的GetRolesForUser方法完成的。if (!HttpContext.Current.User.IsInRole(&amp;quot;Admin&amp;quot;))还可以换成if (Roles.IsUserInRole(HttpContext.Current.User.Identity.Name, &amp;quot;Admin&amp;quot;))，同样是最终调用了RoleProvider类的GetRolesForUser方法。&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;6、配置Web.config文件&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;在system.web节内添加如下内容：&lt;/p&gt;&#xD;
&#xD;
&lt;div style="border-bottom: #ccc 1px solid; border-left: #ccc 1px solid; padding-bottom: 3px; background-color: #eee; padding-left: 6px; padding-right: 6px; font-family: courier new, arial; overflow: auto; border-top: #ccc 1px solid; border-right: #ccc 1px solid; padding-top: 3px"&gt;&#xD;
  &lt;pre&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;authentication&lt;/span&gt; &lt;span style="color: #ff0000"&gt;mode&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;Forms&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
      &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;forms&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;.sec&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;loginUrl&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;LoginService.svc&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;forms&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
    &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;authentication&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
&#xD;
    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;membership&lt;/span&gt; &lt;span style="color: #ff0000"&gt;defaultProvider&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;default&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
      &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;providers&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
        &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;add&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;default&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;type&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;WcfSecSample.Web.CustomerMembershipProvider, WcfSecSample.Web&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&#xD;
      &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;providers&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
    &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;membership&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
&#xD;
    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;roleManager&lt;/span&gt; &lt;span style="color: #ff0000"&gt;defaultProvider&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;default&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;enabled&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;true&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
      &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;providers&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
        &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;add&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;default&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;type&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;WcfSecSample.Web.CustomRoleProvider, WcfSecSample.Web&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&#xD;
      &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;providers&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
    &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;roleManager&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&#xD;
&lt;br /&gt;&#xD;
&#xD;
&lt;p&gt;以上三节内容分别配置了身份验证模式、MembershipProvider及RoleProvider。&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;然后在示例服务所在的Service目录下添加Web.config文件，禁止对Service目录的匿名访问。该文件的内容如下：&lt;/p&gt;&#xD;
&#xD;
&lt;div style="border-bottom: #ccc 1px solid; border-left: #ccc 1px solid; padding-bottom: 3px; background-color: #eee; padding-left: 6px; padding-right: 6px; font-family: courier new, arial; overflow: auto; border-top: #ccc 1px solid; border-right: #ccc 1px solid; padding-top: 3px"&gt;&#xD;
  &lt;pre&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;?&lt;/span&gt;xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;&lt;span style="color: #0000ff"&gt;?&amp;gt;&lt;/span&gt;&#xD;
&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;configuration&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;system.web&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
      &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;authorization&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
        &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;deny&lt;/span&gt; &lt;span style="color: #ff0000"&gt;users&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;?&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&#xD;
      &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;authorization&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
    &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;system.web&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;configuration&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&#xD;
&lt;br /&gt;&#xD;
&#xD;
&lt;p&gt;至此，服务端的工作就完成了，接下来建立客户端测试示例。&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;7、添加服务引用。&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;在Silverlight项目中添加对WeatherService的服务引用WeatherServiceRef。需注意的是进行该操作时需要暂时允许对Service目录的匿名访问。&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;8、在MainPage中添加测试代码。完成之后的代码如下：&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;MainPage.xaml文件：&lt;/p&gt;&#xD;
&#xD;
&lt;div style="border-bottom: #ccc 1px solid; border-left: #ccc 1px solid; padding-bottom: 3px; background-color: #eee; padding-left: 6px; padding-right: 6px; font-family: courier new, arial; overflow: auto; border-top: #ccc 1px solid; border-right: #ccc 1px solid; padding-top: 3px"&gt;&#xD;
  &lt;pre&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;UserControl&lt;/span&gt; &lt;span style="color: #ff0000"&gt;x&lt;/span&gt;:&lt;span style="color: #ff0000"&gt;Class&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;WcfSecSample.MainPage&amp;quot;&lt;/span&gt;&#xD;
    &lt;span style="color: #ff0000"&gt;xmlns&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;http://schemas.microsoft.com/winfx/2006/xaml/presentation&amp;quot;&lt;/span&gt; &#xD;
    &lt;span style="color: #ff0000"&gt;xmlns&lt;/span&gt;:&lt;span style="color: #ff0000"&gt;x&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;http://schemas.microsoft.com/winfx/2006/xaml&amp;quot;&lt;/span&gt;&#xD;
    &lt;span style="color: #ff0000"&gt;xmlns&lt;/span&gt;:&lt;span style="color: #ff0000"&gt;d&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;http://schemas.microsoft.com/expression/blend/2008&amp;quot;&lt;/span&gt; &#xD;
    &lt;span style="color: #ff0000"&gt;xmlns&lt;/span&gt;:&lt;span style="color: #ff0000"&gt;mc&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;http://schemas.openxmlformats.org/markup-compatibility/2006&amp;quot;&lt;/span&gt; &#xD;
    &lt;span style="color: #ff0000"&gt;mc&lt;/span&gt;:&lt;span style="color: #ff0000"&gt;Ignorable&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;d&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;d&lt;/span&gt;:&lt;span style="color: #ff0000"&gt;DesignWidth&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;640&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;d&lt;/span&gt;:&lt;span style="color: #ff0000"&gt;DesignHeight&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;480&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Grid&lt;/span&gt; &lt;span style="color: #ff0000"&gt;x&lt;/span&gt;:&lt;span style="color: #ff0000"&gt;Name&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;LayoutRoot&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Width&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;200&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Margin&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;100&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
        &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Grid.RowDefinitions&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
            &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;RowDefinition&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Height&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;Auto&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;RowDefinition&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
            &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;RowDefinition&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Height&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;Auto&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;RowDefinition&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
            &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;RowDefinition&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Height&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;Auto&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;RowDefinition&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
            &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;RowDefinition&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Height&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;Auto&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;RowDefinition&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
            &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;RowDefinition&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Height&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;Auto&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;RowDefinition&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
            &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;RowDefinition&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Height&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;Auto&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;RowDefinition&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
            &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;RowDefinition&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Height&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;*&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;RowDefinition&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
        &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;Grid.RowDefinitions&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
        &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Grid.ColumnDefinitions&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
            &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;ColumnDefinition&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Width&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;Auto&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;ColumnDefinition&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
            &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;ColumnDefinition&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Width&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;*&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;ColumnDefinition&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
        &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;Grid.ColumnDefinitions&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
        &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;TextBlock&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Grid&lt;/span&gt;.&lt;span style="color: #ff0000"&gt;Row&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;0&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Grid&lt;/span&gt;.&lt;span style="color: #ff0000"&gt;Column&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;0&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Margin&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;5&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;UserName:&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;TextBlock&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
        &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;TextBox&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Grid&lt;/span&gt;.&lt;span style="color: #ff0000"&gt;Row&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;0&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Grid&lt;/span&gt;.&lt;span style="color: #ff0000"&gt;Column&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;1&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Margin&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;5&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Name&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;txtUserName&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Text&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;admin&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;TextBox&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
        &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;TextBlock&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Grid&lt;/span&gt;.&lt;span style="color: #ff0000"&gt;Row&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;1&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Grid&lt;/span&gt;.&lt;span style="color: #ff0000"&gt;Column&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;0&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Margin&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;5&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;Password:&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;TextBlock&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
        &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;TextBox&lt;/span&gt;  &lt;span style="color: #ff0000"&gt;Grid&lt;/span&gt;.&lt;span style="color: #ff0000"&gt;Row&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;1&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Grid&lt;/span&gt;.&lt;span style="color: #ff0000"&gt;Column&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;1&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Margin&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;5&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Name&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;txtPassword&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Text&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;123456&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;TextBox&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
        &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Button&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Name&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;btnLogin&amp;quot;&lt;/span&gt;  &lt;span style="color: #ff0000"&gt;Grid&lt;/span&gt;.&lt;span style="color: #ff0000"&gt;Row&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;2&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Grid&lt;/span&gt;.&lt;span style="color: #ff0000"&gt;ColumnSpan&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;2&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Margin&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;5&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Content&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;Login&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Click&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;Login&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;Button&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
        &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Button&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Name&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;btnSignOut&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Grid&lt;/span&gt;.&lt;span style="color: #ff0000"&gt;Row&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;3&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Grid&lt;/span&gt;.&lt;span style="color: #ff0000"&gt;ColumnSpan&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;2&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Margin&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;5&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Content&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;SignOut&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Click&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;SignOut&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;Button&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
        &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Button&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Name&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;btnSetWeather&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Grid&lt;/span&gt;.&lt;span style="color: #ff0000"&gt;Row&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;4&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Grid&lt;/span&gt;.&lt;span style="color: #ff0000"&gt;ColumnSpan&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;2&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Margin&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;5&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Content&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;SetWeather&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Click&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;SetWeather&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;Button&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
        &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Button&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Name&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;btnGetWeather&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Grid&lt;/span&gt;.&lt;span style="color: #ff0000"&gt;Row&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;5&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Grid&lt;/span&gt;.&lt;span style="color: #ff0000"&gt;ColumnSpan&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;2&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Margin&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;5&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Content&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;GetWeather&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Click&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;GetWeather&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;Button&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
    &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;Grid&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;UserControl&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
    &lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&#xD;
&lt;br /&gt;&#xD;
&#xD;
&lt;p&gt;MainPage.xaml.cs文件：&lt;/p&gt;&#xD;
&#xD;
&lt;div style="border-bottom: #ccc 1px solid; border-left: #ccc 1px solid; padding-bottom: 3px; background-color: #eee; padding-left: 6px; padding-right: 6px; font-family: courier new, arial; overflow: auto; border-top: #ccc 1px solid; border-right: #ccc 1px solid; padding-top: 3px"&gt;&#xD;
  &lt;pre&gt;&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System;&#xD;
&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Collections.Generic;&#xD;
&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Linq;&#xD;
&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Net;&#xD;
&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Windows;&#xD;
&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Windows.Controls;&#xD;
&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Windows.Documents;&#xD;
&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Windows.Input;&#xD;
&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Windows.Media;&#xD;
&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Windows.Media.Animation;&#xD;
&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Windows.Shapes;&#xD;
&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; WcfSecSample.LoginServiceRef;&#xD;
&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; WcfSecSample.WeatherServiceRef;&#xD;
&#xD;
&lt;span style="color: #0000ff"&gt;namespace&lt;/span&gt; WcfSecSample&#xD;
{&#xD;
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; partial &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; MainPage : UserControl&#xD;
    {&#xD;
        &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; MainPage()&#xD;
        {&#xD;
            InitializeComponent();&#xD;
&#xD;
            &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.IsLogin = &lt;span style="color: #0000ff"&gt;false&lt;/span&gt;;&#xD;
&#xD;
            &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.client.SetWeatherCompleted += &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; EventHandler&amp;lt;System.ComponentModel.AsyncCompletedEventArgs&amp;gt;(client_SetWeatherCompleted);&#xD;
            &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.client.GetWeatherCompleted += &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; EventHandler&amp;lt;GetWeatherCompletedEventArgs&amp;gt;(client_GetWeatherCompleted);&#xD;
&#xD;
            &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.loginClient.LoginCompleted += &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; EventHandler&amp;lt;LoginCompletedEventArgs&amp;gt;(loginClient_LoginCompleted);&#xD;
            &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.loginClient.SignOutCompleted += &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; EventHandler&amp;lt;System.ComponentModel.AsyncCompletedEventArgs&amp;gt;(loginClient_SignOutCompleted);&#xD;
        }&#xD;
&#xD;
        &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;bool&lt;/span&gt; isLogin;&#xD;
        &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; WeatherServiceClient client = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; WeatherServiceClient();&#xD;
        &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; LoginServiceClient loginClient = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; LoginServiceClient();&#xD;
&#xD;
        &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;bool&lt;/span&gt; IsLogin&#xD;
        {&#xD;
            &lt;span style="color: #0000ff"&gt;get&lt;/span&gt; { &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; isLogin; }&#xD;
            &lt;span style="color: #0000ff"&gt;set&lt;/span&gt;&#xD;
            {&#xD;
                isLogin = &lt;span style="color: #0000ff"&gt;value&lt;/span&gt;;&#xD;
                &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.btnLogin.IsEnabled = !isLogin;&#xD;
                &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.btnSignOut.IsEnabled = isLogin;&#xD;
            }&#xD;
        }&#xD;
&#xD;
        &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; Login(&lt;span style="color: #0000ff"&gt;object&lt;/span&gt; sender, RoutedEventArgs e)&#xD;
        {&#xD;
            &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.loginClient.LoginAsync(&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.txtUserName.Text, &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.txtPassword.Text);&#xD;
        }&#xD;
&#xD;
        &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; SignOut(&lt;span style="color: #0000ff"&gt;object&lt;/span&gt; sender, RoutedEventArgs e)&#xD;
        {&#xD;
            &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.loginClient.SignOutAsync();&#xD;
        }&#xD;
&#xD;
        &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; GetWeather(&lt;span style="color: #0000ff"&gt;object&lt;/span&gt; sender, RoutedEventArgs e)&#xD;
        {&#xD;
            &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.client.GetWeatherAsync();&#xD;
        }&#xD;
&#xD;
        &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; SetWeather(&lt;span style="color: #0000ff"&gt;object&lt;/span&gt; sender, RoutedEventArgs e)&#xD;
        {&#xD;
            &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.client.SetWeatherAsync(&amp;quot;&lt;span style="color: #8b0000"&gt;Cloudy&lt;/span&gt;&amp;quot;);&#xD;
        }&#xD;
&#xD;
        &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; loginClient_LoginCompleted(&lt;span style="color: #0000ff"&gt;object&lt;/span&gt; sender, LoginCompletedEventArgs e)&#xD;
        {&#xD;
            &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (e.Error == &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;)&#xD;
            {&#xD;
                MessageBox.Show(e.Result ? &amp;quot;&lt;span style="color: #8b0000"&gt;Login succeed.&lt;/span&gt;&amp;quot; : &amp;quot;&lt;span style="color: #8b0000"&gt;Login faild.&lt;/span&gt;&amp;quot;);&#xD;
                &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.IsLogin = e.Result;&#xD;
            }&#xD;
            &lt;span style="color: #0000ff"&gt;else&lt;/span&gt;&#xD;
            {&#xD;
                MessageBox.Show(e.Error.Message);&#xD;
            }&#xD;
        }&#xD;
&#xD;
        &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; loginClient_SignOutCompleted(&lt;span style="color: #0000ff"&gt;object&lt;/span&gt; sender, System.ComponentModel.AsyncCompletedEventArgs e)&#xD;
        {&#xD;
            &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (e.Error == &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;)&#xD;
            {&#xD;
                MessageBox.Show(&amp;quot;&lt;span style="color: #8b0000"&gt;SignOut.&lt;/span&gt;&amp;quot;);&#xD;
                &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.IsLogin = &lt;span style="color: #0000ff"&gt;false&lt;/span&gt;;&#xD;
            }&#xD;
            &lt;span style="color: #0000ff"&gt;else&lt;/span&gt;&#xD;
            {&#xD;
                MessageBox.Show(e.Error.Message);&#xD;
            }&#xD;
        }&#xD;
&#xD;
        &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; client_GetWeatherCompleted(&lt;span style="color: #0000ff"&gt;object&lt;/span&gt; sender, GetWeatherCompletedEventArgs e)&#xD;
        {&#xD;
            &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (e.Error == &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;) MessageBox.Show(e.Result);&#xD;
            &lt;span style="color: #0000ff"&gt;else&lt;/span&gt; MessageBox.Show(e.Error.Message);&#xD;
        }&#xD;
&#xD;
        &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; client_SetWeatherCompleted(&lt;span style="color: #0000ff"&gt;object&lt;/span&gt; sender, System.ComponentModel.AsyncCompletedEventArgs e)&#xD;
        {&#xD;
            &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (e.Error == &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;)&#xD;
            {&#xD;
                MessageBox.Show(&amp;quot;&lt;span style="color: #8b0000"&gt;Set weather succeed.&lt;/span&gt;&amp;quot;);&#xD;
            }&#xD;
            &lt;span style="color: #0000ff"&gt;else&lt;/span&gt;&#xD;
            {&#xD;
                MessageBox.Show(e.Error.Message);&#xD;
            }&#xD;
        }&#xD;
    }&#xD;
}&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&#xD;
&lt;br /&gt;&#xD;
&#xD;
&lt;p&gt;为了测试登录对访问服务的影响，以上代码并未根据登录状态对SetWeather、GetWeather按钮的可用性进行控制。&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;运行示例，可以看到在登录之前访问WeatherService是不成功的，如果用Admin角色的账号登录之后可以SetWeather或GetWeather，如果用Guest角色的账号登录则只能GetWeather。登录并调用GetWeather的效果图如下：&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/chinadhf/WindowsLiveWriter/WCFASP.NET_10426/image_2.png" target="_blank"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/chinadhf/WindowsLiveWriter/WCFASP.NET_10426/image_thumb.png" width="419" height="217" /&gt;&lt;/a&gt; &lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;示例测试环境：&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;操作系统：Windows7&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;开发环境：Visual Studio 2008 + Silverlight 3&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;IIS：7.5&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;浏览器：IE8&lt;/p&gt;&lt;img src="http://www.cnblogs.com/chinadhf/aggbug/1724388.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/chinadhf/archive/2010/04/29/1724388.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/chinadhf/archive/2010/04/28/1723203.html</id><title type="text">WCF安全之customBinding</title><summary type="text">本文是关于WCF安全的一个完整示例</summary><published>2010-04-28T10:48:00Z</published><updated>2010-04-28T10:48:00Z</updated><author><name>同一片海</name><uri>http://www.cnblogs.com/chinadhf/</uri></author><link rel="alternate" href="http://www.cnblogs.com/chinadhf/archive/2010/04/28/1723203.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/chinadhf/archive/2010/04/28/1723203.html"/><content type="html">&lt;p&gt;本文是关于WCF安全的一个完整示例，WCF宿主选用IIS，并通过添加&amp;#8220;启用Silverlight功能的WCF服务&amp;#8221;的方式建立WCF服务。&lt;/p&gt;  &lt;p&gt;WCF服务的绑定方式采用Visual Studio 2008默认的customBinding，安全模式选用Transport安全模式（httpsTransport），身份验证模式则选用UserNameOverTransport。&lt;/p&gt;  &lt;p&gt;本示例的客户端为Silverlight，并在访问WCF服务时使用了Visual Studio 2008自动生成的代理类。&lt;/p&gt;  &lt;p&gt;测试用服务类：&lt;/p&gt;  &lt;div style="border-bottom: #ccc 1px solid; border-left: #ccc 1px solid; padding-bottom: 3px; background-color: #eee; padding-left: 6px; padding-right: 6px; font-family: courier new, arial; overflow: auto; border-top: #ccc 1px solid; border-right: #ccc 1px solid; padding-top: 3px"&gt;   &lt;pre&gt;&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System;&#xD;
&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Linq;&#xD;
&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Runtime.Serialization;&#xD;
&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.ServiceModel;&#xD;
&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.ServiceModel.Activation;&#xD;
&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Collections.Generic;&#xD;
&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Text;&#xD;
&#xD;
&lt;span style="color: #0000ff"&gt;namespace&lt;/span&gt; SecSample.Web&#xD;
{&#xD;
    [ServiceContract(Namespace = "&lt;span style="color: #8b0000"&gt;&lt;/span&gt;")]&#xD;
    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]&#xD;
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; WeatherService&#xD;
    {&#xD;
        [OperationContract]&#xD;
        &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; GetWeather()&#xD;
        {&#xD;
            &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; "&lt;span style="color: #8b0000"&gt;Sunny&lt;/span&gt;";&#xD;
        }&#xD;
    }&#xD;
}&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&#xD;
&lt;p&gt;1、配置IIS&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;1.1 生成证书&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;可以使用Makecert.exe工具生成一个测试用的证书，命令如下：&lt;/p&gt;&#xD;
&#xD;
&lt;div style="border-bottom: #ccc 1px solid; border-left: #ccc 1px solid; padding-bottom: 3px; background-color: #eee; padding-left: 6px; padding-right: 6px; font-family: courier new, arial; overflow: auto; border-top: #ccc 1px solid; border-right: #ccc 1px solid; padding-top: 3px"&gt;&#xD;
  &lt;pre&gt;makecert -sr localmachine -ss My -n CN=localhost -sky exchange -pe -r&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;其中cn=localhost，表示证书的名称为localhost。&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;本环节需要注意的问题是：&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;a. 证书名称必须与访问WCF服务所用的域名或机器名一致，否则用IE访问时会出现如下警告&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/chinadhf/WindowsLiveWriter/WCFcustomBinding_F851/image_8.png" target="_blank"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/chinadhf/WindowsLiveWriter/WCFcustomBinding_F851/image_thumb_3.png" width="511" height="299" /&gt;&lt;/a&gt; &lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;用WCF客户端访问时则会导致&amp;#8220;无法为 SSL/TLS 安全通道与颁发机构&amp;#8220;XXXX&amp;#8221;建立信任关系。&amp;#8221;的错误。&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;该限制的直接后果就是造成无法通过不同域名或IP地址访问同一个网站（比如用localhost或192.168.1.8访问本机），暂未找到生成多域名证书的方法，正在郁闷中，如有高手知道解决措施，望不吝赐教。&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;b. 以上命令行生成的证书存储在&amp;#8220;个人&amp;#8221;证书中，需要导入到&amp;#8220;受信任的根证书颁发机构&amp;#8221;或&amp;#8220;受信任的发布者&amp;#8221;中。&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;1.2 为IIS配置绑定&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;编辑网站绑定，添加https类型，并指定SSL证书。如下图：&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/chinadhf/WindowsLiveWriter/WCFcustomBinding_F851/image_2.png" target="_blank"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/chinadhf/WindowsLiveWriter/WCFcustomBinding_F851/image_thumb.png" width="503" height="315" /&gt;&lt;/a&gt; &lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;2、服务端配置&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;Web.config文件中system.serviceModel节的代码如下：&lt;/p&gt;&#xD;
&#xD;
&lt;div style="border-bottom: #ccc 1px solid; border-left: #ccc 1px solid; padding-bottom: 3px; background-color: #eee; padding-left: 6px; padding-right: 6px; font-family: courier new, arial; overflow: auto; border-top: #ccc 1px solid; border-right: #ccc 1px solid; padding-top: 3px"&gt;&#xD;
  &lt;pre&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;system.serviceModel&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;behaviors&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
      &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;serviceBehaviors&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
        &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;behavior&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"defaultServiceBehavior"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
          &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;serviceMetadata&lt;/span&gt; &lt;span style="color: #ff0000"&gt;httpGetEnabled&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"false"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;httpsGetEnabled&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"true"&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&#xD;
          &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;serviceDebug&lt;/span&gt; &lt;span style="color: #ff0000"&gt;includeExceptionDetailInFaults&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"false"&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&#xD;
          &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;serviceCredentials&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
            &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;userNameAuthentication&lt;/span&gt; &lt;span style="color: #ff0000"&gt;userNamePasswordValidationMode&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"Custom"&lt;/span&gt;&#xD;
              &lt;span style="color: #ff0000"&gt;customUserNamePasswordValidatorType&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"SecSample.Web.CustomUserNameValidator,SecSample.Web"&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&#xD;
          &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;serviceCredentials&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
        &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;behavior&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
      &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;serviceBehaviors&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
    &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;behaviors&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;bindings&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
      &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;customBinding&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
        &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;binding&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"defaultCustomBinding"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
          &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;binaryMessageEncoding&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&#xD;
          &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;security&lt;/span&gt; &lt;span style="color: #ff0000"&gt;authenticationMode&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"UserNameOverTransport"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&#xD;
          &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;httpsTransport&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&#xD;
        &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;binding&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
      &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;customBinding&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
    &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;bindings&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;serviceHostingEnvironment&lt;/span&gt; &lt;span style="color: #ff0000"&gt;aspNetCompatibilityEnabled&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"true"&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&#xD;
    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;services&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
      &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;service&lt;/span&gt; &lt;span style="color: #ff0000"&gt;behaviorConfiguration&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"defaultServiceBehavior"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"SecSample.Web.WeatherService"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
        &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;endpoint&lt;/span&gt; &lt;span style="color: #ff0000"&gt;address&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;""&lt;/span&gt; &lt;span style="color: #ff0000"&gt;binding&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"customBinding"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;bindingConfiguration&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"defaultCustomBinding"&lt;/span&gt;&#xD;
          &lt;span style="color: #ff0000"&gt;contract&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"SecSample.Web.WeatherService"&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&#xD;
        &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;endpoint&lt;/span&gt; &lt;span style="color: #ff0000"&gt;address&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"mex"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;binding&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"mexHttpBinding"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;contract&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"IMetadataExchange"&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&#xD;
      &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;service&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
    &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;services&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
  &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;system.serviceModel&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&#xD;
&lt;p&gt;serviceBehaviors节中命名为defaultServiceBehavior的behavior设置了如下内容：&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;a. 允许https协议获取元数据&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;b. userNamePasswordValidationMode选用Custom，验证类为继承自UserNamePasswordValidator类的CustomUserNameValidator类，CustomUserNameValidator类的完整源代码如下：&lt;/p&gt;&#xD;
&#xD;
&lt;div style="border-bottom: #ccc 1px solid; border-left: #ccc 1px solid; padding-bottom: 3px; background-color: #eee; padding-left: 6px; padding-right: 6px; font-family: courier new, arial; overflow: auto; border-top: #ccc 1px solid; border-right: #ccc 1px solid; padding-top: 3px"&gt;&#xD;
  &lt;pre&gt;&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System;&#xD;
&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Collections.Generic;&#xD;
&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.IdentityModel.Selectors;&#xD;
&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Linq;&#xD;
&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.ServiceModel;&#xD;
&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Web;&#xD;
&#xD;
&lt;span style="color: #0000ff"&gt;namespace&lt;/span&gt; SecSample.Web&#xD;
{&#xD;
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; CustomUserNameValidator : UserNamePasswordValidator&#xD;
    {&#xD;
&#xD;
        &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;override&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; Validate(&lt;span style="color: #0000ff"&gt;string&lt;/span&gt; userName, &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; password)&#xD;
        {&#xD;
            &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (userName == "&lt;span style="color: #8b0000"&gt;admin&lt;/span&gt;" &amp;amp;&amp;amp; password == "&lt;span style="color: #8b0000"&gt;123456&lt;/span&gt;") &lt;span style="color: #0000ff"&gt;return&lt;/span&gt;;&#xD;
            &lt;span style="color: #0000ff"&gt;throw&lt;/span&gt; &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; ApplicationException("&lt;span style="color: #8b0000"&gt;验证失败！&lt;/span&gt;");&#xD;
        }&#xD;
    }&#xD;
}&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;customBinding节中命名为defaultCustomBinding的binding设置了customBinding所选用的编码方式（binaryMessageEncoding）、安全验证模式（UserNameOverTransport）及传输协议（httpsTransport）。&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;3、客户端配置&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;客户端ServiceReferences.ClientConfig文件的完整代码如下：&lt;/p&gt;&#xD;
&#xD;
&lt;div style="border-bottom: #ccc 1px solid; border-left: #ccc 1px solid; padding-bottom: 3px; background-color: #eee; padding-left: 6px; padding-right: 6px; font-family: courier new, arial; overflow: auto; border-top: #ccc 1px solid; border-right: #ccc 1px solid; padding-top: 3px"&gt;&#xD;
  &lt;pre&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;configuration&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
  &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;system.serviceModel&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;bindings&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
      &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;customBinding&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
        &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;binding&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"defaultCustomBinding"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
          &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;binaryMessageEncoding&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&#xD;
          &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;security&lt;/span&gt; &lt;span style="color: #ff0000"&gt;authenticationMode&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"UserNameOverTransport"&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&#xD;
          &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;httpsTransport&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&#xD;
        &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;binding&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
      &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;customBinding&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
    &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;bindings&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;client&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
      &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;endpoint&lt;/span&gt; &lt;span style="color: #ff0000"&gt;address&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"../WeatherService.svc"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;binding&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"customBinding"&lt;/span&gt;&#xD;
        &lt;span style="color: #ff0000"&gt;bindingConfiguration&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"defaultCustomBinding"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;contract&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"WeatherServiceRef.WeatherService"&lt;/span&gt;&#xD;
        &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"CustomBinding_WeatherService"&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&#xD;
    &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;client&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
  &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;system.serviceModel&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;configuration&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&#xD;
&lt;p&gt;由于Silverlight及WCF使用同一个网站承载并假定相对位置固定，客户端终结点使用了相对地址&amp;#8220;../WeatherService.svc&amp;#8221;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;以避免更换域名造成的问题（可惜证书与域名绑定的问题避免不了），customBinding节中则作了与服务器端对应的配置。&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;4、客户端示例页面&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;MainPage.xaml文件：&lt;/p&gt;&#xD;
&#xD;
&lt;div style="border-bottom: #ccc 1px solid; border-left: #ccc 1px solid; padding-bottom: 3px; background-color: #eee; padding-left: 6px; padding-right: 6px; font-family: courier new, arial; overflow: auto; border-top: #ccc 1px solid; border-right: #ccc 1px solid; padding-top: 3px"&gt;&#xD;
  &lt;pre&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;UserControl&lt;/span&gt; &lt;span style="color: #ff0000"&gt;x&lt;/span&gt;:&lt;span style="color: #ff0000"&gt;Class&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"SecSample.MainPage"&lt;/span&gt;&#xD;
    &lt;span style="color: #ff0000"&gt;xmlns&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"http://schemas.microsoft.com/winfx/2006/xaml/presentation"&lt;/span&gt; &#xD;
    &lt;span style="color: #ff0000"&gt;xmlns&lt;/span&gt;:&lt;span style="color: #ff0000"&gt;x&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"http://schemas.microsoft.com/winfx/2006/xaml"&lt;/span&gt;&#xD;
    &lt;span style="color: #ff0000"&gt;xmlns&lt;/span&gt;:&lt;span style="color: #ff0000"&gt;d&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"http://schemas.microsoft.com/expression/blend/2008"&lt;/span&gt; &#xD;
    &lt;span style="color: #ff0000"&gt;xmlns&lt;/span&gt;:&lt;span style="color: #ff0000"&gt;mc&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"http://schemas.openxmlformats.org/markup-compatibility/2006"&lt;/span&gt; &#xD;
    &lt;span style="color: #ff0000"&gt;mc&lt;/span&gt;:&lt;span style="color: #ff0000"&gt;Ignorable&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"d"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;d&lt;/span&gt;:&lt;span style="color: #ff0000"&gt;DesignWidth&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"640"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;d&lt;/span&gt;:&lt;span style="color: #ff0000"&gt;DesignHeight&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"480"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
  &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Grid&lt;/span&gt; &lt;span style="color: #ff0000"&gt;x&lt;/span&gt;:&lt;span style="color: #ff0000"&gt;Name&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"LayoutRoot"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
        &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Button&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Name&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"btnGet"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Content&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"GetWeather"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Click&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"GetWeather"&lt;/span&gt;&#xD;
                &lt;span style="color: #ff0000"&gt;HorizontalAlignment&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"Center"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;VerticalAlignment&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"Center"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;Button&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
  &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;Grid&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;UserControl&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&#xD;
&lt;p&gt;MainPage.xaml.cs文件：&lt;/p&gt;&#xD;
&#xD;
&lt;div style="border-bottom: #ccc 1px solid; border-left: #ccc 1px solid; padding-bottom: 3px; background-color: #eee; padding-left: 6px; padding-right: 6px; font-family: courier new, arial; overflow: auto; border-top: #ccc 1px solid; border-right: #ccc 1px solid; padding-top: 3px"&gt;&#xD;
  &lt;pre&gt;&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System;&#xD;
&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Collections.Generic;&#xD;
&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Linq;&#xD;
&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Net;&#xD;
&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Windows;&#xD;
&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Windows.Controls;&#xD;
&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Windows.Documents;&#xD;
&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Windows.Input;&#xD;
&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Windows.Media;&#xD;
&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Windows.Media.Animation;&#xD;
&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Windows.Shapes;&#xD;
&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; SecSample.WeatherServiceRef;&#xD;
&#xD;
&lt;span style="color: #0000ff"&gt;namespace&lt;/span&gt; SecSample&#xD;
{&#xD;
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; partial &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; MainPage : UserControl&#xD;
    {&#xD;
        &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; MainPage()&#xD;
        {&#xD;
            InitializeComponent();&#xD;
&#xD;
            _client = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; SecSample.WeatherServiceRef.WeatherServiceClient();&#xD;
&#xD;
            _client.ClientCredentials.UserName.UserName = "&lt;span style="color: #8b0000"&gt;admin&lt;/span&gt;";&#xD;
            _client.ClientCredentials.UserName.Password = "&lt;span style="color: #8b0000"&gt;123456&lt;/span&gt;";&#xD;
&#xD;
             &#xD;
            _client.GetWeatherCompleted += &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; EventHandler&amp;lt;GetWeatherCompletedEventArgs&amp;gt;(_client_GetWeatherCompleted);&#xD;
        }&#xD;
        &#xD;
        &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; WeatherServiceClient _client;&#xD;
&#xD;
        &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; GetWeather(&lt;span style="color: #0000ff"&gt;object&lt;/span&gt; sender, RoutedEventArgs e)&#xD;
        {&#xD;
            &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;._client.GetWeatherAsync();&#xD;
            &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.btnGet.IsEnabled = &lt;span style="color: #0000ff"&gt;false&lt;/span&gt;;&#xD;
        }&#xD;
&#xD;
        &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; _client_GetWeatherCompleted(&lt;span style="color: #0000ff"&gt;object&lt;/span&gt; sender, GetWeatherCompletedEventArgs e)&#xD;
        {&#xD;
            &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.btnGet.IsEnabled = &lt;span style="color: #0000ff"&gt;true&lt;/span&gt;;&#xD;
            &#xD;
            &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (e.Error == &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;)&#xD;
            {&#xD;
                MessageBox.Show(e.Result);&#xD;
            }&#xD;
            &lt;span style="color: #0000ff"&gt;else&lt;/span&gt;&#xD;
            {&#xD;
                MessageBox.Show(e.Error.Message);&#xD;
            }&#xD;
        }&#xD;
    }&#xD;
}&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&#xD;
&lt;p&gt;示例页面非常简单，添加一个按钮并在按钮单击时调用WCF服务，调用成功时显示调用结果，否则显示错误信息。&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;需注意的是客户端代理类的初始化，在服务器端要求UserNameOverTransport验证后，需要为客户端代理类指定UserName及Password。&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;至此，整个示例就完成了。运行效果图如下：&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/chinadhf/WindowsLiveWriter/WCFcustomBinding_F851/image_6.png" target="_blank"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/chinadhf/WindowsLiveWriter/WCFcustomBinding_F851/image_thumb_2.png" width="363" height="212" /&gt;&lt;/a&gt; &lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;但如果用另一个机器访问该服务，会可能会出现如下警告：&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/chinadhf/WindowsLiveWriter/WCFcustomBinding_F851/image_4.png" target="_blank"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/chinadhf/WindowsLiveWriter/WCFcustomBinding_F851/image_thumb_1.png" width="400" height="291" /&gt;&lt;/a&gt; &lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;这是由于我们使用的只是自己生成的测试用证书，而该证书并没有受到客户机的信任。如果只是测试或企业内部使用，客户端将该证书安装到受信任区域即可，如果是正式对外提供服务，则可能需要向相关机构申请正式证书。&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;示例测试环境：&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;操作系统：Windows7&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;开发环境：Visual Studio 2008 + Silverlight 3&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;IIS：7.5&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;浏览器：IE8&lt;/p&gt;&lt;img src="http://www.cnblogs.com/chinadhf/aggbug/1723203.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/chinadhf/archive/2010/04/28/1723203.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/chinadhf/archive/2010/04/27/1722321.html</id><title type="text">[Silverlight]AutoCompleteBox控件的一个Bug？</title><summary type="text">我是轻易不说微软的代码有Bug的，因为往往在说了以后发现其实是自己错了。不过这次真的找不出自己哪儿错了，就大胆说一次吧。</summary><published>2010-04-27T11:04:00Z</published><updated>2010-04-27T11:04:00Z</updated><author><name>同一片海</name><uri>http://www.cnblogs.com/chinadhf/</uri></author><link rel="alternate" href="http://www.cnblogs.com/chinadhf/archive/2010/04/27/1722321.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/chinadhf/archive/2010/04/27/1722321.html"/><content type="html">&lt;p&gt;我是轻易不说微软的代码有Bug的，因为往往在说了以后发现其实是自己错了。不过这次真的找不出自己哪儿错了，就大胆说一次吧。&lt;/p&gt;  &lt;p&gt;先说明一下使用场景，使用Silverlight ToolKit中提供的AutoCompleteBox作为员工输入控件。代码如下：&lt;/p&gt;  &lt;p&gt;AutoCompleteBoxDemo.xaml代码：&lt;/p&gt;  &lt;div style="border-bottom: #ccc 1px solid; border-left: #ccc 1px solid; padding-bottom: 3px; background-color: #eee; padding-left: 6px; padding-right: 6px; font-family: courier new, arial; overflow: auto; border-top: #ccc 1px solid; border-right: #ccc 1px solid; padding-top: 3px"&gt;   &lt;pre&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;UserControl&lt;/span&gt; &lt;span style="color: #ff0000"&gt;x&lt;/span&gt;:&lt;span style="color: #ff0000"&gt;Class&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"AutoCompleteBoxSample.AutoCompleteBoxDemo"&lt;/span&gt;&#xD;
    &lt;span style="color: #ff0000"&gt;xmlns&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"http://schemas.microsoft.com/winfx/2006/xaml/presentation"&lt;/span&gt; &#xD;
    &lt;span style="color: #ff0000"&gt;xmlns&lt;/span&gt;:&lt;span style="color: #ff0000"&gt;x&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"http://schemas.microsoft.com/winfx/2006/xaml"&lt;/span&gt; &#xD;
    &lt;span style="color: #ff0000"&gt;xmlns&lt;/span&gt;:&lt;span style="color: #ff0000"&gt;Controls&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Input"&lt;/span&gt; &#xD;
    &lt;span style="color: #ff0000"&gt;Width&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"400"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Height&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"300"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;StackPanel&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Orientation&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"Horizontal"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Margin&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"30"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;VerticalAlignment&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"Center"&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
        &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;TextBlock&lt;/span&gt; &lt;span style="color: #ff0000"&gt;VerticalAlignment&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"Center"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;Employee:&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;TextBlock&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
        &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;Controls&lt;/span&gt;:&lt;span style="color: #800000"&gt;AutoCompleteBox&lt;/span&gt;  &lt;span style="color: #ff0000"&gt;x&lt;/span&gt;:&lt;span style="color: #ff0000"&gt;Name&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"acb"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Width&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"160"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;SelectionChanged&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"OnSelectionChanged"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
            &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;Controls&lt;/span&gt;:&lt;span style="color: #800000"&gt;AutoCompleteBox.ItemTemplate&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
                &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;DataTemplate&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
                    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;StackPanel&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Orientation&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"Horizontal"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
                        &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;TextBlock&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Text&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"{Binding Code}"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;TextBlock&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
                        &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;TextBlock&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Text&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"-"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;TextBlock&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
                        &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;TextBlock&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Text&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"{Binding Name}"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;TextBlock&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
                    &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;StackPanel&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;                        &#xD;
                &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;DataTemplate&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
            &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #c71585"&gt;Controls&lt;/span&gt;:&lt;span style="color: #800000"&gt;AutoCompleteBox.ItemTemplate&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
        &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #c71585"&gt;Controls&lt;/span&gt;:&lt;span style="color: #800000"&gt;AutoCompleteBox&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
        &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;TextBlock&lt;/span&gt; &lt;span style="color: #ff0000"&gt;VerticalAlignment&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"Center"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Margin&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"10,0,0,0"&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;You select:&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;TextBlock&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
        &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;TextBlock&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Name&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"txbName"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;VerticalAlignment&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"Center"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;TextBlock&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
    &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;StackPanel&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;UserControl&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;AutoCompleteBoxDemo.xaml.cs代码：&lt;/p&gt;&#xD;
&#xD;
&lt;div style="border-bottom: #ccc 1px solid; border-left: #ccc 1px solid; padding-bottom: 3px; background-color: #eee; padding-left: 6px; padding-right: 6px; font-family: courier new, arial; overflow: auto; border-top: #ccc 1px solid; border-right: #ccc 1px solid; padding-top: 3px"&gt;&#xD;
  &lt;pre&gt;&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Windows.Controls;&#xD;
&#xD;
&lt;span style="color: #0000ff"&gt;namespace&lt;/span&gt; AutoCompleteBoxSample&#xD;
{&#xD;
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; partial &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; AutoCompleteBoxDemo : UserControl&#xD;
    {&#xD;
        &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; AutoCompleteBoxDemo()&#xD;
        {&#xD;
            InitializeComponent();&#xD;
&#xD;
            EmployeeBll bll = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; EmployeeBll();&#xD;
            &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.acb.ItemsSource = bll.EmployeeList;&#xD;
        }&#xD;
&#xD;
        &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; OnSelectionChanged(&lt;span style="color: #0000ff"&gt;object&lt;/span&gt; sender, SelectionChangedEventArgs e)&#xD;
        {&#xD;
            Employee employee = &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.acb.SelectedItem &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; Employee;&#xD;
            &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.txbName.Text = employee == &lt;span style="color: #0000ff"&gt;null&lt;/span&gt; ? "&lt;span style="color: #8b0000"&gt;&lt;/span&gt;" : employee.Code;&#xD;
        }&#xD;
    }&#xD;
}&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&#xD;
&lt;p&gt;Employee.cs代码：&lt;/p&gt;&#xD;
&#xD;
&lt;div style="border-bottom: #ccc 1px solid; border-left: #ccc 1px solid; padding-bottom: 3px; background-color: #eee; padding-left: 6px; padding-right: 6px; font-family: courier new, arial; overflow: auto; border-top: #ccc 1px solid; border-right: #ccc 1px solid; padding-top: 3px"&gt;&#xD;
  &lt;pre&gt;&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Collections.Generic;&#xD;
&#xD;
&lt;span style="color: #0000ff"&gt;namespace&lt;/span&gt; AutoCompleteBoxSample&#xD;
{&#xD;
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; Employee&#xD;
    {&#xD;
        &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; Code { &lt;span style="color: #0000ff"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff"&gt;set&lt;/span&gt;; }&#xD;
        &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; Name { &lt;span style="color: #0000ff"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff"&gt;set&lt;/span&gt;; }&#xD;
        &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; Age { &lt;span style="color: #0000ff"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff"&gt;set&lt;/span&gt;; }&#xD;
&#xD;
        &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;override&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; ToString()&#xD;
        {&#xD;
            &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; Name;&#xD;
        }&#xD;
    }&#xD;
&#xD;
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; EmployeeBll&#xD;
    {&#xD;
        &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; EmployeeBll()&#xD;
        {&#xD;
            &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.employeeList = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; List&amp;lt;Employee&amp;gt;();&#xD;
            &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.employeeList.Add(&lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Employee { Code = "&lt;span style="color: #8b0000"&gt;001&lt;/span&gt;", Name = "&lt;span style="color: #8b0000"&gt;Mike&lt;/span&gt;", Age = 16 });&#xD;
            &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.employeeList.Add(&lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Employee { Code = "&lt;span style="color: #8b0000"&gt;002&lt;/span&gt;", Name = "&lt;span style="color: #8b0000"&gt;Mike&lt;/span&gt;", Age = 18 });&#xD;
            &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.employeeList.Add(&lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Employee { Code = "&lt;span style="color: #8b0000"&gt;003&lt;/span&gt;", Name = "&lt;span style="color: #8b0000"&gt;Rose&lt;/span&gt;", Age = 20 });&#xD;
&#xD;
        }&#xD;
&#xD;
        &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; List&amp;lt;Employee&amp;gt; employeeList;&#xD;
&#xD;
        &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; List&amp;lt;Employee&amp;gt; EmployeeList&#xD;
        {&#xD;
            &lt;span style="color: #0000ff"&gt;get&lt;/span&gt; { &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.employeeList; }&#xD;
        }&#xD;
    }&#xD;
}&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;真是不巧，三个员工中竟然有其中两个重名。&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;现在我运行程序，开始输入了。输入M后，AutoCompleteBox控件下拉列表中正确的显示出匹配的内容，如下图所示：&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/chinadhf/WindowsLiveWriter/SilverlightAutoCompleteBoxBug_10801/image_4.png" target="_blank"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/chinadhf/WindowsLiveWriter/SilverlightAutoCompleteBoxBug_10801/image_thumb_1.png" width="376" height="119" /&gt;&lt;/a&gt; &lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;然后，我用鼠标选择了002-Mike。通过名为txbName的TextBlock展示出来的选择结果却显示我选择了001（如果对选择过程进行跟踪的话，会发现确实首先选中了002，但SelectionChanged事件很快被再次激发，选中项变成了001），如下图所示：&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/chinadhf/WindowsLiveWriter/SilverlightAutoCompleteBoxBug_10801/image_6.png" target="_blank"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/chinadhf/WindowsLiveWriter/SilverlightAutoCompleteBoxBug_10801/image_thumb_2.png" width="371" height="103" /&gt;&lt;/a&gt; &lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;通过查看AutoCompleteBox的源码，发现在其中的UpdateTextCompletion方法中用代码片段1重新获取了与文本匹配的选中项，并在重新获取的选中项与当前选中项不一致时改写了当前选中项（见代码片段2）。由于TryGetMatch方法在获取与文本匹配的项时找到第一个匹配项便立即返回，因此当ItemsSource中项的ToString方法的结果不能唯一确定某一个项时（或者为AutoCompleteBox指定ValueMemberPath且ItemsSource中项的该属性值不能唯一确定某一个项时），便会出现以上所描述的问题。&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;UpdateTextCompletion方法代码片段1：&lt;/p&gt;&#xD;
&#xD;
&lt;div style="border-bottom: #ccc 1px solid; border-left: #ccc 1px solid; padding-bottom: 3px; background-color: #eee; padding-left: 6px; padding-right: 6px; font-family: courier new, arial; overflow: auto; border-top: #ccc 1px solid; border-right: #ccc 1px solid; padding-top: 3px"&gt;&#xD;
  &lt;pre&gt;newSelectedItem = TryGetMatch(text, _view, AutoCompleteSearch.GetFilter(AutoCompleteFilterMode.EqualsCaseSensitive));&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&#xD;
&lt;p&gt;UpdateTextCompletion方法代码片段2：&lt;/p&gt;&#xD;
&#xD;
&lt;div style="border-bottom: #ccc 1px solid; border-left: #ccc 1px solid; padding-bottom: 3px; background-color: #eee; padding-left: 6px; padding-right: 6px; font-family: courier new, arial; overflow: auto; border-top: #ccc 1px solid; border-right: #ccc 1px solid; padding-top: 3px"&gt;&#xD;
  &lt;pre&gt;&lt;span style="color: #008000"&gt;// Update the selected item property&lt;/span&gt;&#xD;
&#xD;
&lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (SelectedItem != newSelectedItem)&#xD;
{&#xD;
    _skipSelectedItemTextUpdate = &lt;span style="color: #0000ff"&gt;true&lt;/span&gt;;&#xD;
}&#xD;
SelectedItem = newSelectedItem;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&#xD;
&lt;p&gt;结束语：或许这种用法不是AutoCompleteBox开发人员的本意？但现实中这种情况还是普遍存在的，不知该不该算是AutoCompleteBox控件的一个Bug。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/chinadhf/aggbug/1722321.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/chinadhf/archive/2010/04/27/1722321.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry></feed>
