<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>CQ-CSER &#187; Silverlight</title>
	<atom:link href="http://cq-cser.cn/category/silverlight/feed/" rel="self" type="application/rss+xml" />
	<link>http://cq-cser.cn</link>
	<description>计算机爱好者</description>
	<lastBuildDate>Sun, 15 Jan 2012 08:17:54 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>微软一站式示例代码库 4 月小结</title>
		<link>http://cq-cser.cn/2010/05/%e5%be%ae%e8%bd%af%e4%b8%80%e7%ab%99%e5%bc%8f%e7%a4%ba%e4%be%8b%e4%bb%a3%e7%a0%81%e5%ba%93-4-%e6%9c%88%e5%b0%8f%e7%bb%93/</link>
		<comments>http://cq-cser.cn/2010/05/%e5%be%ae%e8%bd%af%e4%b8%80%e7%ab%99%e5%bc%8f%e7%a4%ba%e4%be%8b%e4%bb%a3%e7%a0%81%e5%ba%93-4-%e6%9c%88%e5%b0%8f%e7%bb%93/#comments</comments>
		<pubDate>Tue, 18 May 2010 07:07:03 +0000</pubDate>
		<dc:creator>cq</dc:creator>
				<category><![CDATA[Silverlight]]></category>

		<guid isPermaLink="false">http://cq-cser.cn/?p=1193</guid>
		<description><![CDATA[作者: Jialiang 发表于 2010-05-18 13:21 原文链接 微软一站式示例代码库(http://1code.codeplex.com/ ）4月小结 4月份项目组里发生了不少可喜之事，比如这个项目拿了微软内部的一个什么奖之类的。：-）   1. 新发布 4 篇KB •    How to consume ADO.NET Data Services in Silverlight 3 This article describes an All-In-One Code Framework sample that is available for download. You can consume Microsoft ADO.NET Data Services in Microsoft Silverlight 3. You can send query, update, delete, or [...]


Related posts:<ol><li><a href='http://cq-cser.cn/2011/01/windows-api-code-pack-for-microsoft-net-framework/' rel='bookmark' title='Permanent Link: Windows API Code Pack for Microsoft .NET Framework'>Windows API Code Pack for Microsoft .NET Framework</a></li>
<li><a href='http://cq-cser.cn/2011/02/vs2010%e4%b8%8bdirectshow%e7%8e%af%e5%a2%83/' rel='bookmark' title='Permanent Link: VS2010下DirectShow环境'>VS2010下DirectShow环境</a></li>
<li><a href='http://cq-cser.cn/2010/03/api%e5%be%ae%e8%bd%af/' rel='bookmark' title='Permanent Link: API:微软'>API:微软</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>作者: <a href="http://www.cnblogs.com/Jialiang/" target="_blank">Jialiang</a> 发表于 2010-05-18 13:21 <a href="http://www.cnblogs.com/Jialiang/archive/2010/05/18/1738136.html" target="_blank">原文链接</a></p>
<div>
<div>
<p>微软一站式示例代码库(<a href="http://1code.codeplex.com/" target="_blank">http://1code.codeplex.com/</a> ）4月小结<span id="more-1193"></span></p>
<p>4月份项目组里发生了不少可喜之事，比如这个项目拿了微软内部的一个什么奖之类的。：-）</p>
<p> </p>
<p><strong>1. 新发布 4 篇KB</strong></p>
<p>•    <a href="http://support.microsoft.com/kb/982499" target="_blank">How to consume ADO.NET Data Services in Silverlight 3</a><br />
This article describes an All-In-One Code Framework sample that is available for download. You can consume Microsoft ADO.NET Data Services in Microsoft Silverlight 3. You can send query, update, delete, or insert request to ADO.NET Data Services, which access databases on your behalf. This article contains step-by-step instructions for querying data by using Silverlight 3 together with ADO.NET Data Services. Other instructions, such as how to perform an update operation, can be found in the sample.</p>
<p>•    <a href="http://support.microsoft.com/kb/982545" target="_blank">How to create a Windows Forms design time custom property tab</a><br />
This code sample demonstrates how to create a Windows Forms design time custom property tab for a property by using Visual C# and Visual Basic.NET.</p>
<p>•    <a href="http://support.microsoft.com/kb/982498" target="_blank">How to create a multiple-column drop-down list for a combo box in Windows Forms</a><br />
This code sample demonstrates how to create a combo box that has a multiple-column drop-down list in Windows Forms by using Visual C# and Visual Basic .NET.</p>
<p>•    <a href="http://support.microsoft.com/kb/982497" target="_blank">How to create and then to call ADO.NET Data Services for different data sources that include the ADO.NET Entity Framework, LINQ to SQL, and the reflection provider</a><br />
This code sample includes a step-by-step guide for how to create and then to call Microsoft ADO.NET Data Services for different data sources. These data sources include the ADO.NET Entity Framework, LINQ to SQL, and the reflection provider.<br />
<strong>2. 4 月份完成了 15个新的示例代码，尤其是关于 .NET 和 native C++ 互操作的示例</strong></p>
<p><strong>Samples for Library</strong></p>
<table border="0" cellspacing="0" cellpadding="2" width="576">
<tbody>
<tr>
<td width="223" valign="top"><strong>Name  </strong></td>
<td width="351" valign="top"><strong>Description  </strong></td>
</tr>
<tr>
<td width="223" valign="top">CppDynamicLinkLibrary</td>
<td width="351" valign="top">A native C++ Dynamic-link Library</td>
</tr>
<tr>
<td width="223" valign="top">CppCLINETAssemblyWrapper</td>
<td width="351" valign="top">C++/CLI Wrapper for .NET assembly</td>
</tr>
<tr>
<td width="223" valign="top">CppCLINativeDllWrapper</td>
<td width="351" valign="top">C++/CLI Wrapper for native DLL</td>
</tr>
<tr>
<td width="223" valign="top">CppCallNETAssemblyWrapper</td>
<td width="351" valign="top">C++ indirectly call .NET assembly via C/CLI wrapper</td>
</tr>
<tr>
<td width="223" valign="top">CSCallNativeDllWrapper</td>
<td width="351" valign="top">C# indirectly call native DLL via C/CLI wrapper</td>
</tr>
<tr>
<td width="223" valign="top">VBCallNativeDllWrapper</td>
<td width="351" valign="top">VB.NET indirectly call native DLL via C/CLI wrapper</td>
</tr>
<tr>
<td width="223" valign="top">CppHostCLR</td>
<td width="351" valign="top">C++ host CLR and call .NET assembly</td>
</tr>
</tbody>
</table>
<p>这些示例回答了如下两个经常被问到的问题：</p>
<p><a href="http://1code.codeplex.com/wikipage?title=Invoke%20.NET%20Assembly%20from%20Native%20C%2b%2b&amp;referringTitle=Documentation" target="_blank">如何从native C++代码调用一个.NET的assembly?</a></p>
<p><a href="http://1code.codeplex.com/wikipage?title=Invoke%20Native%20C%2b%2b%20DLL%20from%20.NET&amp;referringTitle=Documentation" target="_blank">如何从一个.NET Assembly 调用一个native C++的DLL?</a></p>
<p><strong>Samples for IIS</strong></p>
<p>CSIISAdminADSI， VBIISAdmimADSI<br />
这两个例子主要演示了如何通过.Net System.DirectoryServices名称空间使用Internet Information Services (IIS) Active Directory 服务接口 （ADSI)来对IIS进行配置。IIS Active Directory 服务接口(ADSI)提供了一系列丰富的编程接口以便我们可以通过脚本或应用程序来方便灵活地管理Web站点。</p>
<p><strong>Samples for WF</strong></p>
<p>CSWF4Parallel<br />
这个例子主要是为了演示Parallel  活动和ParallelForEach&lt;T&gt; 活动的区别，以及 ForEach&lt;T&gt; 活动和ParallelForEach&lt;T&gt; 活动的区别。<br />
使用Parallel 可以让分支活动在同一线程内实现异步运行的效果。使用ParallelForEach&lt;T&gt; 活动可以实现在同一线程内让ParallelForEach分支异步运行的效果。</p>
<p><strong>Samples for Windows Service</strong></p>
<p>CppInteractiveWindowsService<br />
演示了<a href="http://msdn.microsoft.com/en-us/library/ms683502(VS.85).aspx" target="_blank">Windows Service和用户交互的正确做法</a>。</p>
<p> </p>
<p><strong>3. 发布了一个Release</strong></p>
<p><a title="http://1code.codeplex.com/releases/view/44540" href="http://1code.codeplex.com/releases/view/44540" target="_blank">http://1code.codeplex.com/releases/view/44540</a></p>
<p>中文介绍：<a title="http://www.cnblogs.com/Jialiang/archive/2010/05/05/OneCode20100430.html" href="http://www.cnblogs.com/Jialiang/archive/2010/05/05/OneCode20100430.html" target="_blank">http://www.cnblogs.com/Jialiang/archive/2010/05/05/OneCode20100430.html</a></p>
<p>英文介绍：<a title="http://blogs.msdn.com/codefx/archive/2010/05/06/microsoft-all-in-one-code-framework-new-samples-updated-on-2010-04-30.aspx" href="http://blogs.msdn.com/codefx/archive/2010/05/06/microsoft-all-in-one-code-framework-new-samples-updated-on-2010-04-30.aspx" target="_blank">http://blogs.msdn.com/codefx/archive/2010/05/06/microsoft-all-in-one-code-framework-new-samples-updated-on-2010-04-30.aspx</a></p>
</div>
</div>


<p>Related posts:<ol><li><a href='http://cq-cser.cn/2011/01/windows-api-code-pack-for-microsoft-net-framework/' rel='bookmark' title='Permanent Link: Windows API Code Pack for Microsoft .NET Framework'>Windows API Code Pack for Microsoft .NET Framework</a></li>
<li><a href='http://cq-cser.cn/2011/02/vs2010%e4%b8%8bdirectshow%e7%8e%af%e5%a2%83/' rel='bookmark' title='Permanent Link: VS2010下DirectShow环境'>VS2010下DirectShow环境</a></li>
<li><a href='http://cq-cser.cn/2010/03/api%e5%be%ae%e8%bd%af/' rel='bookmark' title='Permanent Link: API:微软'>API:微软</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://cq-cser.cn/2010/05/%e5%be%ae%e8%bd%af%e4%b8%80%e7%ab%99%e5%bc%8f%e7%a4%ba%e4%be%8b%e4%bb%a3%e7%a0%81%e5%ba%93-4-%e6%9c%88%e5%b0%8f%e7%bb%93/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>C#的加密解密算法，包括Silverlight的MD5算法</title>
		<link>http://cq-cser.cn/2010/03/csilverlight-md5/</link>
		<comments>http://cq-cser.cn/2010/03/csilverlight-md5/#comments</comments>
		<pubDate>Tue, 02 Mar 2010 15:28:59 +0000</pubDate>
		<dc:creator>cq</dc:creator>
				<category><![CDATA[Silverlight]]></category>
		<category><![CDATA[WEB]]></category>
		<category><![CDATA[c#]]></category>
		<category><![CDATA[MD5]]></category>
		<category><![CDATA[算法]]></category>

		<guid isPermaLink="false">http://cq-cser.cn/?p=937</guid>
		<description><![CDATA[下面是一段加密解密工具类，其中的WinFormMD5Encrypt方法可以使得Winform和WebForm下的MD5加密结果一致，默认他们是不一样的。 　　实例代码下载：/Files/virusswb/ConsoleApplication1.rar 　　 代码 &#60;summary&#62;     ///    　　但是在Silverlight，你会发现如果想用MD5加密，可是不能用WinForm下面的MD5Provider，Silverlight项目就不能添加System.Security命名空间，只好自定义MD5加密了，不用愁，老外已经给我们写好了一个。 　　 Silverlight MD5 &#60;summary&#62;     /// Summary description for MD5.     /// &#60;/summary&#62;     public class MD5 : IDisposable     {         static public MD5 Create(string hashName)         {             if (hashName == &#8221;MD5&#8243;)                 return new MD5();             else                 throw new NotSupportedException();         }         static public String GetMd5String(String source)         {             MD5 md = MD5CryptoServiceProvider.Create();             byte[] hash;             //Create a new instance of ASCIIEncoding to              //convert the string into an array of Unicode bytes.             UTF8Encoding enc = new UTF8Encoding();             //            ASCIIEncoding enc = new ASCIIEncoding();             //Convert the string into an array of bytes.             byte[] buffer = enc.GetBytes(source);             //Create the hash value from the array of bytes.             hash = md.ComputeHash(buffer);             StringBuilder sb = new StringBuilder();             foreach (byte b in hash)                 sb.Append(b.ToString(&#8220;x2&#8243;));             return sb.ToString();         }         static public MD5 Create()         {             return new MD5();         }         #region base implementation of the MD5         #region constants         private const byte S11 = 7;         private const byte S12 = 12;         private const byte S13 = 17;         private const byte S14 = 22;         private const byte S21 = 5;         private const byte S22 = 9;         private const byte S23 = 14;         private const byte S24 = 20;         private const byte S31 = 4; [...]


Related posts:<ol><li><a href='http://cq-cser.cn/2010/04/app-config-c%e8%af%bb%e5%86%99%e7%b1%bb/' rel='bookmark' title='Permanent Link: app.config-c#读写类'>app.config-c#读写类</a></li>
<li><a href='http://cq-cser.cn/2010/01/asp-net%e5%8a%a0%e5%af%86cookies/' rel='bookmark' title='Permanent Link: ASP.NET加密Cookies'>ASP.NET加密Cookies</a></li>
<li><a href='http://cq-cser.cn/2010/01/silverlight-rsa/' rel='bookmark' title='Permanent Link: Silverlight中RSA算法的实现'>Silverlight中RSA算法的实现</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>下面是一段加密解密工具类，其中的<span style="line-height: 150%; font-family: 'Verdana', 'sans-serif';">WinFormMD5Encrypt</span><span style="line-height: 150%; font-family: 宋体;">方法可以使得</span><span style="line-height: 150%; font-family: 'Verdana', 'sans-serif';">Winform</span><span style="line-height: 150%; font-family: 宋体;">和</span><span style="line-height: 150%; font-family: 'Verdana', 'sans-serif';">WebForm</span><span style="line-height: 150%; font-family: 宋体;">下的</span><span style="line-height: 150%; font-family: 'Verdana', 'sans-serif';">MD5</span><span style="line-height: 150%; font-family: 宋体;">加密结果一致，默认他们是不一样的。</span></p>
<p style="text-align: left; line-height: 150%; margin: 3.75pt 0cm;" align="left"><span style="line-height: 150%; font-family: 宋体;">　　实例代码下载：</span><span style="line-height: 150%; font-family: 'Verdana', 'sans-serif';"><a href="http://files.cnblogs.com/virusswb/ConsoleApplication1.rar" target="_blank"><span style="line-height: 150%; color: blue;">/Files/virusswb/ConsoleApplication1.rar</span></a></span></p>
<p style="text-align: left; line-height: 150%; margin: 3.75pt 0cm;" align="left"><span style="line-height: 150%; font-family: 宋体;">　　</span><span style="line-height: 150%; font-family: 'Verdana', 'sans-serif';"> </span><span style="font-family: 宋体;">代码</span></p>
<p style="text-align: left; line-height: 150%; margin: 3.75pt 0cm;" align="left"><span style="font-family: 宋体;"><span id="more-937"></span></span></p>
<p style="text-align: left; line-height: 150%; background: whitesmoke; word-break: break-all;" align="left"><span style="color: blue;">&lt;</span><span style="color: maroon;">summary</span><span style="color: blue;">&gt;</span><span style="color: black;"><br />
    /// </span></p>
<p style="text-align: left; line-height: 150%; margin: 3.75pt 0cm;" align="left"> </p>
<p style="text-align: left; line-height: 150%; margin: 3.75pt 0cm;" align="left"><span style="line-height: 150%; font-family: 宋体;">　　但是在</span><span style="line-height: 150%; font-family: 'Verdana', 'sans-serif';">Silverlight</span><span style="line-height: 150%; font-family: 宋体;">，你会发现如果想用</span><span style="line-height: 150%; font-family: 'Verdana', 'sans-serif';">MD5</span><span style="line-height: 150%; font-family: 宋体;">加密，可是不能用</span><span style="line-height: 150%; font-family: 'Verdana', 'sans-serif';">WinForm</span><span style="line-height: 150%; font-family: 宋体;">下面的</span><span style="line-height: 150%; font-family: 'Verdana', 'sans-serif';">MD5Provider</span><span style="line-height: 150%; font-family: 宋体;">，</span><span style="line-height: 150%; font-family: 'Verdana', 'sans-serif';">Silverlight</span><span style="line-height: 150%; font-family: 宋体;">项目就不能添加</span><span style="line-height: 150%; font-family: 'Verdana', 'sans-serif';">System.Security</span><span style="line-height: 150%; font-family: 宋体;">命名空间，只好自定义</span><span style="line-height: 150%; font-family: 'Verdana', 'sans-serif';">MD5</span><span style="line-height: 150%; font-family: 宋体;">加密了，不用愁，老外已经给我们写好了一个。</span></p>
<p style="text-align: left; line-height: 150%; margin: 3.75pt 0cm;" align="left"><span style="line-height: 150%; font-family: 宋体;">　　</span></p>
<p style="text-align: left; line-height: 150%; background: whitesmoke; word-break: break-all;" align="left"><span style="line-height: 150%; font-family: 'Courier New'; font-size: 10pt;">Silverlight MD5</span></p>
<p style="text-align: left; line-height: 150%; background: whitesmoke; word-break: break-all;" align="left"><span style="color: blue;">&lt;</span><span style="color: maroon;">summary</span><span style="color: blue;">&gt;</span><span style="color: black;"><br />
    /// Summary description for MD5.<br />
    /// </span><span style="color: blue;">&lt;/</span><span style="color: maroon;">summary</span><span style="color: blue;">&gt;</span><span style="color: black;"><br />
    public class MD5 : IDisposable<br />
    {<br />
        static public MD5 Create(string hashName)<br />
        {<br />
            if (hashName == &#8221;MD5&#8243;)<br />
                return new MD5();<br />
            else<br />
                throw new NotSupportedException();<br />
        }</p>
<p>        static public String GetMd5String(String source)<br />
        {<br />
            MD5 md = MD5CryptoServiceProvider.Create();<br />
            byte[] hash;</p>
<p>            //Create a new instance of ASCIIEncoding to <br />
            //convert the string into an array of Unicode bytes.<br />
            UTF8Encoding enc = new UTF8Encoding();<br />
            //            ASCIIEncoding enc = new ASCIIEncoding();</p>
<p>            //Convert the string into an array of bytes.<br />
            byte[] buffer = enc.GetBytes(source);</p>
<p>            //Create the hash value from the array of bytes.<br />
            hash = md.ComputeHash(buffer);</p>
<p>            StringBuilder sb = new StringBuilder();<br />
            foreach (byte b in hash)<br />
                sb.Append(b.ToString(&#8220;x2&#8243;));<br />
            return sb.ToString();<br />
        }</p>
<p>        static public MD5 Create()<br />
        {<br />
            return new MD5();<br />
        }</p>
<p>        #region base implementation of the MD5<br />
        #region constants<br />
        private const byte S11 = 7;<br />
        private const byte S12 = 12;<br />
        private const byte S13 = 17;<br />
        private const byte S14 = 22;<br />
        private const byte S21 = 5;<br />
        private const byte S22 = 9;<br />
        private const byte S23 = 14;<br />
        private const byte S24 = 20;<br />
        private const byte S31 = 4;<br />
        private const byte S32 = 11;<br />
        private const byte S33 = 16;<br />
        private const byte S34 = 23;<br />
        private const byte S41 = 6;<br />
        private const byte S42 = 10;<br />
        private const byte S43 = 15;<br />
        private const byte S44 = 21;<br />
        static private byte[] PADDING = new byte[] {<br />
              0&#215;80, 0, 0, 0, 0, 0, <br />
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,<br />
              0, 0, 0, 0, 0, 0, 0, <br />
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,<br />
              0, 0, 0, 0, 0, 0, 0, <br />
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0<br />
             };<br />
        #endregion</p>
<p>        #region F, G, H and I are basic MD5 functions.<br />
        static private uint F(uint x, uint y, uint z)<br />
        {<br />
            return (((x) &amp; (y)) | ((~x) &amp; (z)));<br />
        }<br />
        static private uint G(uint x, uint y, uint z)<br />
        {<br />
            return (((x) &amp; (z)) | ((y) &amp; (~z)));<br />
        }<br />
        static private uint H(uint x, uint y, uint z)<br />
        {<br />
            return ((x) ^ (y) ^ (z));<br />
        }<br />
        static private uint I(uint x, uint y, uint z)<br />
        {<br />
            return ((y) ^ ((x) | (~z)));<br />
        }<br />
        #endregion</p>
<p>        #region rotates x left n bits.<br />
        /// </span><span style="color: blue;">&lt;</span><span style="color: maroon;">summary</span><span style="color: blue;">&gt;</span><span style="color: black;"><br />
        /// rotates x left n bits.<br />
        /// </span><span style="color: blue;">&lt;/</span><span style="color: maroon;">summary</span><span style="color: blue;">&gt;</span><span style="color: black;"><br />
        /// </span><span style="color: blue;">&lt;</span><span style="color: maroon;">param </span><span style="color: red;">name</span><span style="color: blue;">=&#8221;x&#8221;&gt;&lt;/</span><span style="color: maroon;">param</span><span style="color: blue;">&gt;</span><span style="color: black;"><br />
        /// </span><span style="color: blue;">&lt;</span><span style="color: maroon;">param </span><span style="color: red;">name</span><span style="color: blue;">=&#8221;n&#8221;&gt;&lt;/</span><span style="color: maroon;">param</span><span style="color: blue;">&gt;</span><span style="color: black;"><br />
        /// </span><span style="color: blue;">&lt;</span><span style="color: maroon;">returns</span><span style="color: blue;">&gt;&lt;/</span><span style="color: maroon;">returns</span><span style="color: blue;">&gt;</span><span style="color: black;"><br />
        static private uint ROTATE_LEFT(uint x, byte n)<br />
        {<br />
            return (((x) </span><span style="color: blue;">&lt;</span><span style="color: maroon;">&lt; (n</span><span style="color: red;">)) | ((x) </span><span style="color: blue;">&gt;</span><span style="color: black;">&gt; (32 - (n))));<br />
        }<br />
        #endregion</p>
<p>        #region FF, GG, HH, and II transformations<br />
        /// FF, GG, HH, and II transformations <br />
        /// for rounds 1, 2, 3, and 4.<br />
        /// Rotation is separate from addition to prevent recomputation.<br />
        static private void FF(ref uint a, uint b, uint c, uint d, uint x, byte s, uint ac)<br />
        {<br />
            (a) += F((b), (c), (d)) + (x) + (uint)(ac);<br />
            (a) = ROTATE_LEFT((a), (s));<br />
            (a) += (b);<br />
        }<br />
        static private void GG(ref uint a, uint b, uint c, uint d, uint x, byte s, uint ac)<br />
        {<br />
            (a) += G((b), (c), (d)) + (x) + (uint)(ac);<br />
            (a) = ROTATE_LEFT((a), (s));<br />
            (a) += (b);<br />
        }<br />
        static private void HH(ref uint a, uint b, uint c, uint d, uint x, byte s, uint ac)<br />
        {<br />
            (a) += H((b), (c), (d)) + (x) + (uint)(ac);<br />
            (a) = ROTATE_LEFT((a), (s));<br />
            (a) += (b);<br />
        }<br />
        static private void II(ref uint a, uint b, uint c, uint d, uint x, byte s, uint ac)<br />
        {<br />
            (a) += I((b), (c), (d)) + (x) + (uint)(ac);<br />
            (a) = ROTATE_LEFT((a), (s));<br />
            (a) += (b);<br />
        }<br />
        #endregion</p>
<p>        #region context info<br />
        /// </span><span style="color: blue;">&lt;</span><span style="color: maroon;">summary</span><span style="color: blue;">&gt;</span><span style="color: black;"><br />
        /// state (ABCD)<br />
        /// </span><span style="color: blue;">&lt;/</span><span style="color: maroon;">summary</span><span style="color: blue;">&gt;</span><span style="color: black;"><br />
        uint[] state = new uint[4];</p>
<p>        /// </span><span style="color: blue;">&lt;</span><span style="color: maroon;">summary</span><span style="color: blue;">&gt;</span><span style="color: black;"><br />
        /// number of bits, modulo 2^64 (lsb first)<br />
        /// </span><span style="color: blue;">&lt;/</span><span style="color: maroon;">summary</span><span style="color: blue;">&gt;</span><span style="color: black;"><br />
        uint[] count = new uint[2];</p>
<p>        /// </span><span style="color: blue;">&lt;</span><span style="color: maroon;">summary</span><span style="color: blue;">&gt;</span><span style="color: black;"><br />
        /// input buffer<br />
        /// </span><span style="color: blue;">&lt;/</span><span style="color: maroon;">summary</span><span style="color: blue;">&gt;</span><span style="color: black;"><br />
        byte[] buffer = new byte[64];<br />
        #endregion</p>
<p>        internal MD5()<br />
        {<br />
            Initialize();<br />
        }</p>
<p>        /// </span><span style="color: blue;">&lt;</span><span style="color: maroon;">summary</span><span style="color: blue;">&gt;</span><span style="color: black;"><br />
        /// MD5 initialization. Begins an MD5 operation, writing a new context.<br />
        /// </span><span style="color: blue;">&lt;/</span><span style="color: maroon;">summary</span><span style="color: blue;">&gt;</span><span style="color: black;"><br />
        /// </span><span style="color: blue;">&lt;</span><span style="color: maroon;">remarks</span><span style="color: blue;">&gt;</span><span style="color: black;"><br />
        /// The RFC named it &#8221;MD5Init&#8221;<br />
        /// </span><span style="color: blue;">&lt;/</span><span style="color: maroon;">remarks</span><span style="color: blue;">&gt;</span><span style="color: black;"><br />
        public virtual void Initialize()<br />
        {<br />
            count[0] = count[1] = 0;</p>
<p>            // Load magic initialization constants.<br />
            state[0] = 0&#215;67452301;<br />
            state[1] = 0xefcdab89;<br />
            state[2] = 0x98badcfe;<br />
            state[3] = 0&#215;10325476;<br />
        }</p>
<p>        /// </span><span style="color: blue;">&lt;</span><span style="color: maroon;">summary</span><span style="color: blue;">&gt;</span><span style="color: black;"><br />
        /// MD5 block update operation. Continues an MD5 message-digest<br />
        /// operation, processing another message block, and updating the<br />
        /// context.<br />
        /// </span><span style="color: blue;">&lt;/</span><span style="color: maroon;">summary</span><span style="color: blue;">&gt;</span><span style="color: black;"><br />
        /// </span><span style="color: blue;">&lt;</span><span style="color: maroon;">param </span><span style="color: red;">name</span><span style="color: blue;">=&#8221;input&#8221;&gt;&lt;/</span><span style="color: maroon;">param</span><span style="color: blue;">&gt;</span><span style="color: black;"><br />
        /// </span><span style="color: blue;">&lt;</span><span style="color: maroon;">param </span><span style="color: red;">name</span><span style="color: blue;">=&#8221;offset&#8221;&gt;&lt;/</span><span style="color: maroon;">param</span><span style="color: blue;">&gt;</span><span style="color: black;"><br />
        /// </span><span style="color: blue;">&lt;</span><span style="color: maroon;">param </span><span style="color: red;">name</span><span style="color: blue;">=&#8221;count&#8221;&gt;&lt;/</span><span style="color: maroon;">param</span><span style="color: blue;">&gt;</span><span style="color: black;"><br />
        /// </span><span style="color: blue;">&lt;</span><span style="color: maroon;">remarks</span><span style="color: blue;">&gt;</span><span style="color: black;">The RFC Named it MD5Update</span><span style="color: blue;">&lt;/</span><span style="color: maroon;">remarks</span><span style="color: blue;">&gt;</span><span style="color: black;"><br />
        protected virtual void HashCore(byte[] input, int offset, int count)<br />
        {<br />
            int i;<br />
            int index;<br />
            int partLen;</p>
<p>            // Compute number of bytes mod 64<br />
            index = (int)((this.count[0] &gt;&gt; 3) &amp; 0x3F);</p>
<p>            // Update number of bits<br />
            if ((this.count[0] += (uint)((uint)count </span><span style="color: blue;">&lt;</span><span style="color: maroon;">&lt; 3</span><span style="color: red;">)) &lt; ((uint)count &lt;&lt; 3))<br />
                this.count[1]++;<br />
            this.count[1] +</span><span style="color: blue;">= ((uint)count &gt;</span><span style="color: black;">&gt; 29);</p>
<p>            partLen = 64 - index;</p>
<p>            // Transform as many times as possible.<br />
            if (count &gt;= partLen)<br />
            {<br />
                Buffer.BlockCopy(input, offset, this.buffer, index, partLen);<br />
                Transform(this.buffer, 0);</p>
<p>                for (i = partLen; i + 63 </span><span style="color: blue;">&lt;</span><span style="color: maroon;"> count</span><span style="color: red;">; i +</span><span style="color: blue;">= 64)<br />
                    </span><span style="color: red;">Transform(input, offset + i);</p>
<p>                index </span><span style="color: blue;">= 0;<br />
            </span><span style="color: red;">}<br />
            else<br />
                i </span><span style="color: blue;">= 0;</p>
<p>            </span><span style="color: red;">// Buffer remaining input <br />
            Buffer.BlockCopy(input, offset + i, this.buffer, index, count - i);<br />
        }</p>
<p>        /// &lt;summary</span><span style="color: blue;">&gt;</span><span style="color: black;"><br />
        /// MD5 finalization. Ends an MD5 message-digest operation, writing the<br />
        /// the message digest and zeroizing the context.<br />
        /// </span><span style="color: blue;">&lt;/</span><span style="color: maroon;">summary</span><span style="color: blue;">&gt;</span><span style="color: black;"><br />
        /// </span><span style="color: blue;">&lt;</span><span style="color: maroon;">returns</span><span style="color: blue;">&gt;</span><span style="color: black;">message digest</span><span style="color: blue;">&lt;/</span><span style="color: maroon;">returns</span><span style="color: blue;">&gt;</span><span style="color: black;"><br />
        /// </span><span style="color: blue;">&lt;</span><span style="color: maroon;">remarks</span><span style="color: blue;">&gt;</span><span style="color: black;">The RFC named it MD5Final</span><span style="color: blue;">&lt;/</span><span style="color: maroon;">remarks</span><span style="color: blue;">&gt;</span><span style="color: black;"><br />
        protected virtual byte[] HashFinal()<br />
        {<br />
            byte[] digest = new byte[16];<br />
            byte[] bits = new byte[8];<br />
            int index, padLen;</p>
<p>            // Save number of bits<br />
            Encode(bits, 0, this.count, 0, 8);</p>
<p>            // Pad out to 56 mod 64.<br />
            index = (int)((uint)(this.count[0] &gt;&gt; 3) &amp; 0x3f);<br />
            padLen = (index </span><span style="color: blue;">&lt;</span><span style="color: maroon;"> 56</span><span style="color: red;">) ? (56 - index) : (120 - index);<br />
            HashCore(PADDING, 0, padLen);</p>
<p>            // Append length (before padding)<br />
            HashCore(bits, 0, 8);</p>
<p>            // Store state in digest <br />
            Encode(digest, 0, state, 0, 16);</p>
<p>            // Zeroize sensitive information.<br />
            count[0] </span><span style="color: blue;">= count[1] = 0;<br />
            </span><span style="color: red;">state[0] </span><span style="color: blue;">= 0;<br />
            </span><span style="color: red;">state[1] </span><span style="color: blue;">= 0;<br />
            </span><span style="color: red;">state[2] </span><span style="color: blue;">= 0;<br />
            </span><span style="color: red;">state[3] </span><span style="color: blue;">= 0;</p>
<p>            </span><span style="color: red;">// initialize again, to be ready to use<br />
            Initialize();</p>
<p>            return digest;<br />
        }</p>
<p>        /// &lt;summary</span><span style="color: blue;">&gt;</span><span style="color: black;"><br />
        /// MD5 basic transformation. Transforms state based on 64 bytes block.<br />
        /// </span><span style="color: blue;">&lt;/</span><span style="color: maroon;">summary</span><span style="color: blue;">&gt;</span><span style="color: black;"><br />
        /// </span><span style="color: blue;">&lt;</span><span style="color: maroon;">param </span><span style="color: red;">name</span><span style="color: blue;">=&#8221;block&#8221;&gt;&lt;/</span><span style="color: maroon;">param</span><span style="color: blue;">&gt;</span><span style="color: black;"><br />
        /// </span><span style="color: blue;">&lt;</span><span style="color: maroon;">param </span><span style="color: red;">name</span><span style="color: blue;">=&#8221;offset&#8221;&gt;&lt;/</span><span style="color: maroon;">param</span><span style="color: blue;">&gt;</span><span style="color: black;"><br />
        private void Transform(byte[] block, int offset)<br />
        {<br />
            uint a = state[0], b = state[1], c = state[2], d = state[3];<br />
            uint[] x = new uint[16];<br />
            Decode(x, 0, block, offset, 64);</p>
<p>            // Round 1<br />
            FF(ref a, b, c, d, x[0], S11, 0xd76aa478); /* 1 */<br />
            FF(ref d, a, b, c, x[1], S12, 0xe8c7b756); /* 2 */<br />
            FF(ref c, d, a, b, x[2], S13, 0x242070db); /* 3 */<br />
            FF(ref b, c, d, a, x[3], S14, 0xc1bdceee); /* 4 */<br />
            FF(ref a, b, c, d, x[4], S11, 0xf57c0faf); /* 5 */<br />
            FF(ref d, a, b, c, x[5], S12, 0x4787c62a); /* 6 */<br />
            FF(ref c, d, a, b, x[6], S13, 0xa8304613); /* 7 */<br />
            FF(ref b, c, d, a, x[7], S14, 0xfd469501); /* 8 */<br />
            FF(ref a, b, c, d, x[8], S11, 0x698098d8); /* 9 */<br />
            FF(ref d, a, b, c, x[9], S12, 0x8b44f7af); /* 10 */<br />
            FF(ref c, d, a, b, x[10], S13, 0xffff5bb1); /* 11 */<br />
            FF(ref b, c, d, a, x[11], S14, 0x895cd7be); /* 12 */<br />
            FF(ref a, b, c, d, x[12], S11, 0x6b901122); /* 13 */<br />
            FF(ref d, a, b, c, x[13], S12, 0xfd987193); /* 14 */<br />
            FF(ref c, d, a, b, x[14], S13, 0xa679438e); /* 15 */<br />
            FF(ref b, c, d, a, x[15], S14, 0x49b40821); /* 16 */</p>
<p>            // Round 2<br />
            GG(ref a, b, c, d, x[1], S21, 0xf61e2562); /* 17 */<br />
            GG(ref d, a, b, c, x[6], S22, 0xc040b340); /* 18 */<br />
            GG(ref c, d, a, b, x[11], S23, 0x265e5a51); /* 19 */<br />
            GG(ref b, c, d, a, x[0], S24, 0xe9b6c7aa); /* 20 */<br />
            GG(ref a, b, c, d, x[5], S21, 0xd62f105d); /* 21 */<br />
            GG(ref d, a, b, c, x[10], S22, 0&#215;2441453); /* 22 */<br />
            GG(ref c, d, a, b, x[15], S23, 0xd8a1e681); /* 23 */<br />
            GG(ref b, c, d, a, x[4], S24, 0xe7d3fbc8); /* 24 */<br />
            GG(ref a, b, c, d, x[9], S21, 0x21e1cde6); /* 25 */<br />
            GG(ref d, a, b, c, x[14], S22, 0xc33707d6); /* 26 */<br />
            GG(ref c, d, a, b, x[3], S23, 0xf4d50d87); /* 27 */<br />
            GG(ref b, c, d, a, x[8], S24, 0x455a14ed); /* 28 */<br />
            GG(ref a, b, c, d, x[13], S21, 0xa9e3e905); /* 29 */<br />
            GG(ref d, a, b, c, x[2], S22, 0xfcefa3f8); /* 30 */<br />
            GG(ref c, d, a, b, x[7], S23, 0x676f02d9); /* 31 */<br />
            GG(ref b, c, d, a, x[12], S24, 0x8d2a4c8a); /* 32 */</p>
<p>            // Round 3<br />
            HH(ref a, b, c, d, x[5], S31, 0xfffa3942); /* 33 */<br />
            HH(ref d, a, b, c, x[8], S32, 0x8771f681); /* 34 */<br />
            HH(ref c, d, a, b, x[11], S33, 0x6d9d6122); /* 35 */<br />
            HH(ref b, c, d, a, x[14], S34, 0xfde5380c); /* 36 */<br />
            HH(ref a, b, c, d, x[1], S31, 0xa4beea44); /* 37 */<br />
            HH(ref d, a, b, c, x[4], S32, 0x4bdecfa9); /* 38 */<br />
            HH(ref c, d, a, b, x[7], S33, 0xf6bb4b60); /* 39 */<br />
            HH(ref b, c, d, a, x[10], S34, 0xbebfbc70); /* 40 */<br />
            HH(ref a, b, c, d, x[13], S31, 0x289b7ec6); /* 41 */<br />
            HH(ref d, a, b, c, x[0], S32, 0xeaa127fa); /* 42 */<br />
            HH(ref c, d, a, b, x[3], S33, 0xd4ef3085); /* 43 */<br />
            HH(ref b, c, d, a, x[6], S34, 0x4881d05); /* 44 */<br />
            HH(ref a, b, c, d, x[9], S31, 0xd9d4d039); /* 45 */<br />
            HH(ref d, a, b, c, x[12], S32, 0xe6db99e5); /* 46 */<br />
            HH(ref c, d, a, b, x[15], S33, 0x1fa27cf8); /* 47 */<br />
            HH(ref b, c, d, a, x[2], S34, 0xc4ac5665); /* 48 */</p>
<p>            // Round 4<br />
            II(ref a, b, c, d, x[0], S41, 0xf4292244); /* 49 */<br />
            II(ref d, a, b, c, x[7], S42, 0x432aff97); /* 50 */<br />
            II(ref c, d, a, b, x[14], S43, 0xab9423a7); /* 51 */<br />
            II(ref b, c, d, a, x[5], S44, 0xfc93a039); /* 52 */<br />
            II(ref a, b, c, d, x[12], S41, 0x655b59c3); /* 53 */<br />
            II(ref d, a, b, c, x[3], S42, 0x8f0ccc92); /* 54 */<br />
            II(ref c, d, a, b, x[10], S43, 0xffeff47d); /* 55 */<br />
            II(ref b, c, d, a, x[1], S44, 0x85845dd1); /* 56 */<br />
            II(ref a, b, c, d, x[8], S41, 0x6fa87e4f); /* 57 */<br />
            II(ref d, a, b, c, x[15], S42, 0xfe2ce6e0); /* 58 */<br />
            II(ref c, d, a, b, x[6], S43, 0xa3014314); /* 59 */<br />
            II(ref b, c, d, a, x[13], S44, 0x4e0811a1); /* 60 */<br />
            II(ref a, b, c, d, x[4], S41, 0xf7537e82); /* 61 */<br />
            II(ref d, a, b, c, x[11], S42, 0xbd3af235); /* 62 */<br />
            II(ref c, d, a, b, x[2], S43, 0x2ad7d2bb); /* 63 */<br />
            II(ref b, c, d, a, x[9], S44, 0xeb86d391); /* 64 */</p>
<p>            state[0] += a;<br />
            state[1] += b;<br />
            state[2] += c;<br />
            state[3] += d;</p>
<p>            // Zeroize sensitive information.<br />
            for (int i = 0; i </span><span style="color: blue;">&lt;</span><span style="color: maroon;"> x.Length</span><span style="color: red;">; i++)<br />
                x[i] </span><span style="color: blue;">= 0;<br />
        </span><span style="color: red;">}</p>
<p>        /// &lt;summary</span><span style="color: blue;">&gt;</span><span style="color: black;"><br />
        /// Encodes input (uint) into output (byte). Assumes len is<br />
        ///  multiple of 4.<br />
        /// </span><span style="color: blue;">&lt;/</span><span style="color: maroon;">summary</span><span style="color: blue;">&gt;</span><span style="color: black;"><br />
        /// </span><span style="color: blue;">&lt;</span><span style="color: maroon;">param </span><span style="color: red;">name</span><span style="color: blue;">=&#8221;output&#8221;&gt;&lt;/</span><span style="color: maroon;">param</span><span style="color: blue;">&gt;</span><span style="color: black;"><br />
        /// </span><span style="color: blue;">&lt;</span><span style="color: maroon;">param </span><span style="color: red;">name</span><span style="color: blue;">=&#8221;outputOffset&#8221;&gt;&lt;/</span><span style="color: maroon;">param</span><span style="color: blue;">&gt;</span><span style="color: black;"><br />
        /// </span><span style="color: blue;">&lt;</span><span style="color: maroon;">param </span><span style="color: red;">name</span><span style="color: blue;">=&#8221;input&#8221;&gt;&lt;/</span><span style="color: maroon;">param</span><span style="color: blue;">&gt;</span><span style="color: black;"><br />
        /// </span><span style="color: blue;">&lt;</span><span style="color: maroon;">param </span><span style="color: red;">name</span><span style="color: blue;">=&#8221;inputOffset&#8221;&gt;&lt;/</span><span style="color: maroon;">param</span><span style="color: blue;">&gt;</span><span style="color: black;"><br />
        /// </span><span style="color: blue;">&lt;</span><span style="color: maroon;">param </span><span style="color: red;">name</span><span style="color: blue;">=&#8221;count&#8221;&gt;&lt;/</span><span style="color: maroon;">param</span><span style="color: blue;">&gt;</span><span style="color: black;"><br />
        private static void Encode(byte[] output, int outputOffset, uint[] input, int inputOffset, int count)<br />
        {<br />
            int i, j;<br />
            int end = outputOffset + count;<br />
            for (i = inputOffset, j = outputOffset; j </span><span style="color: blue;">&lt;</span><span style="color: maroon;"> end</span><span style="color: red;">; i++, j +</span><span style="color: blue;">= 4)<br />
            </span><span style="color: red;">{<br />
                output[j] </span><span style="color: blue;">= (byte)(input[i] </span><span style="color: red;">&amp; 0xff);<br />
                output[j + 1] </span><span style="color: blue;">= (byte)((input[i] &gt;</span><span style="color: black;">&gt; 8) &amp; 0xff);<br />
                output[j + 2] = (byte)((input[i] &gt;&gt; 16) &amp; 0xff);<br />
                output[j + 3] = (byte)((input[i] &gt;&gt; 24) &amp; 0xff);<br />
            }<br />
        }</p>
<p>        /// </span><span style="color: blue;">&lt;</span><span style="color: maroon;">summary</span><span style="color: blue;">&gt;</span><span style="color: black;"><br />
        /// Decodes input (byte) into output (uint). Assumes len is<br />
        /// a multiple of 4.<br />
        /// </span><span style="color: blue;">&lt;/</span><span style="color: maroon;">summary</span><span style="color: blue;">&gt;</span><span style="color: black;"><br />
        /// </span><span style="color: blue;">&lt;</span><span style="color: maroon;">param </span><span style="color: red;">name</span><span style="color: blue;">=&#8221;output&#8221;&gt;&lt;/</span><span style="color: maroon;">param</span><span style="color: blue;">&gt;</span><span style="color: black;"><br />
        /// </span><span style="color: blue;">&lt;</span><span style="color: maroon;">param </span><span style="color: red;">name</span><span style="color: blue;">=&#8221;outputOffset&#8221;&gt;&lt;/</span><span style="color: maroon;">param</span><span style="color: blue;">&gt;</span><span style="color: black;"><br />
        /// </span><span style="color: blue;">&lt;</span><span style="color: maroon;">param </span><span style="color: red;">name</span><span style="color: blue;">=&#8221;input&#8221;&gt;&lt;/</span><span style="color: maroon;">param</span><span style="color: blue;">&gt;</span><span style="color: black;"><br />
        /// </span><span style="color: blue;">&lt;</span><span style="color: maroon;">param </span><span style="color: red;">name</span><span style="color: blue;">=&#8221;inputOffset&#8221;&gt;&lt;/</span><span style="color: maroon;">param</span><span style="color: blue;">&gt;</span><span style="color: black;"><br />
        /// </span><span style="color: blue;">&lt;</span><span style="color: maroon;">param </span><span style="color: red;">name</span><span style="color: blue;">=&#8221;count&#8221;&gt;&lt;/</span><span style="color: maroon;">param</span><span style="color: blue;">&gt;</span><span style="color: black;"><br />
        static private void Decode(uint[] output, int outputOffset, byte[] input, int inputOffset, int count)<br />
        {<br />
            int i, j;<br />
            int end = inputOffset + count;<br />
            for (i = outputOffset, j = inputOffset; j </span><span style="color: blue;">&lt;</span><span style="color: maroon;"> end</span><span style="color: red;">; i++, j +</span><span style="color: blue;">= 4)<br />
                </span><span style="color: red;">output[i] </span><span style="color: blue;">= ((uint)input[j]) </span><span style="color: red;">| (((uint)input[j + 1]) &lt;&lt; 8) | (((uint)input[j + 2]) &lt;&lt; 16) | (((uint)input[j + 3]) &lt;&lt;<br />
24);<br />
        }<br />
        #endregion</p>
<p>        #region expose the same interface as the regular MD5 object</p>
<p>        protected byte[] HashValue;<br />
        protected int State;<br />
        public virtual bool CanReuseTransform<br />
        {<br />
            get<br />
            {<br />
                return true;<br />
            }<br />
        }</p>
<p>        public virtual bool CanTransformMultipleBlocks<br />
        {<br />
            get<br />
            {<br />
                return true;<br />
            }<br />
        }<br />
        public virtual byte[] Hash<br />
        {<br />
            get<br />
            {<br />
                if (this.State !</span><span style="color: blue;">= 0)<br />
                    </span><span style="color: red;">throw new InvalidOperationException();<br />
                return (byte[])HashValue.Clone();<br />
            }<br />
        }<br />
        public virtual int HashSize<br />
        {<br />
            get<br />
            {<br />
                return HashSizeValue;<br />
            }<br />
        }<br />
        protected int HashSizeValue </span><span style="color: blue;">= 128;</p>
<p>        </span><span style="color: red;">public virtual int InputBlockSize<br />
        {<br />
            get<br />
            {<br />
                return 1;<br />
            }<br />
        }<br />
        public virtual int OutputBlockSize<br />
        {<br />
            get<br />
            {<br />
                return 1;<br />
            }<br />
        }</p>
<p>        public void Clear()<br />
        {<br />
            Dispose(true);<br />
        }</p>
<p>        public byte[] ComputeHash(byte[] buffer)<br />
        {<br />
            return ComputeHash(buffer, 0, buffer.Length);<br />
        }<br />
        public byte[] ComputeHash(byte[] buffer, int offset, int count)<br />
        {<br />
            Initialize();<br />
            HashCore(buffer, offset, count);<br />
            HashValue </span><span style="color: blue;">= HashFinal();<br />
            </span><span style="color: red;">return (byte[])HashValue.Clone();<br />
        }</p>
<p>        public byte[] ComputeHash(Stream inputStream)<br />
        {<br />
            Initialize();<br />
            int count </span><span style="color: blue;">= 0;<br />
            </span><span style="color: red;">byte[] buffer </span><span style="color: blue;">= new </span><span style="color: red;">byte[4096];<br />
            while (0 &lt; (count </span><span style="color: blue;">= inputStream.Read(buffer, </span><span style="color: red;">0, 4096)))<br />
            {<br />
                HashCore(buffer, 0, count);<br />
            }<br />
            HashValue </span><span style="color: blue;">= HashFinal();<br />
            </span><span style="color: red;">return (byte[])HashValue.Clone();<br />
        }</p>
<p>        public int TransformBlock(<br />
            byte[] inputBuffer,<br />
            int inputOffset,<br />
            int inputCount,<br />
            byte[] outputBuffer,<br />
            int outputOffset<br />
            )<br />
        {<br />
            if (inputBuffer </span><span style="color: blue;">== </span><span style="color: red;">null)<br />
            {<br />
                throw new ArgumentNullException(&#8220;inputBuffer&#8221;);<br />
            }<br />
            if (inputOffset &lt; 0)<br />
            {<br />
                throw new ArgumentOutOfRangeException(&#8220;inputOffset&#8221;);<br />
            }<br />
            if ((inputCount &lt; 0) || (inputCount </span><span style="color: blue;">&gt;</span><span style="color: black;"> inputBuffer.Length))<br />
            {<br />
                throw new ArgumentException(&#8220;inputCount&#8221;);<br />
            }<br />
            if ((inputBuffer.Length - inputCount) </span><span style="color: blue;">&lt;</span><span style="color: maroon;"> inputOffset</span><span style="color: red;">)<br />
            {<br />
                throw new ArgumentOutOfRangeException(&#8220;inputOffset&#8221;);<br />
            }<br />
            if (this.State </span><span style="color: blue;">== </span><span style="color: red;">0)<br />
            {<br />
                Initialize();<br />
                this.State </span><span style="color: blue;">= 1;<br />
            </span><span style="color: red;">}</p>
<p>            HashCore(inputBuffer, inputOffset, inputCount);<br />
            if ((inputBuffer !</span><span style="color: blue;">= outputBuffer) </span><span style="color: red;">|| (inputOffset !</span><span style="color: blue;">= outputOffset))<br />
            </span><span style="color: red;">{<br />
                Buffer.BlockCopy(inputBuffer, inputOffset, outputBuffer, outputOffset, inputCount);<br />
            }<br />
            return inputCount;<br />
        }<br />
        public byte[] TransformFinalBlock(<br />
            byte[] inputBuffer,<br />
            int inputOffset,<br />
            int inputCount<br />
            )<br />
        {<br />
            if (inputBuffer </span><span style="color: blue;">== </span><span style="color: red;">null)<br />
            {<br />
                throw new ArgumentNullException(&#8220;inputBuffer&#8221;);<br />
            }<br />
            if (inputOffset &lt; 0)<br />
            {<br />
                throw new ArgumentOutOfRangeException(&#8220;inputOffset&#8221;);<br />
            }<br />
            if ((inputCount &lt; 0) || (inputCount </span><span style="color: blue;">&gt;</span><span style="color: black;"> inputBuffer.Length))<br />
            {<br />
                throw new ArgumentException(&#8220;inputCount&#8221;);<br />
            }<br />
            if ((inputBuffer.Length - inputCount) </span><span style="color: blue;">&lt;</span><span style="color: maroon;"> inputOffset</span><span style="color: red;">)<br />
            {<br />
                throw new ArgumentOutOfRangeException(&#8220;inputOffset&#8221;);<br />
            }<br />
            if (this.State </span><span style="color: blue;">== </span><span style="color: red;">0)<br />
            {<br />
                Initialize();<br />
            }<br />
            HashCore(inputBuffer, inputOffset, inputCount);<br />
            HashValue </span><span style="color: blue;">= HashFinal();<br />
            </span><span style="color: red;">byte[] buffer </span><span style="color: blue;">= new </span><span style="color: red;">byte[inputCount];<br />
            Buffer.BlockCopy(inputBuffer, inputOffset, buffer, 0, inputCount);<br />
            this.State </span><span style="color: blue;">= 0;<br />
            </span><span style="color: red;">return buffer;<br />
        }<br />
        #endregion</p>
<p>        protected virtual void Dispose(bool disposing)<br />
        {<br />
            if (!disposing)<br />
                Initialize();<br />
        }<br />
        public void Dispose()<br />
        {<br />
            Dispose(true);<br />
        }<br />
    }</span></p>
<p style="text-align: left; line-height: 150%; margin: 3.75pt 0cm;" align="left"> </p>
<p style="text-align: left; line-height: 150%; margin: 3.75pt 0cm;" align="left"><span style="line-height: 150%; font-family: 宋体;">　　在</span><span style="line-height: 150%; font-family: 'Verdana', 'sans-serif';">Silverlight</span><span style="line-height: 150%; font-family: 宋体;">中使用</span><span style="line-height: 150%; font-family: 'Verdana', 'sans-serif';">MD5</span><span style="line-height: 150%; font-family: 宋体;">的示例代码</span></p>
<p style="text-align: left; line-height: 150%; margin: 3.75pt 0cm;" align="left"><span style="line-height: 150%; font-family: 宋体;">　　</span></p>
<p style="text-align: left; line-height: 150%; background: whitesmoke; word-break: break-all;" align="left"><span style="line-height: 150%; font-family: 宋体; font-size: 10pt;">代码</span><span style="line-height: 150%; font-family: 'Courier New'; font-size: 10pt;"> </span></p>
<p style="text-align: left; line-height: 150%; background: whitesmoke; word-break: break-all;" align="left"><span style="color: black;"> Program<br />
    {<br />
        </span><span style="color: blue;">static</span> <span style="color: blue;">void</span><span style="color: black;"> Main(</span><span style="color: blue;">string</span><span style="color: black;">[] args)<br />
        {<br />
            </span><span style="color: blue;">string</span><span style="color: black;"> str=</span><span style="color: maroon;">&#8220;123&#8243;</span><span style="color: black;">;<br />
            Console.WriteLine(</span><span style="color: blue;">string</span><span style="color: black;">.Format (</span><span style="color: maroon;">&#8220;123 encrypt result: {0}&#8221;</span><span style="color: black;">,WebMD5Provider.WebFormMD5Encrypt (str )));<br />
            Console.WriteLine(</span><span style="color: maroon;">&#8220;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8221;</span><span style="color: black;">);<br />
            MD5CryptoServiceProvider md5Provider = </span><span style="color: blue;">new</span><span style="color: black;"> MD5CryptoServiceProvider();<br />
            </span><span style="color: blue;">byte</span><span style="color: black;">[] encryptedBytes = md5Provider.ComputeHash(Encoding.UTF8 .GetBytes(str ));<br />
            StringBuilder sb = </span><span style="color: blue;">new</span><span style="color: black;"> StringBuilder();<br />
            </span><span style="color: blue;">for</span><span style="color: black;"> (</span><span style="color: blue;">int</span><span style="color: black;"> i = </span><span style="color: purple;">0</span><span style="color: black;">; i &lt; encryptedBytes.Length; i++)<br />
            {<br />
                sb.AppendFormat(</span><span style="color: maroon;">&#8220;{0:x2}&#8221;</span><span style="color: black;">, encryptedBytes[i]);<br />
            }<br />
         <br />
            Console.WriteLine(</span><span style="color: blue;">string</span><span style="color: black;">.Format(</span><span style="color: maroon;">&#8220;123 encrypt result: {0}&#8221;</span><span style="color: black;">,sb.ToString ()));</p>
<p>            Console.ReadLine();<br />
        }<br />
    }</span></p>
<p style="text-align: left; line-height: 150%; margin: 3.75pt 0cm;" align="left"> </p>
<p style="text-align: left; line-height: 150%; margin: 3.75pt 0cm;" align="left"><span style="line-height: 150%; font-family: 宋体;">　　</span><span style="line-height: 150%; font-family: 'Verdana', 'sans-serif';"> <span style="color: blue;">byte</span><span style="color: black;">[] encryptedBytes = md5Provider.ComputeHash(Encoding.UTF8 .GetBytes(str ));</span></span><span style="line-height: 150%; font-family: 宋体; color: black;">中必须使用</span><span style="line-height: 150%; font-family: 'Verdana', 'sans-serif'; color: black;">UTF8</span><span style="line-height: 150%; font-family: 宋体; color: black;">，如果使用</span><span style="line-height: 150%; font-family: 'Verdana', 'sans-serif'; color: black;">Unicode</span><span style="line-height: 150%; font-family: 宋体; color: black;">就会和</span><span style="line-height: 150%; font-family: 'Verdana', 'sans-serif'; color: black;">System.Security</span><span style="line-height: 150%; font-family: 宋体; color: black;">下面提供的方法产生的哈希结果不一致，这里需要注意。</span></p>
<p>C#<span style="font-family: 宋体;">的加密解密算法，包括</span>Silverlight<span style="font-family: 宋体;">的</span>MD5<span style="font-family: 宋体;">算法</span>,encrypt,silveright</p>


<p>Related posts:<ol><li><a href='http://cq-cser.cn/2010/04/app-config-c%e8%af%bb%e5%86%99%e7%b1%bb/' rel='bookmark' title='Permanent Link: app.config-c#读写类'>app.config-c#读写类</a></li>
<li><a href='http://cq-cser.cn/2010/01/asp-net%e5%8a%a0%e5%af%86cookies/' rel='bookmark' title='Permanent Link: ASP.NET加密Cookies'>ASP.NET加密Cookies</a></li>
<li><a href='http://cq-cser.cn/2010/01/silverlight-rsa/' rel='bookmark' title='Permanent Link: Silverlight中RSA算法的实现'>Silverlight中RSA算法的实现</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://cq-cser.cn/2010/03/csilverlight-md5/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Silverlight开发环境部署</title>
		<link>http://cq-cser.cn/2010/02/silverlight%e5%bc%80%e5%8f%91%e7%8e%af%e5%a2%83%e9%83%a8%e7%bd%b2/</link>
		<comments>http://cq-cser.cn/2010/02/silverlight%e5%bc%80%e5%8f%91%e7%8e%af%e5%a2%83%e9%83%a8%e7%bd%b2/#comments</comments>
		<pubDate>Sat, 20 Feb 2010 05:07:42 +0000</pubDate>
		<dc:creator>cq</dc:creator>
				<category><![CDATA[Silverlight]]></category>

		<guid isPermaLink="false">http://cq-cser.cn/?p=847</guid>
		<description><![CDATA[Silverlight开发工具包（必装）： 在银光中国网有篇“轻松建立Silverlight开发环境”，该文详细介绍了Silverlight工具集下载，以及安装步骤。我简要列出，另外做一些补充：   工具一： Visual Studio 2008 SP1 或者 Visual Studio 2010 或者 Visual Web Developer Express 2008 With SP1；   Visual Studio是Silverlight的开发必需工具，其中VS2008 SP1和Visual Web Developer Express With SP1仅支持Silverlight 3的开发，而VS2010支持Silverlight 3和Silverlight 4项目开发。在安装Visual Studio的同时，.Net Framework 3.5 SP1也将同时安装，如果没有安装，需要独立下载安装。 Silverlight 4项目开发，必须有.Net Framework 4.0支持。   工具二： Silverlight开发工具包 Silverlight开发工具包中包含各种Silverlight开发模板，安装完成后，可以在Visual Studio中创建Silverlight项目。对应下载地址 Silverlight 2 Tools for Visual Studio 2008 SP1 和 Silverlight 3 Tools for Visual Studio [...]


Related posts:<ol><li><a href='http://cq-cser.cn/2009/12/microsoft-visualstudio-xaml-%e6%9c%aa%e5%8a%a0%e8%bd%bd%e9%94%99%e8%af%af/' rel='bookmark' title='Permanent Link: Microsoft.VisualStudio.Xaml 加载错误'>Microsoft.VisualStudio.Xaml 加载错误</a></li>
<li><a href='http://cq-cser.cn/2009/12/%e8%bd%bb%e6%9d%be%e5%bb%ba%e7%ab%8bsilverlight%e5%bc%80%e5%8f%91%e7%8e%af%e5%a2%83/' rel='bookmark' title='Permanent Link: 轻松建立Silverlight开发环境'>轻松建立Silverlight开发环境</a></li>
<li><a href='http://cq-cser.cn/2010/01/wpf2/' rel='bookmark' title='Permanent Link: wpf(2)'>wpf(2)</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p><strong>Silverlight开发工具包（必装）：</strong></p>
<p>在<a href="http://silverlightchina.net/" target="_blank">银光中国网</a>有篇“<a href="http://silverlightchina.net/html/learn/2009/0706/5.html" target="_blank">轻松建立Silverlight开发环境</a>”，该文详细介绍了Silverlight工具集下载，以及安装步骤。我简要列出，另外做一些补充：</p>
<p> <span id="more-847"></span></p>
<p><strong>工具一：</strong> <a href="http://msdn.microsoft.com/en-us/vs2008/products/cc268305.aspx" target="_blank">Visual Studio 2008 SP1 </a>或者 <a href="http://msdn.microsoft.com/en-us/vstudio/dd582936.aspx" target="_blank">Visual Studio 2010</a> 或者 <a href="http://www.microsoft.com/express/Downloads/#webInstall" target="_blank">Visual Web Developer Express 2008 With SP1</a>；</p>
<div><img src="http://images.cnblogs.com/cnblogs_com/jv9/1_100219122937_1.jpg" border="0" alt="" width="554" height="397" /></div>
<div><img src="http://images.cnblogs.com/cnblogs_com/jv9/1_100219122937_2.jpg" border="0" alt="" width="532" height="323" /></div>
<div>
<p><img style="width: 540px; height: 430px;" src="http://images.cnblogs.com/cnblogs_com/jv9/mvcawesome.png" border="0" alt="" width="540" height="430" /> </div>
<p>Visual Studio是Silverlight的开发必需工具，其中VS2008 SP1和Visual Web Developer Express With SP1仅支持Silverlight 3的开发，而VS2010支持Silverlight 3和Silverlight 4项目开发。在安装Visual Studio的同时，.Net Framework 3.5 SP1也将同时安装，如果没有安装，需要独立下载安装。 Silverlight 4项目开发，必须有.Net Framework 4.0支持。</p>
<p> </p>
<p><strong>工具二：</strong> Silverlight开发工具包</p>
<p>Silverlight开发工具包中包含各种Silverlight开发模板，安装完成后，可以在Visual Studio中创建Silverlight项目。对应下载地址 <a href="http://go.microsoft.com/fwlink/?LinkId=129043" target="_blank">Silverlight 2 Tools for Visual Studio 2008 SP1</a> 和 <a href="http://www.microsoft.com/downloads/details.aspx?familyid=9442B0F2-7465-417A-88F3-5E7B5409E9DD&amp;displaylang=en" target="_blank">Silverlight 3 Tools for Visual Studio 2008 SP1</a>， <a href="http://www.microsoft.com/downloads/details.aspx?familyid=68A158AF-9BB8-4855-A724-D09D196EAAF3&amp;displaylang=en" target="_blank">Silverlight 4 Tools for Visual Studio 2010 Beta 2</a>。</p>
<p> </p>
<p><strong>工具三：</strong> Silverlight SDK<br />
 </p>
<p>作为专业开发人员，自然离不开Software Development Kit（SDK）支持，Silverlight同样也推出了对应的SDK包，其中包含在线开发文档，在线Silverlight例程，开发类库等。<a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=1ea49236-0de7-41b1-81c8-a126ff39975b&amp;displaylang=en" target="_blank">Silverlight 3 SDK</a> 和 <a href="http://go.microsoft.com/fwlink/?LinkID=169408" target="_blank">Silvelright 4 SDK</a>。</p>
<p> </p>
<p><strong>工具四：</strong> <a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=e82db5e2-7106-419e-80b0-65cce89f06bb&amp;displaylang=en" target="_blank">Expression Blend 3 + SketchFlow  - Silverlight设计工具</a></p>
<div>
<img src="http://images.cnblogs.com/cnblogs_com/jv9/1_100219123110_1.png" border="0" alt="" width="504" height="399" /> </div>
<p>自Silverlight 3发布后，Visual Studio 2008 SP1已经不再支持Silverlight开发视图界面, 该功能被Expression Blend 3替代，众所周知，Microsoft Expression是微软2009年主打的一套设计软件，其中包括视频处理，网页设计，WPF/Silverlight UI以及动画设计等工具集合，Blend是其中一员，主要从事WPF/Silverlight UI设计，动画制作，以及软件原型设计等。</p>
<p>在Visual Studio 2010的试用中，我们可以发现，VS2010已经恢复了对Silverlight开发的视图界面功能，这对开发人员来说，无疑是一个好消息。</p>
<p> </p>
<p><strong>工具五：</strong> <a href="http://silverlight.codeplex.com/" target="_blank">Silverlight Toolkit &#8211; Silverlight控件开发包</a></p>
<p> </p>
<p><img src="http://images.cnblogs.com/cnblogs_com/jv9/1_100219123048_1.png" border="0" alt="" width="644" height="435" /></p>
<p><a href="http://silverlight.codeplex.com/" target="_blank">Silverlight控件开发包</a>提供数十种Silverlight常用控件，在Silverlight项目开发过程中，可以很方便的进行调用。该项目开发包属于开源项目，开发人员可以到项目网站进行下载最新源代码，并且可以根据项目需求自行修改。</p>
<p> </p>
<p><strong>工具六：</strong> <a href="http://silverlight.net/getstarted/" target="_blank">Silverlight客户端</a></p>
<p>以上Silverlight开发工具安装完成后，需要确认安装Silverlight客户端，当前微软推出了两款Silverlight客户端，分别运行在Windows系统和Mac系统。 相对来说，该工具包安装是最简单的，进行<a href="http://silverlight.net/getstarted/" target="_blank">官方网站选择相关版本</a>下载安装即可。</p>
<p>【备注】微软官方推荐使用 <a href="http://www.microsoft.com/web/gallery/install.aspx?appsxml=&amp;appid=VWD;Silverlight3Tools;SilverlightToolkit;RIAServices" target="_blank">Web Platform Installer </a>安装Silverlight开发环境，该平台包括以上所有的安装包。</p>
<p> </p>
<div><a href="http://www.microsoft.com/web/gallery/install.aspx?appsxml=&amp;appid=VWD;Silverlight3Tools;SilverlightToolkit;RIAServices" target="_blank"></a><br />
<img src="http://images.cnblogs.com/cnblogs_com/jv9/1_100219133704_1.png" border="0" alt="" width="192" height="43" /> </div>
<p> </p>
<p><strong>Silverlight辅助开发工具包：</strong></p>
<p> </p>
<p><strong>工具一：</strong><a href="http://go.microsoft.com/fwlink/?LinkID=157112" target="_blank">Deep Zoom Composer &#8211; 放大镜功能包</a></p>
<p>在Silverlight发布的初期，Deep Zoom Composer是一大亮点，该功能允许用户在Silverlight应用中查看高分辨率图片，其中平滑的扩大以及缩小的动画效果，吸引了不少用户。</p>
<p> </p>
<p><strong>工具二：</strong><a href="http://silverlight.net/riaservices/" target="_blank">.Net RIA Services</a></p>
<p>随着RIA技术的发展，微软也推出了对应的解决方案，.Net RIA Service，该工具扩展了Silverlight功能，沿用了传统的n-Tier应用模型概念，允许开发人员创建n层Silverlight应用。虽然该项目也属于Silverlight开发中重点之一，但是由于该项目一直属于测试版，作为商业项目不推荐使用，所以，我没有把该工具放入必须安装的列表中。</p>
<p> </p>
<p><strong>工具三：</strong><a href="http://www.red-gate.com/products/reflector/" target="_blank">.Net Reflector</a></p>
<p>相信大家都很熟悉这个工具了，该工具主要是.Net代码的反编译，在<a href="http://silverlightchina.net/html/tips/2009/1214/407.html" target="_blank">反编译Silverlight项目</a>中有着很大的作用。这里就不再赘述。</p>
<p> </p>
<p><strong>工具四：</strong><a href="http://silverlightchina.net/html/works/2009/0712/63.html" target="_blank">Silverlight SPY</a></p>
<div>
<img src="http://images.cnblogs.com/cnblogs_com/jv9/1_100219124212_1_lit.jpg" border="0" alt="" width="300" height="240" /> </div>
<p>Silverlight SPY是一款Silverlight项目侦测工具，该工具探测XAP包，查看应用风格，分解查看应用界面，和Reflector配合可以查看项目资源，以及项目源代码，是一款很不错的工具,详细<a href="http://silverlightchina.net/html/works/2009/0712/63.html" target="_blank">中文介绍请看这里</a>。</p>
<p> </p>
<p><strong>工具五：</strong><a href="http://www.fiddler2.com/" target="_blank">Fiddler </a>/ <a href="http://getfirebug.com/" target="_blank">FireBug</a></p>
<div><img src="http://images.cnblogs.com/cnblogs_com/jv9/1_100219123952_1_lit.png" border="0" alt="" width="500" height="480" /> </div>
<div>
<img src="http://images.cnblogs.com/cnblogs_com/jv9/1_100219124059_1.gif" border="0" alt="" width="753" height="342" /> </div>
<p>作为Web开发人员，对这两款工具并不陌生，该工具主要用于监测HTTP网络信息，手工Debug应用。在Silverlight + WCF项目开发中，这是必不可少的辅助调试工具。</p>
<p> </p>
<p><strong>工具六：</strong><a href="http://silverlightchina.net/html/works/2010/0207/680.html" target="_blank">KaXaml</a></p>
<p><img src="http://images.cnblogs.com/cnblogs_com/jv9/1_100207125817_1.png" border="0" alt="" width="550" height="447" /></p>
<p>KaXaml是一款开源的轻量级XAML编辑器，该项目支持视窗编辑，支持高亮语法支持。该项目是开源项目，详细<a href="http://silverlightchina.net/html/works/2010/0207/680.html" target="_blank">中文介绍请看这里</a>。</p>
<p> </p>
<p><strong>工具七：</strong><a href="http://karlshifflett.wordpress.com/xaml-power-toys/" target="_blank">XAML Power Toys</a></p>
<p> </p>
<div>
<img src="http://images.cnblogs.com/cnblogs_com/jv9/1_100219123741_1.jpg" border="0" alt="" width="704" height="196" /> </div>
<p>该工具是一款Visual Studio插件辅助工具，用于编辑XAML文档，包含多种代码模板，简化开发人员输入代码过程，是一款很不错的辅助工具。该工具同时支持WPF/Silverlight开发。</p>
<p> </p>
<p><strong>工具八：</strong><a href="http://blois.us/Rooler/" target="_blank">Rooler</a></p>
<div>
<img src="http://images.cnblogs.com/cnblogs_com/jv9/1_100219123532_1.png" border="0" alt="" width="278" height="45" /> </div>
<p><a href="http://blois.us/Rooler/" target="_blank">Rooler</a>是一款图形侦测工具，在Web项目开发中经常用到，用于侦测Web图片尺寸，可以用来辅助设计Silverlight UI。</p>
<p> </p>
<p><strong>工具九：</strong><a href="http://www.eqatec.com/tools/profiler" target="_blank">Silverlight Profiler</a></p>
<div>
<img src="http://images.cnblogs.com/cnblogs_com/jv9/1_100219123636_1.gif" border="0" alt="" width="304" height="279" /> </div>
<p>该工具是Silverlight应用优化工具，提高项目运行效率，试用过几次，感觉对于大型项目，效果还是比较明显的。</p>


<p>Related posts:<ol><li><a href='http://cq-cser.cn/2009/12/microsoft-visualstudio-xaml-%e6%9c%aa%e5%8a%a0%e8%bd%bd%e9%94%99%e8%af%af/' rel='bookmark' title='Permanent Link: Microsoft.VisualStudio.Xaml 加载错误'>Microsoft.VisualStudio.Xaml 加载错误</a></li>
<li><a href='http://cq-cser.cn/2009/12/%e8%bd%bb%e6%9d%be%e5%bb%ba%e7%ab%8bsilverlight%e5%bc%80%e5%8f%91%e7%8e%af%e5%a2%83/' rel='bookmark' title='Permanent Link: 轻松建立Silverlight开发环境'>轻松建立Silverlight开发环境</a></li>
<li><a href='http://cq-cser.cn/2010/01/wpf2/' rel='bookmark' title='Permanent Link: wpf(2)'>wpf(2)</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://cq-cser.cn/2010/02/silverlight%e5%bc%80%e5%8f%91%e7%8e%af%e5%a2%83%e9%83%a8%e7%bd%b2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Silverlight游戏中的WriteableBitmap技术可行性报告</title>
		<link>http://cq-cser.cn/2010/02/silverlight%e6%b8%b8%e6%88%8f%e4%b8%ad%e7%9a%84writeablebitmap%e6%8a%80%e6%9c%af%e5%8f%af%e8%a1%8c%e6%80%a7%e6%8a%a5%e5%91%8a/</link>
		<comments>http://cq-cser.cn/2010/02/silverlight%e6%b8%b8%e6%88%8f%e4%b8%ad%e7%9a%84writeablebitmap%e6%8a%80%e6%9c%af%e5%8f%af%e8%a1%8c%e6%80%a7%e6%8a%a5%e5%91%8a/#comments</comments>
		<pubDate>Wed, 03 Feb 2010 05:47:04 +0000</pubDate>
		<dc:creator>cq</dc:creator>
				<category><![CDATA[Silverlight]]></category>
		<category><![CDATA[WEB]]></category>
		<category><![CDATA[c#]]></category>
		<category><![CDATA[WriteableBitmap]]></category>

		<guid isPermaLink="false">http://cq-cser.cn/?p=741</guid>
		<description><![CDATA[希望此文对投身于Silverlight游戏的朋友予以帮助。 技术。 代码下载：SilverlightTestWbResource.zip 目录设置如下：   情形1：将png文件都设置为Resource，Do not copy。 指定Image的Source代码： spirit.Source = new BitmapImage(new Uri(@"Player/" + count + ".png", UriKind.Relative));   注意这里使用的是相对路径，是当前MainPage.xaml相对于图片的位置，而不能使用服务器路径。 如果我们在Spirit中指定Image的Source，就是说相对路径变了，那么代码要写为： Body.Source = new BitmapImage(new Uri(@"../Player/2.png", UriKind.Relative));   在这种情形下，所有图片都被作为资源而嵌入到dll中，观察xap中的组织结构，可以证实我们的结论：     情形2：将png文件都设置为Content，Copy if newer。 指定Image的Source代码： spirit.Source = new BitmapImage(new Uri(@"/Player/" + count + ".png", UriKind.Relative));   注意这里使用的是服务器路径，而不能使用相对路径。 使用服务器路径的一个好处是，无论xaml位于那个目录下，都可以无视，例如上面的那个Spirit控件： Body.Source = new BitmapImage(new Uri(@"/Player/2.png", UriKind.Relative)); [...]


Related posts:<ol><li><a href='http://cq-cser.cn/2010/01/silverlight-game/' rel='bookmark' title='Permanent Link: 跟老外学Silverlight游戏 之四 粒子特效'>跟老外学Silverlight游戏 之四 粒子特效</a></li>
<li><a href='http://cq-cser.cn/2010/01/silverlight-qq/' rel='bookmark' title='Permanent Link: Silverlight版QQ初体验'>Silverlight版QQ初体验</a></li>
<li><a href='http://cq-cser.cn/2010/01/silverlight-game-1/' rel='bookmark' title='Permanent Link: 跟老外学Silverlight游戏 之一 新建项目'>跟老外学Silverlight游戏 之一 新建项目</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p><span style="widows: 2; text-transform: none; text-indent: 0px; border-collapse: separate; font: 14px arial, sans-serif; white-space: normal; orphans: 2; letter-spacing: normal; color: #000000; word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;"><span style="border-collapse: collapse; font-size: 13px;"><span style="WIDOWS: 2; TEXT-TRANSFORM: none; TEXT-INDENT: 0px; BORDER-COLLAPSE: separate; FONT: 14px arial, sans-serif; WHITE-SPACE: normal; ORPHANS: 2; LETTER-SPACING: normal; COLOR: #000000; WORD-SPACING: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><span style="BORDER-COLLAPSE: collapse; FONT-SIZE: 13px">希望此文对投身于Silverlight游戏的朋友予以帮助。</p>
<p></span></span>技术。</span></span></p>
<p>代码下载：<a style="COLOR: #2244bb" href="http://files.cnblogs.com/Jax/SilverlightTestWbResource.zip" target="_blank">SilverlightTestWbResource.zip</a><span id="more-741"></span></p>
<p>目录设置如下：</p>
<p><a style="COLOR: #2244bb" href="http://images.cnblogs.com/cnblogs_com/Jax/WindowsLiveWriter/WriteableBitmap_C864/image_4.png" target="_blank"><img style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title="image" src="http://images.cnblogs.com/cnblogs_com/Jax/WindowsLiveWriter/WriteableBitmap_C864/image_thumb_1.png" border="0" alt="image" width="194" height="298" /></a></p>
<p> </p>
<p>情形1：将png文件都设置为Resource，Do not copy。</p>
<p>指定Image的Source代码：</p>
<pre style="FONT-SIZE: 11px">spirit.Source = <span style="COLOR: blue">new </span><span style="COLOR: #2b91af">BitmapImage</span>(<span style="COLOR: blue">new </span><span style="COLOR: #2b91af">Uri</span>(<span style="COLOR: #a31515">@"Player/" </span>+ count + <span style="COLOR: #a31515">".png"</span>, <span style="COLOR: #2b91af">UriKind</span>.Relative));</pre>
<p><a style="COLOR: #2244bb" href="http://11011.net/software/vspaste" target="_blank"></a> </p>
<p>注意这里使用的是相对路径，是当前MainPage.xaml相对于图片的位置，而不能使用服务器路径。</p>
<p>如果我们在Spirit中指定Image的Source，就是说相对路径变了，那么代码要写为：</p>
<pre style="FONT-SIZE: 11px">Body.Source = <span style="COLOR: blue">new </span><span style="COLOR: #2b91af">BitmapImage</span>(<span style="COLOR: blue">new </span><span style="COLOR: #2b91af">Uri</span>(<span style="COLOR: #a31515">@"../Player/2.png"</span>, <span style="COLOR: #2b91af">UriKind</span>.Relative));</pre>
<p><a style="COLOR: #2244bb" href="http://11011.net/software/vspaste" target="_blank"></a> </p>
<p>在这种情形下，所有图片都被作为资源而嵌入到dll中，观察xap中的组织结构，可以证实我们的结论：</p>
<p> <a style="COLOR: #2244bb" href="http://images.cnblogs.com/cnblogs_com/Jax/WindowsLiveWriter/WriteableBitmap_C864/image_5.png" target="_blank"><img style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title="image" src="http://images.cnblogs.com/cnblogs_com/Jax/WindowsLiveWriter/WriteableBitmap_C864/image_thumb.png" border="0" alt="image" width="244" height="157" /></a></p>
<p> </p>
<p>情形2：将png文件都设置为Content，Copy if newer。</p>
<p>指定Image的Source代码：</p>
<pre style="FONT-SIZE: 11px">spirit.Source = <span style="COLOR: blue">new </span><span style="COLOR: #2b91af">BitmapImage</span>(<span style="COLOR: blue">new </span><span style="COLOR: #2b91af">Uri</span>(<span style="COLOR: #a31515">@"/Player/" </span>+ count + <span style="COLOR: #a31515">".png"</span>, <span style="COLOR: #2b91af">UriKind</span>.Relative));</pre>
<p><a style="COLOR: #2244bb" href="http://11011.net/software/vspaste" target="_blank"></a> </p>
<p>注意这里使用的是服务器路径，而不能使用相对路径。</p>
<p>使用服务器路径的一个好处是，无论xaml位于那个目录下，都可以无视，例如上面的那个Spirit控件：</p>
<pre style="FONT-SIZE: 11px">Body.Source = <span style="COLOR: blue">new </span><span style="COLOR: #2b91af">BitmapImage</span>(<span style="COLOR: blue">new </span><span style="COLOR: #2b91af">Uri</span>(<span style="COLOR: #a31515">@"/Player/2.png"</span>, <span style="COLOR: #2b91af">UriKind</span>.Relative));</pre>
<p><a style="COLOR: #2244bb" href="http://11011.net/software/vspaste" target="_blank"></a> </p>
<p>在这种情形下，所有图片都打包到xap的Player目录下，观察xap中的组织结构，可以证实我们的结论：</p>
<p> <a style="COLOR: #2244bb" href="http://images.cnblogs.com/cnblogs_com/Jax/WindowsLiveWriter/WriteableBitmap_C864/image_7.png" target="_blank"><img style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title="image" src="http://images.cnblogs.com/cnblogs_com/Jax/WindowsLiveWriter/WriteableBitmap_C864/image_thumb_2.png" border="0" alt="image" width="244" height="180" /></a></p>
<p>其中，Player文件夹中存放着0-7这8张png图片</p>
<p> </p>
<p>下面分析截图的技术 ，就是说把一张大图，只截取其中一部分。</p>
<p>有2种方法：</p>
<p>方法1：使用Clip</p>
<pre style="font-size: 11px;"><span style="color: blue;">public partial class </span><span style="color: #2b91af;">MainPage </span>: <span style="color: #2b91af;">UserControl
</span>{
    <span style="color: blue;">private int </span>count = 1;
    <span style="color: blue;">private </span><span style="color: #2b91af;">Image </span>spirit;

    <span style="color: blue;">public </span>MainPage()
    {
        InitializeComponent();

        spirit = <span style="color: blue;">new </span><span style="color: #2b91af;">Image</span>()
        {
            Width = 1500,
            Height = 150,
            Source = <span style="color: blue;">new </span><span style="color: #2b91af;">BitmapImage</span>(<span style="color: blue;">new </span><span style="color: #2b91af;">Uri</span>(<span style="color: #a31515;">@"Player/PlayerMagic.png"</span>, <span style="color: #2b91af;">UriKind</span>.Relative))
        };

        Carrier.Children.Add(spirit);

        <span style="color: #2b91af;">DispatcherTimer </span>dispatcherTimer = <span style="color: blue;">new </span><span style="color: #2b91af;">DispatcherTimer</span>();
        dispatcherTimer.Tick += dispatcherTimer_Tick;
        dispatcherTimer.Interval = <span style="color: #2b91af;">TimeSpan</span>.FromMilliseconds(150);
        dispatcherTimer.Start();
    }

    <span style="color: blue;">void </span>dispatcherTimer_Tick(<span style="color: blue;">object </span>sender, <span style="color: #2b91af;">EventArgs </span>e)
    {
        spirit.Clip = <span style="color: blue;">new </span><span style="color: #2b91af;">RectangleGeometry</span>()
        {
            Rect = <span style="color: blue;">new </span><span style="color: #2b91af;">Rect</span>(count * 150, 0, 150, 150)
        };

        spirit.RenderTransform = <span style="color: blue;">new </span><span style="color: #2b91af;">TranslateTransform</span>()
        {
            X = -count * 150
        };

        count = count == 7 ? 0 : count + 1;
    }
}</pre>
<p>其中，使用相对路径或服务器路径都是可以的，当然，相应地，图片要设置为Resource或Content。</p>
<p> </p>
<p>方法2：使用WriteableBitmap技术</p>
<p>这个WriteableBitmap比较玄的，在使用中有很多地方需要注意。我和深蓝色右手昨天差点被它搞死，拿到QQ群讨论，才知道很多人都有同样的困扰和迷惑。</p>
<p>1）使用服务器路径的编程模型：</p>
<pre style="font-size: 11px;"><span style="color: blue;">public partial class </span><span style="color: #2b91af;">MainPage </span>: <span style="color: #2b91af;">UserControl
</span>{
    <span style="color: blue;">private int </span>count = 1;
    <span style="color: blue;">private </span><span style="color: #2b91af;">Image </span>spirit;

    <span style="color: blue;">public </span>MainPage()
    {
        InitializeComponent();

        spirit = <span style="color: blue;">new </span><span style="color: #2b91af;">Image</span>()
        {
            Width = 150,
            Height = 150
        };

        Carrier.Children.Add(spirit);

        <span style="color: #2b91af;">DispatcherTimer </span>dispatcherTimer = <span style="color: blue;">new </span><span style="color: #2b91af;">DispatcherTimer</span>();
        dispatcherTimer.Tick += dispatcherTimer_Tick;
        dispatcherTimer.Interval = <span style="color: #2b91af;">TimeSpan</span>.FromMilliseconds(150);
        dispatcherTimer.Start();
    }

    <span style="color: blue;">void </span>dispatcherTimer_Tick(<span style="color: blue;">object </span>sender, <span style="color: #2b91af;">EventArgs </span>e)
    {
        <span style="color: green;">//spirit.Source = new BitmapImage(new Uri(@"/Images/" + count + ".png", UriKind.Relative));
        </span>spirit.Source = ComposeEquip(<span style="color: #a31515;">@"/Images/Body0.png"</span>, 150, 150, <span style="color: blue;">new </span><span style="color: #2b91af;">Point</span>(-count * 150, 0));

        count = count == 33 ? 0 : count + 1;
    }

    <span style="color: blue;">public static </span><span style="color: #2b91af;">WriteableBitmap </span>ComposeEquip(<span style="color: blue;">string </span>bodyAddress, <span style="color: blue;">int </span>width, <span style="color: blue;">int </span>height, <span style="color: #2b91af;">Point </span>bodyOffset)
    {
        <span style="color: #2b91af;">WriteableBitmap </span>writeableBitmap = <span style="color: blue;">new </span><span style="color: #2b91af;">WriteableBitmap</span>(width, height);
        writeableBitmap.Render(<span style="color: blue;">new </span><span style="color: #2b91af;">Image</span>() { Source = GetImage(bodyAddress) }, <span style="color: blue;">new </span><span style="color: #2b91af;">TranslateTransform</span>() { X = bodyOffset.X, Y = bodyOffset.Y });
        writeableBitmap.Invalidate();
        <span style="color: blue;">return </span>writeableBitmap;
    }

    <span style="color: blue;">public static </span><span style="color: #2b91af;">BitmapSource </span>GetImage(<span style="color: blue;">string </span>address)
    {
        <span style="color: blue;">return new </span><span style="color: #2b91af;">BitmapImage</span>(<span style="color: blue;">new </span><span style="color: #2b91af;">Uri</span>(<span style="color: blue;">string</span>.Format(<span style="color: #a31515;">@"{0}"</span>, address), <span style="color: #2b91af;">UriKind</span>.Relative));
    }

}</pre>
<p><a style="color: #2244bb;" href="http://11011.net/software/vspaste" target="_blank"></a> </p>
<p> </p>
<p>如果我们还想合并2张图片，那么ComposeEquip方法可能就是下面这样的：</p>
<pre style="font-size: 11px;"><span style="color: blue;">public static </span><span style="color: #2b91af;">WriteableBitmap </span>ComposeEquip(<span style="color: blue;">string </span>bodyAddress, <span style="color: blue;">string </span>weaponAddress, <span style="color: blue;">int </span>width, <span style="color: blue;">int </span>height, <span style="color: #2b91af;">Point </span>bodyOffset, <span style="color: #2b91af;">Point </span>weaponOffset)
{
    <span style="color: #2b91af;">WriteableBitmap </span>writeableBitmap = <span style="color: blue;">new </span><span style="color: #2b91af;">WriteableBitmap</span>(width, height);
    writeableBitmap.Render(<span style="color: blue;">new </span><span style="color: #2b91af;">Image</span>() { Source = <span style="color: #2b91af;">Super</span>.GetImage(bodyAddress) }, <span style="color: blue;">new </span><span style="color: #2b91af;">TranslateTransform</span>() { X = bodyOffset.X, Y = bodyOffset.Y });
    writeableBitmap.Render(<span style="color: blue;">new </span><span style="color: #2b91af;">Image</span>() { Source = <span style="color: #2b91af;">Super</span>.GetImage(weaponAddress) }, <span style="color: blue;">new </span><span style="color: #2b91af;">TranslateTransform</span>() { X = weaponOffset.X, Y = weaponOffset.Y });
    writeableBitmap.Invalidate();
    <span style="color: blue;">return </span>writeableBitmap;
}</pre>
<p><a style="color: #2244bb;" href="http://11011.net/software/vspaste" target="_blank"></a> </p>
<p> </p>
<p>2）使用相对路径的编程模型：</p>
<p>如何把上面的路径换成相对路径，同时把图片修改为Resource，就玩不转了。</p>
<p>我猜测，问题出在writeableBitmap.Render(….);和writeableBitmap.Invalidate();这两条语句之间。因为Render需要时间，</p>
<p>那么如何解决呢？</p>
<p>有人出馊主意，说在这2条语句之间开一个线程，然后sleep1秒，但是他没有考虑到我们的ComposeEquip就是一个每150mm就执行一次的方法。</p>
<p>正确的解决方案如下：</p>
<p>我们为要加载的大图片的ImageOpened 事件上挂上一个方法，在该方法中，我们把这张大图片切割成若干小图片，并放到frames 数组中——这时大图片是可以使用的，所以不用担心切割的时候是一片空白。</p>
<p>还要注意，bitmap_ImageOpened方法什么时候触发呢？我们看到MainPage构造函数的最后一条语句：</p>
<p>spirit.Source = bitmap;</p>
<p>对，就是执行这条语句的时候触发——不信？那你就把这句话注释掉，看看bitmap_ImageOpened方法还能被执行到么。我是没看到断点会停到这里。</p>
<pre style="font-size: 11px;"><span style="color: blue;">public partial class </span><span style="color: #2b91af;">MainPage </span>: <span style="color: #2b91af;">UserControl
</span>{
    <span style="color: blue;">private int </span>count = 1;
    <span style="color: blue;">private </span><span style="color: #2b91af;">Image </span>spirit;
    <span style="color: #2b91af;">ImageSource</span>[] frames = <span style="color: blue;">new </span><span style="color: #2b91af;">ImageSource</span>[10];

    <span style="color: blue;">public </span>MainPage()
    {
        InitializeComponent();

        spirit = <span style="color: blue;">new </span><span style="color: #2b91af;">Image</span>();
        <span style="color: #2b91af;">BitmapImage </span>bitmap = <span style="color: blue;">new </span><span style="color: #2b91af;">BitmapImage</span>(<span style="color: blue;">new </span><span style="color: #2b91af;">Uri</span>(<span style="color: #a31515;">@"Src/PlayerMagic.png"</span>, <span style="color: #2b91af;">UriKind</span>.Relative));
        bitmap.ImageOpened += <span style="color: blue;">new </span><span style="color: #2b91af;">EventHandler</span>&lt;<span style="color: #2b91af;">RoutedEventArgs</span>&gt;(bitmap_ImageOpened);

        Carrier.Children.Add(spirit);
        spirit.Visibility = <span style="color: #2b91af;">Visibility</span>.Collapsed;
        spirit.Source = bitmap;
    }

    <span style="color: blue;">void </span>dispatcherTimer_Tick(<span style="color: blue;">object </span>sender, <span style="color: #2b91af;">EventArgs </span>e)
    {
        spirit.Source = frames[count];
        count = count == 7 ? 0 : count + 1;
    }

    <span style="color: blue;">void </span>bitmap_ImageOpened(<span style="color: blue;">object </span>sender, <span style="color: #2b91af;">RoutedEventArgs </span>e)
    {
        spirit.Source = sender <span style="color: blue;">as </span><span style="color: #2b91af;">BitmapImage</span>;

        <span style="color: blue;">for </span>(<span style="color: blue;">int </span>j = 0; j &lt; 10; j++)
        {
            <span style="color: #2b91af;">WriteableBitmap </span>wb = <span style="color: blue;">new </span><span style="color: #2b91af;">WriteableBitmap</span>(150, 150);
            wb.Render(spirit, <span style="color: blue;">new </span><span style="color: #2b91af;">TranslateTransform</span>() { X = -150 * j });
            wb.Invalidate();
            frames[j] = (<span style="color: #2b91af;">ImageSource</span>)wb;
        }

        <span style="color: #2b91af;">DispatcherTimer </span>dispatcherTimer = <span style="color: blue;">new </span><span style="color: #2b91af;">DispatcherTimer</span>();
        dispatcherTimer.Tick += <span style="color: blue;">new </span><span style="color: #2b91af;">EventHandler</span>(dispatcherTimer_Tick);
        dispatcherTimer.Interval = <span style="color: #2b91af;">TimeSpan</span>.FromMilliseconds(150); <span style="color: green;">//重复间隔
         </span>dispatcherTimer.Start();

        spirit.Source = frames[count];
        spirit.Visibility = <span style="color: #2b91af;">Visibility</span>.Visible;
    }
}</pre>
<p><a style="color: #2244bb;" href="http://11011.net/software/vspaste" target="_blank"></a> </p>
<p> </p>
<p>话说，我是在学习深蓝色右手的游戏教程时，把他的WPF版本转化为Silverlight版，在这期间，发现了这个问题。深蓝色右手昨晚交给我一个任务，就是把这个研究明白，然后给出一个终极答案。于是便有了这篇文章。</p>
<p>回顾一下本文的要点，</p>
<p>1.关于图片，Resource和Content的区别</p>
<p>2.Clip和WriteableBitmap的适用场合</p>
<p><img src="http://www.cnblogs.com/Jax/aggbug/1662287.html?type=1" alt="" width="1" height="1" /></p>


<p>Related posts:<ol><li><a href='http://cq-cser.cn/2010/01/silverlight-game/' rel='bookmark' title='Permanent Link: 跟老外学Silverlight游戏 之四 粒子特效'>跟老外学Silverlight游戏 之四 粒子特效</a></li>
<li><a href='http://cq-cser.cn/2010/01/silverlight-qq/' rel='bookmark' title='Permanent Link: Silverlight版QQ初体验'>Silverlight版QQ初体验</a></li>
<li><a href='http://cq-cser.cn/2010/01/silverlight-game-1/' rel='bookmark' title='Permanent Link: 跟老外学Silverlight游戏 之一 新建项目'>跟老外学Silverlight游戏 之一 新建项目</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://cq-cser.cn/2010/02/silverlight%e6%b8%b8%e6%88%8f%e4%b8%ad%e7%9a%84writeablebitmap%e6%8a%80%e6%9c%af%e5%8f%af%e8%a1%8c%e6%80%a7%e6%8a%a5%e5%91%8a/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WPF中自定义漂亮的进度条</title>
		<link>http://cq-cser.cn/2010/01/wpf%e4%b8%ad%e8%87%aa%e5%ae%9a%e4%b9%89%e6%bc%82%e4%ba%ae%e7%9a%84%e8%bf%9b%e5%ba%a6%e6%9d%a1/</link>
		<comments>http://cq-cser.cn/2010/01/wpf%e4%b8%ad%e8%87%aa%e5%ae%9a%e4%b9%89%e6%bc%82%e4%ba%ae%e7%9a%84%e8%bf%9b%e5%ba%a6%e6%9d%a1/#comments</comments>
		<pubDate>Mon, 25 Jan 2010 11:17:33 +0000</pubDate>
		<dc:creator>cq</dc:creator>
				<category><![CDATA[Silverlight]]></category>
		<category><![CDATA[WEB]]></category>
		<category><![CDATA[WPF]]></category>
		<category><![CDATA[进度条]]></category>

		<guid isPermaLink="false">http://cq-cser.cn/?p=676</guid>
		<description><![CDATA[wpf中自带的进度条是这个样子德。   在2003中这个进度条的样子就会变得非常难看。 在wpf中您可以自己制作任意样式的进度条。如下图：   UserControl.xaml   用户控件 &#60;Grid x:Name="LayoutRoot" Background="Transparent" HorizontalAlignment="Center" VerticalAlignment="Center"&#62; &#60;Grid.RenderTransform&#62; &#60;ScaleTransform x:Name="SpinnerScale" ScaleX="1.0" ScaleY="1.0" /&#62; &#60;/Grid.RenderTransform&#62; &#60;Canvas RenderTransformOrigin="0.5,0.5" HorizontalAlignment="Center" VerticalAlignment="Center" Width="120" Height="120" &#62; &#60;Ellipse Width="21.835" Height="21.862" Canvas.Left="20.1696" Canvas.Top="9.76358" Stretch="Fill" Fill="Orange" Opacity="1.0"/&#62; &#60;Ellipse Width="21.835" Height="21.862" Canvas.Left="2.86816" Canvas.Top="29.9581" Stretch="Fill" Fill="Black" Opacity="0.9"/&#62; &#60;Ellipse Width="21.835" Height="21.862" Canvas.Left="5.03758e-006" Canvas.Top="57.9341" Stretch="Fill" Fill="Black" Opacity="0.8"/&#62; &#60;Ellipse Width="21.835" Height="21.862" Canvas.Left="12.1203" [...]


Related posts:<ol><li><a href='http://cq-cser.cn/2010/02/wpf%e5%88%9d%e4%bd%93%e9%aa%8c/' rel='bookmark' title='Permanent Link: wpf初体验'>wpf初体验</a></li>
<li><a href='http://cq-cser.cn/2010/01/silverlight-game-1/' rel='bookmark' title='Permanent Link: 跟老外学Silverlight游戏 之一 新建项目'>跟老外学Silverlight游戏 之一 新建项目</a></li>
<li><a href='http://cq-cser.cn/2010/01/%e4%bb%80%e4%b9%88%e6%98%afwpf/' rel='bookmark' title='Permanent Link: 什么是WPF'>什么是WPF</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>wpf中自带的进度条是这个样子德。</p>
<p><img src="http://pic002.cnblogs.com/img/homezzm/201001/2010012516580662.png" alt="" /></p>
<p> </p>
<p>在2003中这个进度条的样子就会变得非常难看。</p>
<p>在wpf中您可以自己制作任意样式的进度条。如下图：</p>
<p><img src="http://pic002.cnblogs.com/img/homezzm/201001/2010012517010347.jpg" alt="" /><span id="more-676"></span></p>
<p> </p>
<p>UserControl.xaml</p>
<p> </p>
<div><img src="http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt="" /><img src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="" /><span>用户控件</span></p>
<div>
<pre>
<div><span style="COLOR: #000000">    </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">Grid x:Name</span><span style="COLOR: #000000">=</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">LayoutRoot</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000"> Background</span><span style="COLOR: #000000">=</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">Transparent</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">
              HorizontalAlignment</span><span style="COLOR: #000000">=</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">Center</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000"> VerticalAlignment</span><span style="COLOR: #000000">=</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">Center</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">

        </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">Grid.RenderTransform</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">

            </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">ScaleTransform x:Name</span><span style="COLOR: #000000">=</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">SpinnerScale</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">
                                ScaleX</span><span style="COLOR: #000000">=</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">1.0</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000"> ScaleY</span><span style="COLOR: #000000">=</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">1.0</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">/&gt;</span><span style="COLOR: #000000">

        </span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">Grid.RenderTransform</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">

        </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">Canvas RenderTransformOrigin</span><span style="COLOR: #000000">=</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">0.5,0.5</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">
                    HorizontalAlignment</span><span style="COLOR: #000000">=</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">Center</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">
                    VerticalAlignment</span><span style="COLOR: #000000">=</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">Center</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">
                    Width</span><span style="COLOR: #000000">=</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">120</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000"> Height</span><span style="COLOR: #000000">=</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">120</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">

            </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">Ellipse Width</span><span style="COLOR: #000000">=</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">21.835</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000"> Height</span><span style="COLOR: #000000">=</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">21.862</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">
                         Canvas.Left</span><span style="COLOR: #000000">=</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">20.1696</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">
                         Canvas.Top</span><span style="COLOR: #000000">=</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">9.76358</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">
                         Stretch</span><span style="COLOR: #000000">=</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">Fill</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000"> Fill</span><span style="COLOR: #000000">=</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">Orange</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">
                         Opacity</span><span style="COLOR: #000000">=</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">1.0</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">/&gt;</span><span style="COLOR: #000000">

            </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">Ellipse Width</span><span style="COLOR: #000000">=</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">21.835</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000"> Height</span><span style="COLOR: #000000">=</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">21.862</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">
                         Canvas.Left</span><span style="COLOR: #000000">=</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">2.86816</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">
                         Canvas.Top</span><span style="COLOR: #000000">=</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">29.9581</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000"> Stretch</span><span style="COLOR: #000000">=</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">Fill</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">
                         Fill</span><span style="COLOR: #000000">=</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">Black</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000"> Opacity</span><span style="COLOR: #000000">=</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">0.9</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">/&gt;</span><span style="COLOR: #000000">

            </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">Ellipse Width</span><span style="COLOR: #000000">=</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">21.835</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000"> Height</span><span style="COLOR: #000000">=</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">21.862</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">
                         Canvas.Left</span><span style="COLOR: #000000">=</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">5.03758e-006</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">
                         Canvas.Top</span><span style="COLOR: #000000">=</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">57.9341</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000"> Stretch</span><span style="COLOR: #000000">=</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">Fill</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">
                         Fill</span><span style="COLOR: #000000">=</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">Black</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000"> Opacity</span><span style="COLOR: #000000">=</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">0.8</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">/&gt;</span><span style="COLOR: #000000">

            </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">Ellipse Width</span><span style="COLOR: #000000">=</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">21.835</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000"> Height</span><span style="COLOR: #000000">=</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">21.862</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">
                         Canvas.Left</span><span style="COLOR: #000000">=</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">12.1203</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">
                         Canvas.Top</span><span style="COLOR: #000000">=</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">83.3163</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000"> Stretch</span><span style="COLOR: #000000">=</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">Fill</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">
                         Fill</span><span style="COLOR: #000000">=</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">Black</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000"> Opacity</span><span style="COLOR: #000000">=</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">0.7</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">/&gt;</span><span style="COLOR: #000000">

            </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">Ellipse Width</span><span style="COLOR: #000000">=</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">21.835</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000"> Height</span><span style="COLOR: #000000">=</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">21.862</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">
                         Canvas.Left</span><span style="COLOR: #000000">=</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">36.5459</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">
                         Canvas.Top</span><span style="COLOR: #000000">=</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">98.138</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000"> Stretch</span><span style="COLOR: #000000">=</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">Fill</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">
                         Fill</span><span style="COLOR: #000000">=</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">Black</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000"> Opacity</span><span style="COLOR: #000000">=</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">0.6</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">/&gt;</span><span style="COLOR: #000000">

            </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">Ellipse Width</span><span style="COLOR: #000000">=</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">21.835</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000"> Height</span><span style="COLOR: #000000">=</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">21.862</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">
                         Canvas.Left</span><span style="COLOR: #000000">=</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">64.6723</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">
                         Canvas.Top</span><span style="COLOR: #000000">=</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">96.8411</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000"> Stretch</span><span style="COLOR: #000000">=</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">Fill</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">
                         Fill</span><span style="COLOR: #000000">=</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">Black</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000"> Opacity</span><span style="COLOR: #000000">=</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">0.5</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">/&gt;</span><span style="COLOR: #000000">

            </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">Ellipse Width</span><span style="COLOR: #000000">=</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">21.835</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000"> Height</span><span style="COLOR: #000000">=</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">21.862</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">
                         Canvas.Left</span><span style="COLOR: #000000">=</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">87.6176</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">
                         Canvas.Top</span><span style="COLOR: #000000">=</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">81.2783</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000"> Stretch</span><span style="COLOR: #000000">=</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">Fill</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">
                         Fill</span><span style="COLOR: #000000">=</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">Black</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000"> Opacity</span><span style="COLOR: #000000">=</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">0.4</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">/&gt;</span><span style="COLOR: #000000">

            </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">Ellipse Width</span><span style="COLOR: #000000">=</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">21.835</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000"> Height</span><span style="COLOR: #000000">=</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">21.862</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">
                         Canvas.Left</span><span style="COLOR: #000000">=</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">98.165</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">
                         Canvas.Top</span><span style="COLOR: #000000">=</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">54.414</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000"> Stretch</span><span style="COLOR: #000000">=</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">Fill</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">
                         Fill</span><span style="COLOR: #000000">=</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">Black</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000"> Opacity</span><span style="COLOR: #000000">=</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">0.3</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">/&gt;</span><span style="COLOR: #000000">

            </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">Ellipse Width</span><span style="COLOR: #000000">=</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">21.835</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000"> Height</span><span style="COLOR: #000000">=</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">21.862</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">
                         Canvas.Left</span><span style="COLOR: #000000">=</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">92.9838</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">
                         Canvas.Top</span><span style="COLOR: #000000">=</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">26.9938</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000"> Stretch</span><span style="COLOR: #000000">=</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">Fill</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">
                         Fill</span><span style="COLOR: #000000">=</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">Black</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000"> Opacity</span><span style="COLOR: #000000">=</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">0.2</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">/&gt;</span><span style="COLOR: #000000">

            </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">Ellipse Width</span><span style="COLOR: #000000">=</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">21.835</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000"> Height</span><span style="COLOR: #000000">=</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">21.862</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">
                         Canvas.Left</span><span style="COLOR: #000000">=</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">47.2783</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">
                         Canvas.Top</span><span style="COLOR: #000000">=</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">0.5</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000"> Stretch</span><span style="COLOR: #000000">=</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">Fill</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">
                         Fill</span><span style="COLOR: #000000">=</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">Black</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000"> Opacity</span><span style="COLOR: #000000">=</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">0.1</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">/&gt;</span><span style="COLOR: #000000">

            </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">Canvas.RenderTransform</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">

                </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">RotateTransform x:Name</span><span style="COLOR: #000000">=</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">SpinnerRotate</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">
                                     Angle</span><span style="COLOR: #000000">=</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">0</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">/&gt;</span><span style="COLOR: #000000">

            </span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">Canvas.RenderTransform</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">

            </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">Canvas.Triggers</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">

                </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">EventTrigger RoutedEvent</span><span style="COLOR: #000000">=</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">ContentControl.Loaded</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">

                    </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">BeginStoryboard</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">

                        </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">Storyboard</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">

                            </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">DoubleAnimation
                                    Storyboard.TargetName
                                        </span><span style="COLOR: #000000">=</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">SpinnerRotate</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">
                                     Storyboard.TargetProperty
                                        </span><span style="COLOR: #000000">=</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">(RotateTransform.Angle)</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">
                                     From</span><span style="COLOR: #000000">=</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">0</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000"> To</span><span style="COLOR: #000000">=</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">360</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">
                                     Duration</span><span style="COLOR: #000000">=</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">0:0:01</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">
                                     RepeatBehavior</span><span style="COLOR: #000000">=</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">Forever</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">/&gt;</span><span style="COLOR: #000000">

                        </span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">Storyboard</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">

                    </span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">BeginStoryboard</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">

                </span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">EventTrigger</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">

            </span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">Canvas.Triggers</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">

        </span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">Canvas</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">

    </span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">Grid</span><span style="COLOR: #000000">&gt;</span></div>
</pre>
</div>
</div>
<p> </p>
<p> </p>
<p>UserControl.xaml.cs</p>
<p> </p>
<div><img src="http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt="" /><img src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="" /><span>后台代码</span></p>
<div>
<pre>
<div><span style="COLOR: #000000">        </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> UserControl1()
        {
            InitializeComponent();

            Timeline.DesiredFrameRateProperty.OverrideMetadata(
                       </span><span style="COLOR: #0000ff">typeof</span><span style="COLOR: #000000">(Timeline),
                           </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> FrameworkPropertyMetadata { DefaultValue </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #800080">20</span><span style="COLOR: #000000"> });
        }</span></div>
</pre>
</div>
</div>
<p> </p>
<p> </p>
<p>程序中添加对此用户控件的命名空间</p>
<p>    &lt;Grid&gt;<br />
        &lt;local:UserControl1&gt;&lt;/local:UserControl1&gt;<br />
    &lt;/Grid&gt;</p>
<p><img src="http://www.cnblogs.com/homezzm/aggbug/1656022.html?type=1" alt="" width="1" height="1" /></p>


<p>Related posts:<ol><li><a href='http://cq-cser.cn/2010/02/wpf%e5%88%9d%e4%bd%93%e9%aa%8c/' rel='bookmark' title='Permanent Link: wpf初体验'>wpf初体验</a></li>
<li><a href='http://cq-cser.cn/2010/01/silverlight-game-1/' rel='bookmark' title='Permanent Link: 跟老外学Silverlight游戏 之一 新建项目'>跟老外学Silverlight游戏 之一 新建项目</a></li>
<li><a href='http://cq-cser.cn/2010/01/%e4%bb%80%e4%b9%88%e6%98%afwpf/' rel='bookmark' title='Permanent Link: 什么是WPF'>什么是WPF</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://cq-cser.cn/2010/01/wpf%e4%b8%ad%e8%87%aa%e5%ae%9a%e4%b9%89%e6%bc%82%e4%ba%ae%e7%9a%84%e8%bf%9b%e5%ba%a6%e6%9d%a1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Silverlight中RSA算法的实现</title>
		<link>http://cq-cser.cn/2010/01/silverlight-rsa/</link>
		<comments>http://cq-cser.cn/2010/01/silverlight-rsa/#comments</comments>
		<pubDate>Mon, 04 Jan 2010 10:40:01 +0000</pubDate>
		<dc:creator>cq</dc:creator>
				<category><![CDATA[Silverlight]]></category>
		<category><![CDATA[WEB]]></category>
		<category><![CDATA[c#]]></category>
		<category><![CDATA[其他]]></category>
		<category><![CDATA[RSA]]></category>

		<guid isPermaLink="false">http://cq-cser.cn/?p=589</guid>
		<description><![CDATA[RSA算法是第一个既能用于数据加密也能用于数字签名的算法。它易于理解和操作，也很流行。它的安全性是基于大整数素因子分解的困难性，而大整数因子分解问题是数学上的著名难题，至今没有有效的方法予以解决，因此可以确保RSA算法的安全性。   到目前Silverlight4 Beta发布为止，Silverlight中仍然没有提供非对称加密及数字签名相关的算法。而.NET Framework中提供的RSA等算法，都是通过操作系统提供的相关API实现的，没法移植到Silverlight中使用。因此很难实现一个健壮点的Silverlight纯客户端的注册验证算法。这几天抽空写了个Silverlight下可用的RSA算法，使用非对称加密和数字签名使Silverlight纯客户端的注册验证算法健壮了不少。关于这个Silverlight下可用的RSA算法的具体实现，记录在下面，欢迎大家拍砖。 RSA算法实现主要分为三部分：包括公钥和私钥的产生，非对称加密和解密，数字签名和验证，下面将逐个介绍RSA算法的工作原理及我的实现方法。   1，公钥和私钥的产生     随意选择两个大素数p、q，p不等于q，计算n = p * q。     随机选择一个整数e，满足e和( p – 1 ) * ( q – 1 )互质。(注：e很容易选择，如3, 17, 65537等都可以。.NET Framework中e默认选择的就是65537) 利用Euclid算法计算解密密钥d,满足       e * d ≡ 1 ( mod ( p &#8211; 1 ) * ( q &#8211; 1 ) )     其中n和d也要互质。     其中e和n就是公钥，d和n就是私钥。P、q销毁。 在.NET [...]


Related posts:<ol><li><a href='http://cq-cser.cn/2010/02/c-java-php%e7%9a%84rsa/' rel='bookmark' title='Permanent Link: C# java php的RSA'>C# java php的RSA</a></li>
<li><a href='http://cq-cser.cn/2010/03/csilverlight-md5/' rel='bookmark' title='Permanent Link: C#的加密解密算法，包括Silverlight的MD5算法'>C#的加密解密算法，包括Silverlight的MD5算法</a></li>
<li><a href='http://cq-cser.cn/2009/12/des%e5%8a%a0%e5%af%86%e8%a7%a3%e5%af%86%e5%87%bd%e6%95%b0-%e6%94%b6%e8%97%8f-c/' rel='bookmark' title='Permanent Link: DES加密解密函数 收藏 c#'>DES加密解密函数 收藏 c#</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>RSA算法是第一个既能用于数据加密也能用于数字签名的算法。它易于理解和操作，也很流行。它的安全性是基于大整数素因子分解的困难性，而大整数因子分解问题是数学上的著名难题，至今没有有效的方法予以解决，因此可以确保RSA算法的安全性。</p>
<p>  到目前Silverlight4 Beta发布为止，Silverlight中仍然没有提供非对称加密及数字签名相关的算法。而.NET Framework中提供的RSA等算法，都是通过操作系统提供的相关API实现的，没法移植到Silverlight中使用。因此很难实现一个健壮点的Silverlight纯客户端的注册验证算法。这几天抽空写了个Silverlight下可用的RSA算法，使用非对称加密和数字签名使Silverlight纯客户端的注册验证算法健壮了不少。关于这个Silverlight下可用的RSA算法的具体实现，记录在下面，欢迎大家拍砖。</p>
<p>RSA算法实现主要分为三部分：包括公钥和私钥的产生，非对称加密和解密，数字签名和验证，下面将逐个介绍RSA算法的工作原理及我的实现方法。</p>
<p><strong> </strong><strong> 1，公钥和私钥的产生</strong></p>
<p>    随意选择两个大素数p、q，p不等于q，计算n = p * q。<br />
    随机选择一个整数e，满足e和( p – 1 ) * ( q – 1 )互质。(注：e很容易选择，如3, 17, 65537等都可以。.NET Framework中e默认选择的就是65537)<br />
利用Euclid算法计算解密密钥d,满足<br />
      e * d ≡ 1 ( mod ( p &#8211; 1 ) * ( q &#8211; 1 ) )<br />
    其中n和d也要互质。</p>
<p>    其中e和n就是公钥，d和n就是私钥。P、q销毁。</p>
<p>在.NET Framework的RSA算法中，e对应RSAParameters.Exponent；d对应RSAParameters.D；n对应RSAParameters.ModulusExponent。.NET Framework中的RSA算法默认使用1024位长的密钥。公钥和私钥是利用.NET Framework的RSACryptoServiceProvider生成公钥xml文件和私钥xml文件来实现的。生成公钥和私钥xml文件的程序本身不是Silverlight程序。<span id="more-589"></span></p>
<p>RSACryptoServiceProvider rsa <span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> RSACryptoServiceProvider();</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">生成公钥XML字符串</span><span style="COLOR: #008000"><br />
</span><span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000"> publicKeyXmlString </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> rsa.ToXmlString(</span><span style="COLOR: #0000ff">false</span><span style="COLOR: #000000">);</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">生成私钥XML字符串</span><span style="COLOR: #008000"><br />
</span><span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000"> privateKeyXmlString </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> rsa.ToXmlString(</span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">);</span></p>
<p>    </p>
<p>    </p>
<p><span style="COLOR: #000000">公钥和私钥将从生成的公钥xml文件和私钥xml文件中导入。</span></p>
<p><span style="COLOR: #000000">public<span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> RSAPublicKey<br />
    {<br />
        </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">byte</span><span style="COLOR: #000000">[] Modulus;<br />
        </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">byte</span><span style="COLOR: #000000">[] Exponent;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000"> RSAPublicKey FromXmlString(</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000"> xmlString)<br />
        {<br />
            </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">.IsNullOrEmpty(xmlString))<br />
            {<br />
                </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">;<br />
            }</span><span style="COLOR: #0000ff">try</span><span style="COLOR: #000000"><br />
            {<br />
                </span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000"> (XmlReader reader </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> XmlReader.Create(</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> StringReader(xmlString)))<br />
                {<br />
                    </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (</span><span style="COLOR: #000000">!</span><span style="COLOR: #000000">reader.ReadToFollowing(</span><span style="COLOR: #800000">&#8220;</span><span style="COLOR: #800000">RSAKeyValue</span><span style="COLOR: #800000">&#8220;</span><span style="COLOR: #000000">))<br />
                    {<br />
                        </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">;<br />
                    }</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (reader.LocalName </span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000"> </span><span style="COLOR: #800000">&#8220;</span><span style="COLOR: #800000">Modulus</span><span style="COLOR: #800000">&#8220;</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">&amp;&amp;</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">!</span><span style="COLOR: #000000">reader.ReadToFollowing(</span><span style="COLOR: #800000">&#8220;</span><span style="COLOR: #800000">Modulus</span><span style="COLOR: #800000">&#8220;</span><span style="COLOR: #000000">))<br />
                    {<br />
                        </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">;<br />
                    }<br />
                    </span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000"> modulus </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> reader.ReadElementContentAsString();</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (reader.LocalName </span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000"> </span><span style="COLOR: #800000">&#8220;</span><span style="COLOR: #800000">Exponent</span><span style="COLOR: #800000">&#8220;</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">&amp;&amp;</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">!</span><span style="COLOR: #000000">reader.ReadToFollowing(</span><span style="COLOR: #800000">&#8220;</span><span style="COLOR: #800000">Exponent</span><span style="COLOR: #800000">&#8220;</span><span style="COLOR: #000000">))<br />
                    {<br />
                        </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">;<br />
                    }<br />
                    </span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000"> exponent </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> reader.ReadElementContentAsString();</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> RSAPublicKey();<br />
                    publicKey.Modulus </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> Convert.FromBase64String(modulus);<br />
                    publicKey.Exponent </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> Convert.FromBase64String(exponent);</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> publicKey;<br />
                }<br />
            }<br />
            </span><span style="COLOR: #0000ff">catch</span><span style="COLOR: #000000"><br />
            {<br />
                </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">;<br />
            }<br />
        }        <br />
    }</span></span></p>
<p>        </p>
<p>            </p>
<p>                    </p>
<p>                    </p>
<p>                    RSAPublicKey publicKey </p>
<p>                    </p>
<p><span style="COLOR: #000000"><span style="COLOR: #000000">public<span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> RSAPrivateKey<br />
    {<br />
        </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">byte</span><span style="COLOR: #000000">[] Modulus;<br />
        </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">byte</span><span style="COLOR: #000000">[] D;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000"> RSAPrivateKey FromXmlString(</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000"> xmlString)<br />
        {<br />
            </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">.IsNullOrEmpty(xmlString))<br />
            {<br />
                </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">;<br />
            }</span><span style="COLOR: #0000ff">try</span><span style="COLOR: #000000"><br />
            {<br />
                </span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000"> (XmlReader reader </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> XmlReader.Create(</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> StringReader(xmlString)))<br />
                {<br />
                    </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (</span><span style="COLOR: #000000">!</span><span style="COLOR: #000000">reader.ReadToFollowing(</span><span style="COLOR: #800000">&#8220;</span><span style="COLOR: #800000">RSAKeyValue</span><span style="COLOR: #800000">&#8220;</span><span style="COLOR: #000000">))<br />
                    {<br />
                        </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">;<br />
                    }</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (reader.LocalName </span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000"> </span><span style="COLOR: #800000">&#8220;</span><span style="COLOR: #800000">Modulus</span><span style="COLOR: #800000">&#8220;</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">&amp;&amp;</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">!</span><span style="COLOR: #000000">reader.ReadToFollowing(</span><span style="COLOR: #800000">&#8220;</span><span style="COLOR: #800000">Modulus</span><span style="COLOR: #800000">&#8220;</span><span style="COLOR: #000000">))<br />
                    {<br />
                        </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">;<br />
                    }<br />
                    </span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000"> modulus </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> reader.ReadElementContentAsString();</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (reader.LocalName </span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000"> </span><span style="COLOR: #800000">&#8220;</span><span style="COLOR: #800000">D</span><span style="COLOR: #800000">&#8220;</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">&amp;&amp;</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">!</span><span style="COLOR: #000000">reader.ReadToFollowing(</span><span style="COLOR: #800000">&#8220;</span><span style="COLOR: #800000">D</span><span style="COLOR: #800000">&#8220;</span><span style="COLOR: #000000">))<br />
                    {<br />
                        </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">;<br />
                    }<br />
                    </span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000"> d </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> reader.ReadElementContentAsString();</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> RSAPrivateKey();<br />
                    privateKey.Modulus </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> Convert.FromBase64String(modulus);<br />
                    privateKey.D </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> Convert.FromBase64String(d);</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> privateKey;<br />
                }<br />
            }<br />
            </span><span style="COLOR: #0000ff">catch</span><span style="COLOR: #000000"><br />
            {<br />
                </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">;<br />
            }<br />
        }        <br />
    }</span></span></span></p>
<p>        </p>
<p>            </p>
<p>                    </p>
<p>                    </p>
<p>                    RSAPrivateKey privateKey </p>
<p>                    </p>
<p><strong>2，非对称加密和解密</strong><br />
    私钥加密m（二进制表示）时，首先把m分成长s的数据块 m1, m2 &#8230; mi，其中 2^s &lt;= n, s 尽可能的大。执行如下计算：<br />
        ci = mi ^ d (mod n)<br />
    公钥解密c（二进制表示）时，也需要将c分成长s的数据块c1, c2 &#8230; ci，执行如下计算：<br />
        mi = ci ^ e (mod n)</p>
<p>    在某些情况下，也会使用公钥加密-&gt;私钥解密。原理和私钥加密-&gt;公钥解密一样。下面是私钥计算和公钥计算的算法。其中利用到了Chew Keong TAN的<a href="http://www.codeproject.com/KB/cs/biginteger.aspx" target="_blank">BigInteger</a>类。.NET Framework 4中提供的BigInteger.ModPow方法好像有问题。 </p>
<p><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">byte</span><span style="COLOR: #000000">[] Compute(</span><span style="COLOR: #0000ff">byte</span><span style="COLOR: #000000">[] data, RSAPublicKey publicKey, </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> blockSize)<br />
        {<br />
            </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"><br />
            </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 公钥加密/解密公式为：ci = mi^e ( mod n )            <br />
            </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> <br />
            </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 先将 m（二进制表示）分成数据块 m1, m2, &#8230;, mi ，然后进行运算。<br />
            </span><span style="COLOR: #008000">//<br />
</span><span style="COLOR: #000000">            BigInteger e </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> BigInteger(publicKey.Exponent);<br />
            BigInteger n </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> BigInteger(publicKey.Modulus);</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> blockOffset </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #800080">0</span><span style="COLOR: #000000">;<br />
            </span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000"> (MemoryStream stream </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> MemoryStream())<br />
            {<br />
                </span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000"> (blockOffset </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000"> data.Length)<br />
                {<br />
                    </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> blockLen </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> Math.Min(blockSize, data.Length </span><span style="COLOR: #000000">-</span><span style="COLOR: #000000"> blockOffset);<br />
                    </span><span style="COLOR: #0000ff">byte</span><span style="COLOR: #000000">[] blockData </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">byte</span><span style="COLOR: #000000">[blockLen];<br />
                    Buffer.BlockCopy(data, blockOffset, blockData, </span><span style="COLOR: #800080">0</span><span style="COLOR: #000000">, blockLen);</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> BigInteger(blockData);<br />
                    BigInteger ci </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> mi.modPow(e, n);</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">ci = mi^e ( mod n )</span><span style="COLOR: #008000"><br />
</span><span style="COLOR: #000000"><br />
                    </span><span style="COLOR: #0000ff">byte</span><span style="COLOR: #000000">[] block </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> ci.getBytes();<br />
                    stream.Write(block, </span><span style="COLOR: #800080">0</span><span style="COLOR: #000000">, block.Length);<br />
                    blockOffset </span><span style="COLOR: #000000">+=</span><span style="COLOR: #000000"> blockLen;<br />
                }</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> stream.ToArray();<br />
            }<br />
        }</span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">byte</span><span style="COLOR: #000000">[] Compute(</span><span style="COLOR: #0000ff">byte</span><span style="COLOR: #000000">[] data, RSAPrivateKey privateKey, </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> blockSize)<br />
        {<br />
            </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"><br />
            </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 私钥加密/解密公式为：mi = ci^d ( mod n )<br />
            </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> <br />
            </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 先将 c（二进制表示）分成数据块 c1, c2, &#8230;, ci ，然后进行运算。            <br />
            </span><span style="COLOR: #008000">//<br />
</span><span style="COLOR: #000000">            BigInteger d </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> BigInteger(privateKey.D);<br />
            BigInteger n </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> BigInteger(privateKey.Modulus);</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> blockOffset </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #800080">0</span><span style="COLOR: #000000">;</span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000"> (MemoryStream stream </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> MemoryStream())<br />
            {<br />
                </span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000"> (blockOffset </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000"> data.Length)<br />
                {<br />
                    </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> blockLen </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> Math.Min(blockSize, data.Length </span><span style="COLOR: #000000">-</span><span style="COLOR: #000000"> blockOffset);<br />
                    </span><span style="COLOR: #0000ff">byte</span><span style="COLOR: #000000">[] blockData </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">byte</span><span style="COLOR: #000000">[blockLen];<br />
                    Buffer.BlockCopy(data, blockOffset, blockData, </span><span style="COLOR: #800080">0</span><span style="COLOR: #000000">, blockLen);</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> BigInteger(blockData);<br />
                    BigInteger mi </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> ci.modPow(d, n);</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">mi = ci^d ( mod n )</span><span style="COLOR: #008000"><br />
</span><span style="COLOR: #000000"><br />
                    </span><span style="COLOR: #0000ff">byte</span><span style="COLOR: #000000">[] block </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> mi.getBytes();<br />
                    stream.Write(block, </span><span style="COLOR: #800080">0</span><span style="COLOR: #000000">, block.Length);<br />
                    blockOffset </span><span style="COLOR: #000000">+=</span><span style="COLOR: #000000"> blockLen;<br />
                }</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> stream.ToArray();<br />
            }<br />
        }</span></p>
<p>            </p>
<p>                    BigInteger mi </p>
<p>                </p>
<p>        </p>
<p>            </p>
<p>            </p>
<p>                    BigInteger ci </p>
<p>                </p>
<p><span style="COLOR: #000000">下面是私钥加密-&gt;公钥解密的实现。</span></p>
<p><span style="COLOR: #000000"><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">byte</span><span style="COLOR: #000000">[] Encrypt(</span><span style="COLOR: #0000ff">byte</span><span style="COLOR: #000000">[] data, RSAPublicKey publicKey)<br />
        {<br />
            </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (data </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">)<br />
            {<br />
                </span><span style="COLOR: #0000ff">throw</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> ArgumentNullException(</span><span style="COLOR: #800000">&#8220;</span><span style="COLOR: #800000">data</span><span style="COLOR: #800000">&#8220;</span><span style="COLOR: #000000">);<br />
            }</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (publicKey </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">)<br />
            {<br />
                </span><span style="COLOR: #0000ff">throw</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> ArgumentNullException(</span><span style="COLOR: #800000">&#8220;</span><span style="COLOR: #800000">publicKey</span><span style="COLOR: #800000">&#8220;</span><span style="COLOR: #000000">);<br />
            }</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> blockSize </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> publicKey.Modulus.Length </span><span style="COLOR: #000000">-</span><span style="COLOR: #000000"> </span><span style="COLOR: #800080">1</span><span style="COLOR: #000000">;<br />
            </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> Compute(data, publicKey, blockSize);<br />
        }</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">byte</span><span style="COLOR: #000000">[] Decrypt(</span><span style="COLOR: #0000ff">byte</span><span style="COLOR: #000000">[] data, RSAPrivateKey privateKey)<br />
        {<br />
            </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (data </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">)<br />
            {<br />
                </span><span style="COLOR: #0000ff">throw</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> ArgumentNullException(</span><span style="COLOR: #800000">&#8220;</span><span style="COLOR: #800000">data</span><span style="COLOR: #800000">&#8220;</span><span style="COLOR: #000000">);<br />
            }</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (privateKey </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">)<br />
            {<br />
                </span><span style="COLOR: #0000ff">throw</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> ArgumentNullException(</span><span style="COLOR: #800000">&#8220;</span><span style="COLOR: #800000">privateKey</span><span style="COLOR: #800000">&#8220;</span><span style="COLOR: #000000">);<br />
            }</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> blockSize </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> privateKey.Modulus.Length;<br />
            </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> Compute(data, privateKey, blockSize);<br />
        }</span></span></p>
<p>            </p>
<p>            </p>
<p>        </p>
<p>            </p>
<p>            </p>
<p><span style="COLOR: #000000"><span style="COLOR: #000000">下面是公钥加密-&gt;私钥解密的实现。</span></span></p>
<p><span style="COLOR: #000000"><span style="COLOR: #000000"><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">byte</span><span style="COLOR: #000000">[] Encrypt(</span><span style="COLOR: #0000ff">byte</span><span style="COLOR: #000000">[] data, RSAPrivateKey privateKey)<br />
        {<br />
            </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (data </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">)<br />
            {<br />
                </span><span style="COLOR: #0000ff">throw</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> ArgumentNullException(</span><span style="COLOR: #800000">&#8220;</span><span style="COLOR: #800000">data</span><span style="COLOR: #800000">&#8220;</span><span style="COLOR: #000000">);<br />
            }</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (privateKey </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">)<br />
            {<br />
                </span><span style="COLOR: #0000ff">throw</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> ArgumentNullException(</span><span style="COLOR: #800000">&#8220;</span><span style="COLOR: #800000">privateKey</span><span style="COLOR: #800000">&#8220;</span><span style="COLOR: #000000">);<br />
            }</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> blockSize </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> privateKey.Modulus.Length </span><span style="COLOR: #000000">-</span><span style="COLOR: #000000"> </span><span style="COLOR: #800080">1</span><span style="COLOR: #000000">;<br />
            </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> Compute(data, privateKey, blockSize);<br />
        }</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">byte</span><span style="COLOR: #000000">[] Decrypt(</span><span style="COLOR: #0000ff">byte</span><span style="COLOR: #000000">[] data, RSAPublicKey publicKey)<br />
        {<br />
            </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (data </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">)<br />
            {<br />
                </span><span style="COLOR: #0000ff">throw</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> ArgumentNullException(</span><span style="COLOR: #800000">&#8220;</span><span style="COLOR: #800000">data</span><span style="COLOR: #800000">&#8220;</span><span style="COLOR: #000000">);<br />
            }</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (publicKey </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">)<br />
            {<br />
                </span><span style="COLOR: #0000ff">throw</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> ArgumentNullException(</span><span style="COLOR: #800000">&#8220;</span><span style="COLOR: #800000">publicKey</span><span style="COLOR: #800000">&#8220;</span><span style="COLOR: #000000">);<br />
            }</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> blockSize </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> publicKey.Modulus.Length;<br />
            </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> Compute(data, publicKey, blockSize);<br />
        }</span></span></span></p>
<p>            </p>
<p>            </p>
<p>        </p>
<p>            </p>
<p>            </p>
<p>    <strong>3，数字签名和验证<br />
</strong>    私钥签名数据m时，先对m进行hash计算，得到计算结果h。然后将h使用私钥加密，得到加密后的密文s即为签名。<br />
    公钥验证签名s时，先将m进行hash计算，得到计算结果h。然后使用公钥解密s得到结果h’。如果h==h’即验证成功，否则验证失败。</p>
<p>    在某些情况下，也会使用公钥签名-&gt;私钥验证。原理和私钥签名-&gt;公钥验证一样。</p>
<p>    下面是私钥签名-&gt;公钥验证的实现。 </p>
<p><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">byte</span><span style="COLOR: #000000">[] Sign(</span><span style="COLOR: #0000ff">byte</span><span style="COLOR: #000000">[] data, RSAPublicKey publicKey, HashAlgorithm hash)<br />
        {<br />
            </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (data </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">)<br />
            {<br />
                </span><span style="COLOR: #0000ff">throw</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> ArgumentNullException(</span><span style="COLOR: #800000">&#8220;</span><span style="COLOR: #800000">data</span><span style="COLOR: #800000">&#8220;</span><span style="COLOR: #000000">);<br />
            }</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (publicKey </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">)<br />
            {<br />
                </span><span style="COLOR: #0000ff">throw</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> ArgumentNullException(</span><span style="COLOR: #800000">&#8220;</span><span style="COLOR: #800000">publicKey</span><span style="COLOR: #800000">&#8220;</span><span style="COLOR: #000000">);<br />
            }</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (hash </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">)<br />
            {<br />
                </span><span style="COLOR: #0000ff">throw</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> ArgumentNullException(</span><span style="COLOR: #800000">&#8220;</span><span style="COLOR: #800000">hash</span><span style="COLOR: #800000">&#8220;</span><span style="COLOR: #000000">);<br />
            }</span><span style="COLOR: #0000ff">byte</span><span style="COLOR: #000000">[] hashData </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> hash.ComputeHash(data);<br />
            </span><span style="COLOR: #0000ff">byte</span><span style="COLOR: #000000">[] signature </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> Encrypt(hashData, publicKey);<br />
            </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> signature;<br />
        }</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">bool</span><span style="COLOR: #000000"> Verify(</span><span style="COLOR: #0000ff">byte</span><span style="COLOR: #000000">[] data, RSAPrivateKey privateKey, HashAlgorithm hash, </span><span style="COLOR: #0000ff">byte</span><span style="COLOR: #000000">[] signature)<br />
        {<br />
            </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (data </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">)<br />
            {<br />
                </span><span style="COLOR: #0000ff">throw</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> ArgumentNullException(</span><span style="COLOR: #800000">&#8220;</span><span style="COLOR: #800000">data</span><span style="COLOR: #800000">&#8220;</span><span style="COLOR: #000000">);<br />
            }</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (privateKey </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">)<br />
            {<br />
                </span><span style="COLOR: #0000ff">throw</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> ArgumentNullException(</span><span style="COLOR: #800000">&#8220;</span><span style="COLOR: #800000">privateKey</span><span style="COLOR: #800000">&#8220;</span><span style="COLOR: #000000">);<br />
            }</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (hash </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">)<br />
            {<br />
                </span><span style="COLOR: #0000ff">throw</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> ArgumentNullException(</span><span style="COLOR: #800000">&#8220;</span><span style="COLOR: #800000">hash</span><span style="COLOR: #800000">&#8220;</span><span style="COLOR: #000000">);<br />
            }</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (signature </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">)<br />
            {<br />
                </span><span style="COLOR: #0000ff">throw</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> ArgumentNullException(</span><span style="COLOR: #800000">&#8220;</span><span style="COLOR: #800000">signature</span><span style="COLOR: #800000">&#8220;</span><span style="COLOR: #000000">);<br />
            }</span><span style="COLOR: #0000ff">byte</span><span style="COLOR: #000000">[] hashData </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> hash.ComputeHash(data);<br />
            </span><span style="COLOR: #0000ff">byte</span><span style="COLOR: #000000">[] signatureHashData </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> Decrypt(signature, privateKey);</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (signatureHashData </span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">&amp;&amp;</span><span style="COLOR: #000000"> signatureHashData.Length </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000"> hashData.Length)<br />
            {<br />
                </span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000"> (</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> i </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #800080">0</span><span style="COLOR: #000000">; i </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000"> signatureHashData.Length; i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)<br />
                {<br />
                    </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (signatureHashData[i] </span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000"> hashData[i])<br />
                    {<br />
                        </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">false</span><span style="COLOR: #000000">;<br />
                    }<br />
                }<br />
                </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">;<br />
            }</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">false</span><span style="COLOR: #000000">;<br />
        }</span></p>
<p>            </p>
<p>            </p>
<p>            </p>
<p>        </p>
<p>            </p>
<p>            </p>
<p>            </p>
<p>            </p>
<p>            </p>
<p>            </p>
<p><span style="COLOR: #000000">下面是公钥签名-&gt;私钥验证的实现。</span></p>
<p><span style="COLOR: #000000"><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">byte</span><span style="COLOR: #000000">[] Sign(</span><span style="COLOR: #0000ff">byte</span><span style="COLOR: #000000">[] data, RSAPrivateKey privateKey, HashAlgorithm hash)<br />
        {<br />
            </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (data </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">)<br />
            {<br />
                </span><span style="COLOR: #0000ff">throw</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> ArgumentNullException(</span><span style="COLOR: #800000">&#8220;</span><span style="COLOR: #800000">data</span><span style="COLOR: #800000">&#8220;</span><span style="COLOR: #000000">);<br />
            }</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (privateKey </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">)<br />
            {<br />
                </span><span style="COLOR: #0000ff">throw</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> ArgumentNullException(</span><span style="COLOR: #800000">&#8220;</span><span style="COLOR: #800000">privateKey</span><span style="COLOR: #800000">&#8220;</span><span style="COLOR: #000000">);<br />
            }</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (hash </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">)<br />
            {<br />
                </span><span style="COLOR: #0000ff">throw</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> ArgumentNullException(</span><span style="COLOR: #800000">&#8220;</span><span style="COLOR: #800000">hash</span><span style="COLOR: #800000">&#8220;</span><span style="COLOR: #000000">);<br />
            }</span><span style="COLOR: #0000ff">byte</span><span style="COLOR: #000000">[] hashData </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> hash.ComputeHash(data);<br />
            </span><span style="COLOR: #0000ff">byte</span><span style="COLOR: #000000">[] signature </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> Encrypt(hashData, privateKey);<br />
            </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> signature;<br />
        }</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">bool</span><span style="COLOR: #000000"> Verify(</span><span style="COLOR: #0000ff">byte</span><span style="COLOR: #000000">[] data, RSAPublicKey publicKey, HashAlgorithm hash, </span><span style="COLOR: #0000ff">byte</span><span style="COLOR: #000000">[] signature)<br />
        {<br />
            </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (data </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">)<br />
            {<br />
                </span><span style="COLOR: #0000ff">throw</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> ArgumentNullException(</span><span style="COLOR: #800000">&#8220;</span><span style="COLOR: #800000">data</span><span style="COLOR: #800000">&#8220;</span><span style="COLOR: #000000">);<br />
            }</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (publicKey </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">)<br />
            {<br />
                </span><span style="COLOR: #0000ff">throw</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> ArgumentNullException(</span><span style="COLOR: #800000">&#8220;</span><span style="COLOR: #800000">publicKey</span><span style="COLOR: #800000">&#8220;</span><span style="COLOR: #000000">);<br />
            }</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (hash </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">)<br />
            {<br />
                </span><span style="COLOR: #0000ff">throw</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> ArgumentNullException(</span><span style="COLOR: #800000">&#8220;</span><span style="COLOR: #800000">hash</span><span style="COLOR: #800000">&#8220;</span><span style="COLOR: #000000">);<br />
            }</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (signature </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">)<br />
            {<br />
                </span><span style="COLOR: #0000ff">throw</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> ArgumentNullException(</span><span style="COLOR: #800000">&#8220;</span><span style="COLOR: #800000">signature</span><span style="COLOR: #800000">&#8220;</span><span style="COLOR: #000000">);<br />
            }</span><span style="COLOR: #0000ff">byte</span><span style="COLOR: #000000">[] hashData </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> hash.ComputeHash(data);</span><span style="COLOR: #0000ff">byte</span><span style="COLOR: #000000">[] signatureHashData </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> Decrypt(signature, publicKey);</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (signatureHashData </span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">&amp;&amp;</span><span style="COLOR: #000000"> signatureHashData.Length </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000"> hashData.Length)<br />
            {<br />
                </span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000"> (</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> i </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #800080">0</span><span style="COLOR: #000000">; i </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000"> signatureHashData.Length; i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)<br />
                {<br />
                    </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (signatureHashData[i] </span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000"> hashData[i])<br />
                    {<br />
                        </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">false</span><span style="COLOR: #000000">;<br />
                    }<br />
                }<br />
                </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">;<br />
            }</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">false</span><span style="COLOR: #000000">;<br />
        }</span></span></p>
<p>            </p>
<p>            </p>
<p>            </p>
<p>        </p>
<p>            </p>
<p>            </p>
<p>            </p>
<p>            </p>
<p>            </p>
<p>            </p>
<p>            </p>
<p>  </p>
<div id="license_information"><a rel="license" href="http://creativecommons.org/licenses/by/2.5/cn/" target="_blank"><img style="BORDER-RIGHT-WIDTH: 0pt; BORDER-TOP-WIDTH: 0pt; BORDER-BOTTOM-WIDTH: 0pt; BORDER-LEFT-WIDTH: 0pt" src="http://i.creativecommons.org/l/by/2.5/cn/88x31.png" alt="Creative Commons License" align="left" /></a>本文基于<a title="Creative Commons Attribution 2.5 China Mainland License" href="http://creativecommons.org/licenses/by/2.5/cn/" target="_blank">署名 2.5 中国大陆</a>许可协议发布，欢迎转载，演绎或用于商业目的，但是必须保留本文的署名<a href="http://www.cnblogs.com/KevinShan/" target="_blank">KevinShan</a>（包含链接）。如您有任何疑问或者授权方面的协商，请<a href="http://space.cnblogs.com/msg/send/KevinShan" target="_blank">给我留言</a>。</div>
<p>  </p>
<p>源代码下载：</p>
<p> <a href="http://files.cnblogs.com/kevinShan/RSAManaged.zip" target="_blank">RSAManaged.zip</a></p>
<p> </p>
<div id="MySignature">
<p><a href="http://kevinshan.cnblogs.com/">KevinShan</a><br />
<a href="mailto:txhak@163.com">mailto:txhak@163.com</a></div>


<p>Related posts:<ol><li><a href='http://cq-cser.cn/2010/02/c-java-php%e7%9a%84rsa/' rel='bookmark' title='Permanent Link: C# java php的RSA'>C# java php的RSA</a></li>
<li><a href='http://cq-cser.cn/2010/03/csilverlight-md5/' rel='bookmark' title='Permanent Link: C#的加密解密算法，包括Silverlight的MD5算法'>C#的加密解密算法，包括Silverlight的MD5算法</a></li>
<li><a href='http://cq-cser.cn/2009/12/des%e5%8a%a0%e5%af%86%e8%a7%a3%e5%af%86%e5%87%bd%e6%95%b0-%e6%94%b6%e8%97%8f-c/' rel='bookmark' title='Permanent Link: DES加密解密函数 收藏 c#'>DES加密解密函数 收藏 c#</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://cq-cser.cn/2010/01/silverlight-rsa/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>跟老外学Silverlight游戏 之四 粒子特效</title>
		<link>http://cq-cser.cn/2010/01/silverlight-game/</link>
		<comments>http://cq-cser.cn/2010/01/silverlight-game/#comments</comments>
		<pubDate>Sat, 02 Jan 2010 12:49:57 +0000</pubDate>
		<dc:creator>cq</dc:creator>
				<category><![CDATA[Silverlight]]></category>
		<category><![CDATA[WEB]]></category>
		<category><![CDATA[c#]]></category>
		<category><![CDATA[game]]></category>

		<guid isPermaLink="false">http://cq-cser.cn/?p=552</guid>
		<description><![CDATA[       前几篇一直在Blend中工作没体现出开发者的作用，本篇将为订书器（Stapler）添加自定义粒子效果，当订书器被点击时产生更好的视觉效果。其中将使用到nerdplusart 的Silverlight Particle Generator 粒子特效工具。 在结束本章内容后，点击Stapler 和Candies 将达到以下效果：     1. 在Projects面板中新增Interactivity 文件夹，再为Interactivity 新增ParticlesBehavior 子文件夹：     2. 右键ParticlesBehavior文件夹-&#62;Add New Item-&#62;Behavior，添加ParticlesBehavior：   3. 下载Silverlight Particle Generator 源代码，将代码中的ParticleControl.xaml 和ParticleControl.xaml.cs 文件加入（Add Existing Item）到ParticlesBehavior 文件夹：     4. 右键项目点击“Edit in Visual Studio”，对PaticlesBehavior.cs进行编辑来跟踪鼠标移动位置。将ParticlesBehavior 类声明改为Behavior&#60;Canvas&#62;，通过修改后AssociatedObject 类型将成为Canvas。在OnAttached 和OnDetaching 方法中分别添加和删除MouseMove 事件，当鼠标移动时便可记录下当前鼠标位置： public class ParticlesBehavior : Behavior&#60;Canvas&#62; { private Point currentMousePosition; public [...]


Related posts:<ol><li><a href='http://cq-cser.cn/2010/04/sliverlight%e6%92%ad%e6%94%be%e5%99%a8%e6%8e%a7%e4%bb%b6/' rel='bookmark' title='Permanent Link: SLIVERLIGHT播放器控件'>SLIVERLIGHT播放器控件</a></li>
<li><a href='http://cq-cser.cn/2010/01/silverlight-game-3/' rel='bookmark' title='Permanent Link: 跟老外学Silverlight游戏 之三 消除名单'>跟老外学Silverlight游戏 之三 消除名单</a></li>
<li><a href='http://cq-cser.cn/2010/01/silverlight-game-1/' rel='bookmark' title='Permanent Link: 跟老外学Silverlight游戏 之一 新建项目'>跟老外学Silverlight游戏 之一 新建项目</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<div>
<p>       前几篇一直在Blend中工作没体现出开发者的作用，本篇将为订书器（Stapler）添加自定义粒子效果，当订书器被点击时产生更好的视觉效果。其中将使用到<a onclick="javascript:pageTracker._trackPageview('/outbound/article/blog.nerdplusart.com');" href="http://blog.nerdplusart.com/"><span style="color: #0052a3;">nerdplusart</span></a> 的<a onclick="javascript:pageTracker._trackPageview('/outbound/article/blog.nerdplusart.com');" href="http://blog.nerdplusart.com/archives/silverlight-particle-generator"><span style="color: #0052a3;">Silverlight Particle Generator</span></a> 粒子特效工具。</p>
<p>在结束本章内容后，点击Stapler 和Candies 将达到以下效果：<span id="more-552"></span></p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="100%" height="450" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><embed type="application/x-shockwave-flash" width="100%" height="450"></embed></object> </p>
<p> </p>
<p><em><span style="font-size: large;">1</span></em>. 在Projects面板中新增<strong>Interactivity</strong> 文件夹，再为Interactivity 新增<strong>ParticlesBehavior</strong> 子文件夹：</p>
<p><a href="http://images.cnblogs.com/cnblogs_com/gnielee/WindowsLiveWriter/Silverlight_B4F4/folder.png"><img style="display: inline; border-width: 0px;" title="folder" src="http://images.cnblogs.com/cnblogs_com/gnielee/WindowsLiveWriter/Silverlight_B4F4/folder_thumb.png" border="0" alt="folder" width="312" height="225" /></a></p>
<p> </p>
<p> </p>
<p><em><span style="font-size: large;">2</span></em>. 右键ParticlesBehavior文件夹-&gt;Add New Item-&gt;Behavior，添加<strong>ParticlesBehavior</strong>：</p>
<p><a href="http://images.cnblogs.com/cnblogs_com/gnielee/WindowsLiveWriter/Silverlight_B4F4/newitem.png"><img style="display: inline; border-width: 0px;" title="newitem" src="http://images.cnblogs.com/cnblogs_com/gnielee/WindowsLiveWriter/Silverlight_B4F4/newitem_thumb.png" border="0" alt="newitem" width="396" height="429" /></a></p>
<p><a href="http://images.cnblogs.com/cnblogs_com/gnielee/WindowsLiveWriter/Silverlight_B4F4/itemlist.png"><img style="display: inline; border-width: 0px;" title="itemlist" src="http://images.cnblogs.com/cnblogs_com/gnielee/WindowsLiveWriter/Silverlight_B4F4/itemlist_thumb.png" border="0" alt="itemlist" width="311" height="230" /></a></p>
<p> </p>
<p><em><span style="font-size: large;">3</span></em>. <a href="http://files.cnblogs.com/gnielee/particles.zip" target="_blank">下载Silverlight Particle Generator 源代码</a>，将代码中的<strong>ParticleControl.xaml</strong> 和<strong>ParticleControl.xaml.cs</strong> 文件加入（Add Existing Item）到ParticlesBehavior 文件夹：</p>
<p> </p>
<p><a href="http://images.cnblogs.com/cnblogs_com/gnielee/WindowsLiveWriter/Silverlight_B4F4/file.png"><img style="display: inline; border-width: 0px;" title="file" src="http://images.cnblogs.com/cnblogs_com/gnielee/WindowsLiveWriter/Silverlight_B4F4/file_thumb.png" border="0" alt="file" width="313" height="226" /></a></p>
<p> </p>
<p><em><span style="font-size: large;">4</span></em>. 右键项目点击“Edit in Visual Studio”，对PaticlesBehavior.cs进行编辑来跟踪鼠标移动位置。将ParticlesBehavior 类声明改为Behavior&lt;Canvas&gt;，通过修改后AssociatedObject 类型将成为Canvas。在OnAttached 和OnDetaching 方法中分别添加和删除MouseMove 事件，当鼠标移动时便可记录下当前鼠标位置：</p>
<pre><span style="color: blue;">public class </span><span style="color: #2b91af;">ParticlesBehavior </span>: <span style="color: #2b91af;">Behavior</span>&lt;<span style="color: #2b91af;">Canvas</span>&gt;
{
   <span style="color: blue;">private </span><span style="color: #2b91af;">Point </span>currentMousePosition;

   <span style="color: blue;">public </span>ParticlesBehavior()
   {
      <span style="color: blue;">this</span>.ShowParticles = <span style="color: blue;">new </span><span style="color: #2b91af;">ActionCommand</span>(<span style="color: blue;">this</span>.OnShowParticles);
   }

   <span style="color: blue;">protected override void </span>OnAttached()
   {
      <span style="color: blue;">base</span>.OnAttached();
      AssociatedObject.MouseMove += <span style="color: blue;">new </span><span style="color: #2b91af;">MouseEventHandler</span>(AssociatedObject_MouseMove);
   }

   <span style="color: blue;">protected override void </span>OnDetaching()
   {
      <span style="color: blue;">base</span>.OnDetaching();
      AssociatedObject.MouseMove -= <span style="color: blue;">new </span><span style="color: #2b91af;">MouseEventHandler</span>(AssociatedObject_MouseMove);
   }

   <span style="color: blue;">void </span>AssociatedObject_MouseMove(<span style="color: blue;">object </span>sender, <span style="color: #2b91af;">MouseEventArgs </span>e)
   {
      currentMousePosition = e.GetPosition(<span style="color: blue;">null</span>);
   }

   <span style="color: blue;">public </span><span style="color: #2b91af;">ICommand </span>ShowParticles
   {
      <span style="color: blue;">get</span>;
      <span style="color: blue;">private set</span>;
   }

   <span style="color: blue;">private void </span>OnShowParticles()
   {
      <span style="color: #2b91af;">ParticleControl </span>p = <span style="color: blue;">new </span><span style="color: #2b91af;">ParticleControl</span>();
      p.OffsetX = currentMousePosition.X;
      p.OffsetY = currentMousePosition.Y;
      AssociatedObject.Children.Add(p);
   }
}</pre>
<p> </p>
<p><em><span style="font-size: large;">5</span></em>. VS里编译后回到Blend，在Assets-&gt;Behavior 中将会看到ParticlesBehavior 选项，将ParticlesBehavior 加入LayoutRoot中：</p>
<p><a href="http://images.cnblogs.com/cnblogs_com/gnielee/WindowsLiveWriter/Silverlight_B4F4/beh.png"><img style="display: inline; border-width: 0px;" title="beh" src="http://images.cnblogs.com/cnblogs_com/gnielee/WindowsLiveWriter/Silverlight_B4F4/beh_thumb.png" border="0" alt="beh" width="321" height="176" /></a></p>
<p>点击Triggers右侧的“+”按钮添加新EventTrigger；点击EventTrigger将SourceName设为<strong>staplerPath</strong>，EventName设为<strong>MouseLeftButtonDown</strong>；再次点击“+”为可为其他物品添加ParticlesBehavior特效。另，在ParticlesBehavior.cs中增加一些代码，便可出现下图中Particles Properties设置窗口（详情可下载源代码）：</p>
<p><a href="http://images.cnblogs.com/cnblogs_com/gnielee/WindowsLiveWriter/Silverlight_B4F4/setting.png"><img style="display: inline; border-width: 0px;" title="setting" src="http://images.cnblogs.com/cnblogs_com/gnielee/WindowsLiveWriter/Silverlight_B4F4/setting_thumb.png" border="0" alt="setting" width="307" height="565" /></a></p>
<p> </p>
<p> </p>
<p><em><span style="font-size: large;">6</span></em>. 在Blend中F5，点击图片中的订书器（Stapler）便会出现粒子效果（但其不会自动消失），再点击Candies也会出现粒子效果，问题是所有的粒子效果仍然不能消失。打开ParticleControl.xaml.cs 进行编辑： <br />
    a. 在ParticleControl 类中定义<strong>int</strong> 型<strong>totalParticlesCreated</strong><br />
    b. 将<strong>this.particles.Count</strong> 替换为<strong>totalParticlesCreated</strong> <br />
    c. 在<strong>SpawnParticle</strong>方法最后添加<strong>totalParticlesCreated++</strong><br />
至此粒子效果就会自动消失了。</p>
<p> </p>
<p><em><span style="font-size: large;">7</span></em>. 最后为staplerPath添加<strong>RemoveElementAction</strong>，目的是为了每个物品只能点击一次：</p>
<p><a href="http://images.cnblogs.com/cnblogs_com/gnielee/WindowsLiveWriter/Silverlight_B4F4/remove.png"><img style="display: inline; border: 0px;" title="remove" src="http://images.cnblogs.com/cnblogs_com/gnielee/WindowsLiveWriter/Silverlight_B4F4/remove_thumb.png" border="0" alt="remove" width="323" height="230" /></a></p>
<p><a href="http://images.cnblogs.com/cnblogs_com/gnielee/WindowsLiveWriter/Silverlight_B4F4/removelist.png"><img style="display: inline; border: 0px;" title="removelist" src="http://images.cnblogs.com/cnblogs_com/gnielee/WindowsLiveWriter/Silverlight_B4F4/removelist_thumb.png" border="0" alt="removelist" width="324" height="262" /></a></p>
<p>将SourceName 和TargetName 都设置为staplerPath，EventName依然为MouseLeftButtonDown：</p>
<p><a href="http://images.cnblogs.com/cnblogs_com/gnielee/WindowsLiveWriter/Silverlight_B4F4/removetrigger.png"><img style="display: inline; border: 0px;" title="removetrigger" src="http://images.cnblogs.com/cnblogs_com/gnielee/WindowsLiveWriter/Silverlight_B4F4/removetrigger_thumb.png" border="0" alt="removetrigger" width="292" height="193" /></a></p>
<p> </p>
<p>源代码下载：<a href="http://cid-c75f4e27adfe5bbc.skydrive.live.com/self.aspx/GnieTech/FindObject4.zip">http://cid-c75f4e27adfe5bbc.skydrive.live.com/self.aspx/GnieTech/FindObject4.zip</a></p>
<div id="MySignature">
<pre> 作者: Gnie
 出处: <a href="http://www.cnblogs.com/gnielee/">{GnieTech}</a> (http://www.cnblogs.com/gnielee/)
 版权声明: 本文的版权归作者与博客园共有。转载时须注明本文的详细链接，否则作者将保留追究其法律责任。</pre>
</div>
</div>


<p>Related posts:<ol><li><a href='http://cq-cser.cn/2010/04/sliverlight%e6%92%ad%e6%94%be%e5%99%a8%e6%8e%a7%e4%bb%b6/' rel='bookmark' title='Permanent Link: SLIVERLIGHT播放器控件'>SLIVERLIGHT播放器控件</a></li>
<li><a href='http://cq-cser.cn/2010/01/silverlight-game-3/' rel='bookmark' title='Permanent Link: 跟老外学Silverlight游戏 之三 消除名单'>跟老外学Silverlight游戏 之三 消除名单</a></li>
<li><a href='http://cq-cser.cn/2010/01/silverlight-game-1/' rel='bookmark' title='Permanent Link: 跟老外学Silverlight游戏 之一 新建项目'>跟老外学Silverlight游戏 之一 新建项目</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://cq-cser.cn/2010/01/silverlight-game/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>跟老外学Silverlight游戏 之三 消除名单</title>
		<link>http://cq-cser.cn/2010/01/silverlight-game-3/</link>
		<comments>http://cq-cser.cn/2010/01/silverlight-game-3/#comments</comments>
		<pubDate>Sat, 02 Jan 2010 06:40:08 +0000</pubDate>
		<dc:creator>cq</dc:creator>
				<category><![CDATA[Silverlight]]></category>
		<category><![CDATA[WEB]]></category>
		<category><![CDATA[c#]]></category>
		<category><![CDATA[game]]></category>

		<guid isPermaLink="false">http://cq-cser.cn/?p=538</guid>
		<description><![CDATA[       本篇将通过钢笔（Pen）工具为Office图片中的物品添加热点，当玩家找到图中物品时，通过ChangePropertyAction调整题板上的物品名称的不透明度（Opacity）。下文以订书器（Stapler）为例进行讲解。 先上个最终效果演示，点击图片中的“订书器”：     1. 滚动鼠标中键放大Office图片，用钢笔工具   在订书器（Stapler）上勾勒出一个区域，为了方便调整区域尺寸可调低Path的不透明度，区域尺寸完成后将Opacity改为0%（即该Path为不可见）：   2. 将Path-&#62;Name设为staplerPath，在TreeView中单击刚创建的staplerPath，在Assets中选择Behaviors为staplerPath添加ChangePropertyAction属性：   3. 进入ChangePropertyAction属性设置菜单，在TargetName处选择staplerText，将PropertyName设置为Opacity，Value设为40%：   4. 如果感觉设置不透明度效果仍然不够好，那么还可以为staplerPath添加PlaySoundAction属性（需要将magic_wand.mp3加入项目的Audio文件夹中）：               源代码下载（最好使用Blend 3）：http://cid-c75f4e27adfe5bbc.skydrive.live.com/self.aspx/GnieTech/FindObject3.zip  作者: Gnie  出处: {GnieTech} (http://www.cnblogs.com/gnielee/)  版权声明: 本文的版权归作者与博客园共有。转载时须注明本文的详细链接，否则作者将保留追究其法律责任。 Related posts:跟老外学Silverlight游戏 之四 粒子特效 跟老外学Silverlight游戏 之一 新建项目 跟老外学Silverlight游戏 之二 创建题板


Related posts:<ol><li><a href='http://cq-cser.cn/2010/01/silverlight-game/' rel='bookmark' title='Permanent Link: 跟老外学Silverlight游戏 之四 粒子特效'>跟老外学Silverlight游戏 之四 粒子特效</a></li>
<li><a href='http://cq-cser.cn/2010/01/silverlight-game-1/' rel='bookmark' title='Permanent Link: 跟老外学Silverlight游戏 之一 新建项目'>跟老外学Silverlight游戏 之一 新建项目</a></li>
<li><a href='http://cq-cser.cn/2010/01/silverlight-game-2/' rel='bookmark' title='Permanent Link: 跟老外学Silverlight游戏 之二 创建题板'>跟老外学Silverlight游戏 之二 创建题板</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<div>
<p>       本篇将通过钢笔（Pen）工具为Office图片中的物品添加热点，当玩家找到图中物品时，通过ChangePropertyAction调整题板上的物品名称的不透明度（Opacity）。下文以订书器（Stapler）为例进行讲解。</p>
<p>先上个最终效果演示，点击图片中的“订书器”：<span id="more-538"></span></p>
<p> </p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="100%" height="450" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><embed type="application/x-shockwave-flash" width="100%" height="450"></embed></object> </p>
<p><em><span style="font-size: large;">1</span></em>. 滚动鼠标中键放大Office图片，用钢笔工具 <a href="http://images.cnblogs.com/cnblogs_com/gnielee/WindowsLiveWriter/Silverlight_A59B/pen.png"><img style="display: inline; border-width: 0px;" title="pen" src="http://images.cnblogs.com/cnblogs_com/gnielee/WindowsLiveWriter/Silverlight_A59B/pen_thumb.png" border="0" alt="pen" width="39" height="42" /></a>  在<strong>订书器</strong>（Stapler）上勾勒出一个区域，为了方便调整区域尺寸可调低Path的不透明度，区域尺寸完成后将Opacity改为<strong>0%</strong>（即该Path为不可见）：</p>
<p><a href="http://images.cnblogs.com/cnblogs_com/gnielee/WindowsLiveWriter/Silverlight_A59B/straple.png"><img style="display: inline; border-width: 0px;" title="straple" src="http://images.cnblogs.com/cnblogs_com/gnielee/WindowsLiveWriter/Silverlight_A59B/straple_thumb.png" border="0" alt="straple" width="252" height="309" /></a></p>
<p> </p>
<p><em><span style="font-size: large;">2</span></em>. 将Path-&gt;Name设为staplerPath，在TreeView中单击刚创建的staplerPath，在Assets中选择Behaviors为staplerPath添加<strong>ChangePropertyAction</strong>属性：</p>
<p><a href="http://images.cnblogs.com/cnblogs_com/gnielee/WindowsLiveWriter/Silverlight_A59B/change.png"><img style="display: inline; border-width: 0px;" title="change" src="http://images.cnblogs.com/cnblogs_com/gnielee/WindowsLiveWriter/Silverlight_A59B/change_thumb.png" border="0" alt="change" width="341" height="229" /></a></p>
<p><a href="http://images.cnblogs.com/cnblogs_com/gnielee/WindowsLiveWriter/Silverlight_A59B/tree_1.png"><img style="display: inline; border-width: 0px;" title="tree" src="http://images.cnblogs.com/cnblogs_com/gnielee/WindowsLiveWriter/Silverlight_A59B/tree_thumb_1.png" border="0" alt="tree" width="342" height="160" /></a></p>
<p> </p>
<p><em><span style="font-size: large;">3</span></em>. 进入ChangePropertyAction属性设置菜单，在TargetName处选择<strong>staplerText</strong>，将PropertyName设置为<strong>Opacity</strong>，Value设为<strong>40%</strong>：</p>
<p><a href="http://images.cnblogs.com/cnblogs_com/gnielee/WindowsLiveWriter/Silverlight_A59B/changeproter.png"><img style="display: inline; border-width: 0px;" title="changeproter" src="http://images.cnblogs.com/cnblogs_com/gnielee/WindowsLiveWriter/Silverlight_A59B/changeproter_thumb.png" border="0" alt="changeproter" width="293" height="464" /></a></p>
<p> </p>
<p><em><span style="font-size: large;">4</span></em>. 如果感觉设置不透明度效果仍然不够好，那么还可以为staplerPath添加<strong>PlaySoundAction</strong>属性（需要将<strong>magic_wand.mp3</strong>加入项目的Audio文件夹中）：</p>
<p><a href="http://images.cnblogs.com/cnblogs_com/gnielee/WindowsLiveWriter/Silverlight_A59B/sound.png"><img style="display: inline; border-width: 0px;" title="sound" src="http://images.cnblogs.com/cnblogs_com/gnielee/WindowsLiveWriter/Silverlight_A59B/sound_thumb.png" border="0" alt="sound" width="351" height="321" /></a></p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p>源代码下载（最好使用Blend 3）：<a href="http://cid-c75f4e27adfe5bbc.skydrive.live.com/self.aspx/GnieTech/FindObject3.zip">http://cid-c75f4e27adfe5bbc.skydrive.live.com/self.aspx/GnieTech/FindObject3.zip</a></p>
<div id="MySignature">
<pre> 作者: Gnie
 出处: <a href="http://www.cnblogs.com/gnielee/">{GnieTech}</a> (http://www.cnblogs.com/gnielee/)
 版权声明: 本文的版权归作者与博客园共有。转载时须注明本文的详细链接，否则作者将保留追究其法律责任。</pre>
</div>
</div>


<p>Related posts:<ol><li><a href='http://cq-cser.cn/2010/01/silverlight-game/' rel='bookmark' title='Permanent Link: 跟老外学Silverlight游戏 之四 粒子特效'>跟老外学Silverlight游戏 之四 粒子特效</a></li>
<li><a href='http://cq-cser.cn/2010/01/silverlight-game-1/' rel='bookmark' title='Permanent Link: 跟老外学Silverlight游戏 之一 新建项目'>跟老外学Silverlight游戏 之一 新建项目</a></li>
<li><a href='http://cq-cser.cn/2010/01/silverlight-game-2/' rel='bookmark' title='Permanent Link: 跟老外学Silverlight游戏 之二 创建题板'>跟老外学Silverlight游戏 之二 创建题板</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://cq-cser.cn/2010/01/silverlight-game-3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>跟老外学Silverlight游戏 之一 新建项目</title>
		<link>http://cq-cser.cn/2010/01/silverlight-game-1/</link>
		<comments>http://cq-cser.cn/2010/01/silverlight-game-1/#comments</comments>
		<pubDate>Sat, 02 Jan 2010 06:35:34 +0000</pubDate>
		<dc:creator>cq</dc:creator>
				<category><![CDATA[Silverlight]]></category>
		<category><![CDATA[WEB]]></category>
		<category><![CDATA[c#]]></category>
		<category><![CDATA[其他]]></category>
		<category><![CDATA[game]]></category>

		<guid isPermaLink="false">http://cq-cser.cn/?p=533</guid>
		<description><![CDATA[对于国内玩家来说的有两个难点：1. 英文单词不认识，不知道要找的是什么物品。  2. 藏着物品的图片一般做的很复杂使人眼花缭乱。感觉这个游戏玩起来还是蛮有意思的，所以在学习的同时也分享给大家，有想在新年学Silverlight或Blend的童鞋可以一起学习一下了        该系列教程需要使用到以下工具： * Silverlight 3 Tools for Visual Studio 2008 SP1 下载 * Blend 3 * Silverlight Toolkit 下载 * Expression Blend 3 SDK 下载   1. 在Blend 3 中新建一个项目：FindObject   2. 图片的原始尺寸是800&#215;500，为了演示方便调整为560&#215;350，选择LayoutRoot将Layout背景色调暗，尺寸设为560&#215;450，类型设为Canvas。   3. 在项目中加入Office图片，将其拖拽到Canvas中并以顶对其。  作者: Gnie  出处: {GnieTech} (http://www.cnblogs.com/gnielee/)  版权声明: 本文的版权归作者与博客园共有。转载时须注明本文的详细链接，否则作者将保留追究其法律责任。 Related posts:跟老外学Silverlight游戏 之三 消除名单 跟老外学Silverlight游戏 之二 创建题板 跟老外学Silverlight游戏 [...]


Related posts:<ol><li><a href='http://cq-cser.cn/2010/01/silverlight-game-3/' rel='bookmark' title='Permanent Link: 跟老外学Silverlight游戏 之三 消除名单'>跟老外学Silverlight游戏 之三 消除名单</a></li>
<li><a href='http://cq-cser.cn/2010/01/silverlight-game-2/' rel='bookmark' title='Permanent Link: 跟老外学Silverlight游戏 之二 创建题板'>跟老外学Silverlight游戏 之二 创建题板</a></li>
<li><a href='http://cq-cser.cn/2010/01/silverlight-game/' rel='bookmark' title='Permanent Link: 跟老外学Silverlight游戏 之四 粒子特效'>跟老外学Silverlight游戏 之四 粒子特效</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>对于国内玩家来说的有两个难点：1. 英文单词不认识，不知道要找的是什么物品。  2. 藏着物品的图片一般做的很复杂使人眼花缭乱。感觉这个游戏玩起来还是蛮有意思的，所以在学习的同时也分享给大家，有想在新年学Silverlight或Blend的童鞋可以一起学习一下了</p>
<div>
<p>       该系列教程需要使用到以下工具：</p>
<p>* Silverlight 3 Tools for Visual Studio 2008 SP1 <a href="http://www.microsoft.com/downloads/details.aspx?displaylang=en&amp;FamilyID=c22d6a7b-546f-4407-8ef6-d60c8ee221ed" target="_blank">下载</a><br />
* Blend 3<br />
* Silverlight Toolkit <a href="http://go.microsoft.com/fwlink/?LinkId=167914" target="_blank">下载</a><br />
* Expression Blend 3 SDK <a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=F1AE9A30-4928-411D-970B-E682AB179E17&amp;displaylang=en" target="_blank">下载</a></p>
<p> <span id="more-533"></span></p>
<p><em><span style="font-size: large;">1</span></em>. 在Blend 3 中新建一个项目：<strong>FindObject</strong></p>
<p><a href="http://images.cnblogs.com/cnblogs_com/gnielee/WindowsLiveWriter/Silverlight_FFAC/newproject.png"><img style="display: inline; border-width: 0px;" title="newproject" src="http://images.cnblogs.com/cnblogs_com/gnielee/WindowsLiveWriter/Silverlight_FFAC/newproject_thumb.png" border="0" alt="newproject" width="420" height="340" /></a></p>
<p> </p>
<p><em><span style="font-size: large;">2</span></em>. 图片的原始尺寸是800&#215;500，为了演示方便调整为560&#215;350，选择LayoutRoot将Layout<strong>背景色调暗</strong>，尺寸设为<strong>560&#215;450</strong>，类型设为<strong>Canvas</strong>。</p>
<p><a href="http://images.cnblogs.com/cnblogs_com/gnielee/WindowsLiveWriter/Silverlight_FFAC/background.png"><img style="display: inline; border: 0px;" title="background" src="http://images.cnblogs.com/cnblogs_com/gnielee/WindowsLiveWriter/Silverlight_FFAC/background_thumb.png" border="0" alt="background" width="303" height="68" /></a></p>
<p><a href="http://images.cnblogs.com/cnblogs_com/gnielee/WindowsLiveWriter/Silverlight_FFAC/layout.png"><img style="display: inline; border-width: 0px;" title="layout" src="http://images.cnblogs.com/cnblogs_com/gnielee/WindowsLiveWriter/Silverlight_FFAC/layout_thumb.png" border="0" alt="layout" width="268" height="90" /></a></p>
<p><a href="http://images.cnblogs.com/cnblogs_com/gnielee/WindowsLiveWriter/Silverlight_FFAC/canvas.png"><img style="display: inline; border-width: 0px;" title="canvas" src="http://images.cnblogs.com/cnblogs_com/gnielee/WindowsLiveWriter/Silverlight_FFAC/canvas_thumb.png" border="0" alt="canvas" width="417" height="264" /></a></p>
<p> </p>
<p><span style="font-size: large;"><em>3</em></span>. 在项目中加入Office图片，将其拖拽到Canvas中并以顶对其。</p>
<p><a href="http://images.cnblogs.com/cnblogs_com/gnielee/WindowsLiveWriter/Silverlight_FFAC/image.png"><img style="display: inline; border-width: 0px;" title="image" src="http://images.cnblogs.com/cnblogs_com/gnielee/WindowsLiveWriter/Silverlight_FFAC/image_thumb.png" border="0" alt="image" width="234" height="187" /></a></p>
<p><a href="http://images.cnblogs.com/cnblogs_com/gnielee/WindowsLiveWriter/Silverlight_FFAC/office.png"><img style="display: inline; border-width: 0px;" title="office" src="http://images.cnblogs.com/cnblogs_com/gnielee/WindowsLiveWriter/Silverlight_FFAC/office_thumb.png" border="0" alt="office" width="497" height="378" /></a></p>
<div id="MySignature">
<pre> 作者: Gnie
 出处: <a href="http://www.cnblogs.com/gnielee/">{GnieTech}</a> (http://www.cnblogs.com/gnielee/)
 版权声明: 本文的版权归作者与博客园共有。转载时须注明本文的详细链接，否则作者将保留追究其法律责任。</pre>
</div>
</div>


<p>Related posts:<ol><li><a href='http://cq-cser.cn/2010/01/silverlight-game-3/' rel='bookmark' title='Permanent Link: 跟老外学Silverlight游戏 之三 消除名单'>跟老外学Silverlight游戏 之三 消除名单</a></li>
<li><a href='http://cq-cser.cn/2010/01/silverlight-game-2/' rel='bookmark' title='Permanent Link: 跟老外学Silverlight游戏 之二 创建题板'>跟老外学Silverlight游戏 之二 创建题板</a></li>
<li><a href='http://cq-cser.cn/2010/01/silverlight-game/' rel='bookmark' title='Permanent Link: 跟老外学Silverlight游戏 之四 粒子特效'>跟老外学Silverlight游戏 之四 粒子特效</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://cq-cser.cn/2010/01/silverlight-game-1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Silverlight版QQ初体验</title>
		<link>http://cq-cser.cn/2010/01/silverlight-qq/</link>
		<comments>http://cq-cser.cn/2010/01/silverlight-qq/#comments</comments>
		<pubDate>Sat, 02 Jan 2010 06:16:36 +0000</pubDate>
		<dc:creator>cq</dc:creator>
				<category><![CDATA[Silverlight]]></category>
		<category><![CDATA[WEB]]></category>
		<category><![CDATA[其他]]></category>
		<category><![CDATA[QQ]]></category>

		<guid isPermaLink="false">http://cq-cser.cn/?p=509</guid>
		<description><![CDATA[Silverlight版QQ初体验 2010年的第一天，腾讯发布了研发已久的 Silverlight QQ，超炫的界面让人喜欢，希望腾讯能一直以技术为路线，以用户体验为中心做好所有的产品。下面我带着大家一起来看看Silverlight QQ。 首先需要安装微软的Silverlight ，因为这个是基于Silverlight 的。安装好以后就出现Silverlight QQ的登陆界面  是不是很好看啊。由于目前还在测试阶段，所以同时只能5000人在线登陆，如果你在体验的时候登陆不上，多登陆几次可能就成功了。 下面的是登陆界面：   个人感觉背景再多一些东西就好看多了。 登陆后有2种模式选择，我就选择的推荐模式了。另外一个模式没测。 这个界面是不是很好看啊。 图标也挺不错的！ 聊天窗口偶就不贴图了，不然QQ号都漏出去了！ 这个东西确实不错，哈哈，大家也去体验吧！ 体验地址：http://slqq.qq.com/ Related posts:轻松建立Silverlight开发环境


Related posts:<ol><li><a href='http://cq-cser.cn/2009/12/%e8%bd%bb%e6%9d%be%e5%bb%ba%e7%ab%8bsilverlight%e5%bc%80%e5%8f%91%e7%8e%af%e5%a2%83/' rel='bookmark' title='Permanent Link: 轻松建立Silverlight开发环境'>轻松建立Silverlight开发环境</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p><a href="http://cq-cser.cn/wp-content/uploads/2010/01/21.jpg"></a></p>
<p><a href="http://cq-cser.cn/wp-content/uploads/2010/01/6.jpg"><img class="alignnone size-full wp-image-522" title="6" src="http://cq-cser.cn/wp-content/uploads/2010/01/6.jpg" alt="6" width="598" height="291" /></a></p>
<p>Silverlight版QQ初体验 2010年的第一天，腾讯发布了研发已久的 Silverlight QQ，超炫的界面让人喜欢，希望腾讯能一直以技术为路线，以用户体验为中心做好所有的产品。下面我带着大家一起来看看Silverlight QQ。 首先需要安装微软的Silverlight ，因为这个是基于Silverlight 的。安装好以后就出现Silverlight QQ的登陆界面<span id="more-509"></span><a href="http://cq-cser.cn/wp-content/uploads/2010/01/5.jpg"><img class="alignnone size-full wp-image-514" title="5" src="http://cq-cser.cn/wp-content/uploads/2010/01/5.jpg" alt="5" width="776" height="482" /></a></p>
<p> 是不是很好看啊。由于目前还在测试阶段，所以同时只能5000人在线登陆，如果你在体验的时候登陆不上，多登陆几次可能就成功了。 下面的是登陆界面：<a href="http://cq-cser.cn/wp-content/uploads/2010/01/21.jpg"><img title="2" src="http://cq-cser.cn/wp-content/uploads/2010/01/21.jpg" alt="2" width="641" height="331" /></a></p>
<p><a href="http://cq-cser.cn/wp-content/uploads/2010/01/4.jpg"><img class="alignnone size-full wp-image-518" title="4" src="http://cq-cser.cn/wp-content/uploads/2010/01/4.jpg" alt="4" width="857" height="370" /></a></p>
<p> <a href="http://cq-cser.cn/wp-content/uploads/2010/01/3.jpg"><img class="alignnone size-full wp-image-517" title="3" src="http://cq-cser.cn/wp-content/uploads/2010/01/3.jpg" alt="3" width="858" height="371" /></a><a href="http://cq-cser.cn/wp-content/uploads/2010/01/1.jpg"><img class="alignnone size-full wp-image-515" title="1" src="http://cq-cser.cn/wp-content/uploads/2010/01/1.jpg" alt="1" width="797" height="454" /></a><a href="http://cq-cser.cn/wp-content/uploads/2010/01/7.jpg"><img class="alignnone size-full wp-image-521" title="7" src="http://cq-cser.cn/wp-content/uploads/2010/01/7.jpg" alt="7" width="757" height="385" /></a></p>
<p>个人感觉背景再多一些东西就好看多了。 登陆后有2种模式选择，我就选择的推荐模式了。另外一个模式没测。 这个界面是不是很好看啊。 图标也挺不错的！ 聊天窗口偶就不贴图了，不然QQ号都漏出去了！ 这个东西确实不错，哈哈，大家也去体验吧！</p>
<p>体验地址：http://slqq.qq.com/</p>


<p>Related posts:<ol><li><a href='http://cq-cser.cn/2009/12/%e8%bd%bb%e6%9d%be%e5%bb%ba%e7%ab%8bsilverlight%e5%bc%80%e5%8f%91%e7%8e%af%e5%a2%83/' rel='bookmark' title='Permanent Link: 轻松建立Silverlight开发环境'>轻松建立Silverlight开发环境</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://cq-cser.cn/2010/01/silverlight-qq/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

