﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>博客园-Thinking dynamic</title><link>http://www.cnblogs.com/cofd/</link><description>Write here write now</description><language>zh-cn</language><lastBuildDate>Thu, 24 Jul 2008 06:18:35 GMT</lastBuildDate><pubDate>Thu, 24 Jul 2008 06:18:35 GMT</pubDate><ttl>60</ttl><item><title>Z-Buffer 与 W-Buffer</title><link>http://www.cnblogs.com/cofd/archive/2007/12/01/979473.html</link><dc:creator>cofd</dc:creator><author>cofd</author><pubDate>Sat, 01 Dec 2007 08:59:00 GMT</pubDate><guid>http://www.cnblogs.com/cofd/archive/2007/12/01/979473.html</guid><wfw:comment>http://www.cnblogs.com/cofd/comments/979473.html</wfw:comment><comments>http://www.cnblogs.com/cofd/archive/2007/12/01/979473.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/cofd/comments/commentRss/979473.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/cofd/services/trackbacks/979473.html</trackback:ping><description><![CDATA[<p>Depth-Buffer（深度缓存）有两种：Z-Buffer 和 W-Buffer，这里讨论这两种深度缓存的区别，以及如何在两者之间转换。  <h4>w 的含义</h4> <p>3D空间点的坐标是（x，y，z），为了使矩阵乘法具有平移变换的功效，我们用4D空间中的点（x，y，z，w）来表示3D空间中的点（x'，y'，z'），这两个不同空间点之间的关系是：<pre>    x' = x / w
    y' = y / w
    z' = z / w
</pre>
<p>像这样用四维空间点表示三维空间点，或者说用 n + 1 维空间点表示 n 维空间点的方法叫做 “齐次坐标表示法”。 
<p>实际使用中，在模型-&gt;世界转换、世界-&gt;视图转换过程中，w 通常保持不变，总是等于一，这样，齐次坐标的前三个分量就是对应3D空间点的三个坐标分量。但是，经过投影变换后，w 将得到一个比例值，比如，一般的透视投影变换矩阵是： <pre>    | W   0   0   0 |
    | 0   H   0   0 |
    | 0   0   Q   1 |
    | 0   0  -QZn 0 |

    其中   Zn  =  近裁剪面 z 坐标
           Zf  =  远裁剪面 z 坐标
            W  =  2 * Zn / 视口宽度
            H  =  2 * Zn / 视口高度
            Q  =  Zf / (Zf - Zn)
</pre>
<p>将点（x，y，z，1）乘以此矩阵，w 便不再是一，而对应的3D空间点坐标（x / w，y / w，z / w）将出现一个缩放效果。同时，因为 w 的值通常与 z 坐标成正比（比如经过上面这个矩阵的变换，w 的值其实就是 z 坐标的值），所以经过投影变换，物体会产生近大远小的效果。 
<h4>Z-Buffer 与 W-Buffer 的区别</h4>
<p>简单的说，z-buffer 与 w-buffer 的区别就是前者保存的是点的 z 坐标，而后者保存的是点的 w 坐标。 
<p>具体的说，两者因为保存的值有不同的含义，所以表现出来的实际效果也会有差别。 
<p>z-buffer 保存的是经过投影变换后的 z 坐标，前面说过，投影后物体会产生近大远小的效果，所以距离眼睛比较近的地方，z 坐标的分辨率比较大，而远处的分辨率则比较小，换句话说，投影后的 z 坐标在其值域上，对于离开眼睛的物理距离变化来说，不是线性变化的（即非均匀分布），这样的一个好处是近处的物体得到了较高的深度分辨率，但是远处物体的深度判断可能会出错。 
<p>w-buffer 保存的是经过投影变换后的 w 坐标，而 w 坐标通常跟世界坐标系中的 z 坐标成正比，所以变换到投影空间中之后，其值依然是线性分布的，这样无论远处还是近处的物体，都有相同的深度分辨率，这是它的优点，当然，缺点就是不能用较高的深度分辨率来表现近处的物体。 
<p>从硬件实现角度来说，几乎所有的硬件3D加速卡都支持 z-buffer，而 w-buffer 的支持没有 z-buffer 那么广泛。另外，早期的 Direct3D 版本看起来也不支持 w-buffer。 
<h4>Z-Buffer 与 W-Buffer 之间的转换</h4>
<p>根据上面的矩阵变换，可以很容易的导出将 w-buffer 转换成 z-buffer 的公式：<pre>    zDepth = Q * ( wDepth - Zn ) / wDepth
           = Zf / ( Zf - Zn ) * ( wDepth - Zn ) / wDepth
</pre>
<p>这个转换公式有什么用处？举个例子：3DS MAX 使用的是 w-buffer，如果从 3DS MAX 中导出深度信息到 Direct3D 中，作为预渲染的背景使用，就有可能用到上面这个转换。当然，如果在 D3D 中使用 w-buffer，问题就不大了，但是如果使用 z-buffer，不经过这样的转换，渲染结果就会出错。</p><img src ="http://www.cnblogs.com/cofd/aggbug/979473.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41275/" target="_blank">[新闻]Mozilla将于本周五发布Firefox 3.1第一个预览版</a>]]></description></item><item><title>亮度专业词语(转)</title><link>http://www.cnblogs.com/cofd/archive/2007/11/29/977178.html</link><dc:creator>cofd</dc:creator><author>cofd</author><pubDate>Thu, 29 Nov 2007 09:06:00 GMT</pubDate><guid>http://www.cnblogs.com/cofd/archive/2007/11/29/977178.html</guid><wfw:comment>http://www.cnblogs.com/cofd/comments/977178.html</wfw:comment><comments>http://www.cnblogs.com/cofd/archive/2007/11/29/977178.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/cofd/comments/commentRss/977178.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/cofd/services/trackbacks/977178.html</trackback:ping><description><![CDATA[<p>在计算机图形学方面有许多的表示亮度的专业词语。正确理解这些词语而不是简单地视为亮度能使你在处理图象时获得更好的效果。 <br>1、什么是Intensity？ <br>　　这个词可以解释为强度，表示的是每单位面积传播的（光）辐射能量。Intensity也可以称为线形光测量，可以以诸如每平方米多少瓦此类的单位来衡量。提供给显示器阴极射线管（简称CRT）的电压直接控制了颜色构成的Intensity，但是却是以非线性方式的。所以CRT的电压与Intensity并不是成正比的。 <br>2、什么是Birghtness？ <br>　　这个词解释为亮度（下面好几个词的解释都是亮度）。这是由Commission Internationale de L’Eclairage (CIE)根据一个区域发出的光的多少来定义的可视属性。Birghtness是知觉数值，没有固定的客观量度。 <br>3、什么是Luminance？ <br>　　这个词解释为光照度，由CIE定义，以Y为表示符号，以视觉属性--光谱敏感性与辐射强度加权得出。Luminance的光度与物理强度成比例。Luminance容易使人觉得与Intensity差不多。但Luminance的频谱组成是与人类视觉的光敏感性相关的。 <br>　　Luminance可以以线性光的主要组成：红绿蓝三分量的适当加权和来计算。以目前的摄像设备为例，各系数为： <br>　　在视频方面的标准是以非线性R’G’B’组成的加权和来计算LUMA组成Y’的。虽然这个数值经常被看作Luminance，但它不是。 <br>4、什么是Lightness？ <br>　　这个词也是亮度。人类视觉对光的知觉是非线性的。一个Luminance只有另外一个光源的18%的光源，在人看来却是50%。对Luminance的知觉反应称为Lightness，并且被CIE定义为Luminance的修正立方根： <br>　　Yn是参考白色的Luminance。如果你把Luminance（Y）常态化为参考白色那就不需要计算这个商。 <br>　　在另一方面，也可以说Lightness知觉是粗略对数的，你可以对Intensity相差只是百分之一多一点的两点发觉不同。 <br>5、什么是Gamma？ <br>　　Gamma也是用于表示亮度。一个物理设备发出的光的Intensity通常都不是输入信号的线性输出。传统的CRT具有对电压的功率反应：在显示表面产生的Intensity大约是输入电压的2.5次方。这个数值通俗地称为Gamma。为能产生正确的Intensity必须对这一非线性进行补偿。 <br>6、什么是Gamma校正？ <br>　　在视频系统，线性光Intensity通过Gamma校正转换为非线性的视频信号，通常在摄像过程内完成。如下函数把把线性光亮度（Intensity），R，转换为非线性组成R’： <br>　　然后，一个理想的显示器把该转换反转输出： <br>7、什么是Contrast Ratio？ <br>　　Contrast Ratio是对比度的意思，也就是对某一设备或环境而言的最亮的白色和最暗的黑色之间的Intensity的比例。电影院的对比度可以达到80:1，电视在设计时认为你的居室环境是30:1，典型的办公条件下一个CRT显示器的对比度大约是5:1。 <br>8、如何调节显示器的黑度和图象控制？ <br>　　一般的显示器上的标识都是错的。Picture Control，通常被标识为Contrast，控制整体亮度（Intensity），Black Level黑度控制，通常被标识为Birghtness，调整黑色偏重。显示一幅从纯白到纯黑过渡的图象，先调整黑度控制使得显示器显示完全是黑色，然后慢慢调节黑度，直到感觉上纯黑的部位开始变亮为止。这是因为图象是基于黑色显示的。当达到这一点后，标记下黑度控制的位置，然后显示一幅彩色图象（一般选取自然景观），调节图象控制到你喜欢的亮度。 </p><img src ="http://www.cnblogs.com/cofd/aggbug/977178.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41274/" target="_blank">[新闻]瑞星将向个人用户免费1年</a>]]></description></item><item><title>Silverlight与Html/JavaScript互操作</title><link>http://www.cnblogs.com/cofd/archive/2007/11/28/975116.html</link><dc:creator>cofd</dc:creator><author>cofd</author><pubDate>Wed, 28 Nov 2007 01:34:00 GMT</pubDate><guid>http://www.cnblogs.com/cofd/archive/2007/11/28/975116.html</guid><wfw:comment>http://www.cnblogs.com/cofd/comments/975116.html</wfw:comment><comments>http://www.cnblogs.com/cofd/archive/2007/11/28/975116.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/cofd/comments/commentRss/975116.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/cofd/services/trackbacks/975116.html</trackback:ping><description><![CDATA[<p>前段时间写了<a href="/cofd/archive/2007/10/26/938882.html">Flex和JavaScript互操作</a>, 本篇介绍Silverlight和Html/Javascript的互操作性.当然Silverlight可以使用多种托管语言, 我这里使用C#.</p> <p><strong>摘要:</strong></p> <p>先介绍一下<em>System.Windows.Browser</em>命名空间下的几个类, 接着介绍Silverlight如何操纵Html元素, 最后介绍如何从Javascript调用Silverlight的方法, 以及Silverlight调用Javascript方法.</p> <p><strong>1.System.Windows.Browser</strong></p> <p>Silverlight提供了一组对象来描述Html文档对象模型(DOM), 包括HtmlPage, HtmlDocument, HemlElement, HtmlElementCollection, 等等. 我们可以通过这些对象从Silverlight访问Html页面的内容, 如获取某个Html元素, 导航到新的URL等.(ps:<a href="http://blog.lookorfeel.com/index.php/2007/05/06/silverlight-11-api-overview/">Silverlight 1.1 Complete API List </a>)</p> <p>首先看HtmlPage类, 其提供了浏览器信息的静态属性BrowserInformation;提供的静态方法Navigate, 可以方便的跳转到其他的web页.提供了Document属性访问Html Dom, 有了它就可以干很多事了</p> <p>HtmlDocument/HemlElement类用来访问DOM, 有了DOM就可以像Javascript一样做任何事了. </p> <p>注意: 如果需要Silverlight可以访问Html页面的内容, 在创建Silverlight控件的时候必须将enableHtmlAccess设为true.</p> <p><strong>2.Silverlight操纵Html</strong></p> <p>想象Javascript是怎么访问Html元素的, Silverlight也同样可以.</p> <p>修改页面属性:如修改页面标题, HtmlPage.Document.SetProperty("title", "new title");</p> <p>操纵html元素:</p> <p>HtmlElement elem =&nbsp; HtmlPage.Document.GetElementByID("btn");<br>elem.SetAttribute("value", "haha");<br>elem.GetAttribute("value");  </p><p>elem.AttachEvent("onclick", delegate(object sender, HtmlEventArgs he){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // ...<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; });</p> <p><strong>3.Javascript调用Silverlight方法</strong></p> <p>Javascript要想调用Silverlight, Silverlight必须通过DOM提供给Javascript一个可操作的对象.</p> <p>新建一个silverlight项目, 修改Page.xaml.cs如下:</p> <p>using System;<br>using System.Windows;<br>using System.Windows.Browser;<br>using System.Windows.Controls;  </p><p>namespace SilverlightProject1<br>{<br>&nbsp;&nbsp;&nbsp; <strong>[Scriptable]<br></strong>&nbsp;&nbsp;&nbsp; public partial class Page : Canvas<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void Page_Loaded(object o, EventArgs e)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Required to initialize variables<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; InitializeComponent();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>WebApplication.Current.RegisterScriptableObject("js", this);</strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }  </p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>[Scriptable]<br></strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>public string CalledByJs(string name)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return "i'm silverlight, called by " + name;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br></strong>&nbsp;&nbsp;&nbsp; }<br>}  </p><p>修改TestPage.html如下:  </p><p>&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "<a href="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd%22">http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"</a>&gt;<br>&lt;html xmlns="<a href="http://www.w3.org/1999/xhtml%22">http://www.w3.org/1999/xhtml"</a> &gt;<br>&lt;head&gt;<br>&nbsp;&nbsp;&nbsp; &lt;title&gt;Silverlight Project Test Page &lt;/title&gt;<br>&nbsp;&nbsp;&nbsp; &lt;script type="text/javascript" src="Silverlight.js"&gt;&lt;/script&gt;<br>&nbsp;&nbsp;&nbsp; &lt;script type="text/javascript" src="TestPage.html.js"&gt;&lt;/script&gt;<br>&nbsp;&nbsp;&nbsp; &lt;style type="text/css"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .silverlightHost { width: 640px; height: 480px; }<br>&nbsp;&nbsp;&nbsp; &lt;/style&gt;<br>&nbsp;&nbsp;&nbsp; <strong>&lt;script type="text/javascript"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; function callSL()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var control = document.getElementById("SilverlightControl");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var manager = control.Content.js;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; alert( manager.CalledByJs('js') );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; &lt;/script&gt;<br></strong>&lt;/head&gt;  </p><p>&lt;body&gt;<br>&nbsp;&nbsp;&nbsp; &lt;div id="SilverlightControlHost" class="silverlightHost" &gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;script type="text/javascript"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; createSilverlight();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/script&gt;<br>&nbsp;&nbsp;&nbsp; &lt;/div&gt;<br>&nbsp;&nbsp;&nbsp; <strong>&lt;input id="btn" type="button" value="call silverlight method" onclick="callSL()" /&gt;</strong><br>&lt;/body&gt;<br>&lt;/html&gt;  </p><p>好像还不支持Silverlight方法返回一个复杂类型, 不过还好Silverlight内置了json的支持, 使用System.Windows.Browser.Serialization命名空间下JavaScriptSerializer序列化一下就ok了.  </p><p><strong>4.Silverlight调用Javascript方法</strong></p> <p>Silverlight无法直接调用javascript方法, 不过可以利用事件, 在Silverlight里抛出事件, 在javascript响应该事件.</p> <p>修改Page.xaml如下:</p> <p>&lt;Canvas x:Name="parentCanvas"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xmlns="<a href="http://schemas.microsoft.com/client/2007%22">http://schemas.microsoft.com/client/2007"</a><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xmlns:x="<a href="http://schemas.microsoft.com/winfx/2006/xaml%22">http://schemas.microsoft.com/winfx/2006/xaml"</a><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Loaded="Page_Loaded" <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; x:Class="SilverlightProject1.Page;assembly=ClientBin/SilverlightProject1.dll"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Width="640"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Height="480"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Background="White"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &gt;<br><strong>&nbsp; &lt;TextBlock Text="call js method" MouseLeftButtonDown="OnClick"/&gt;</strong><br>&lt;/Canvas&gt; </p><p>修改Page.xaml.cs如下: </p><p>using System;<br>using System.Windows;<br>using System.Windows.Browser;<br>using System.Windows.Controls;<br>using System.Windows.Input;  </p><p>namespace SilverlightProject1<br>{<br>&nbsp;&nbsp;&nbsp; <strong>[Scriptable]<br></strong>&nbsp;&nbsp;&nbsp; public partial class Page : Canvas<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void Page_Loaded(object o, EventArgs e)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Required to initialize variables<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; InitializeComponent();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>WebApplication.Current.RegisterScriptableObject("js", this); </strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }  </p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>protected void OnClick(object sender, MouseEventArgs e)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (this.CallJs != null )<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; EventHandler temp = this.CallJs;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; temp(this, EventArgs.Empty);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } </strong> </p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong> [Scriptable]<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public event EventHandler CallJs;<br></strong>&nbsp;&nbsp;&nbsp; }<br>} </p><p>修改TestPage.html.js:在onLoad事件里添加了对Silverlight抛出的CallJs 事件的响应. </p><p>// JScript source code  </p><p>//contains calls to silverlight.js, example below loads Page.xaml<br>function createSilverlight()<br>{<br>&nbsp;&nbsp;&nbsp; Silverlight.createObjectEx({<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; source: "Page.xaml",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; parentElement: document.getElementById("SilverlightControlHost"),<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; id: "SilverlightControl",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; properties: {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; width: "100%",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; height: "100%",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; version: "1.1",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; enableHtmlAccess: "true"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; },<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>&nbsp; events: { onLoad : OnLoaded}<br></strong>&nbsp;&nbsp;&nbsp; });<br>&nbsp;&nbsp;&nbsp; // Give the keyboard focus to the Silverlight control by default<br>&nbsp;&nbsp;&nbsp; document.body.onload = function() {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var silverlightControl = document.getElementById('SilverlightControl');<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (silverlightControl)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; silverlightControl.focus();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>}  </p><p><strong>function OnLoaded(sender, args)<br>{<br>&nbsp;&nbsp;&nbsp; sender.Content.js.CallJs = calledBySL;<br>}</strong></p> <p><strong>function calledBySL(sender, args)<br>{<br>&nbsp;&nbsp;&nbsp; alert("i'm js, called by silverlight");<br>}</strong></p> <p>done!</p> <p>我尝试了在Silverlight事件里加了自定义的参数, javascript这边好像接收不到??不知道是什么原因.</p> <p><strong>总结:</strong></p> <p>Silverlight与Javascript的互操作的方式和Flex类似, 不过个人还是喜欢Silverlight的方式, C#的语法简单清晰.</p> <p><strong>参考资料:</strong></p> <p><a href="/walkingboy/archive/2007/07/01/Silverlight_scriptableadvance.html">[Silverlight探秘]深入探索Silverlight与Javascript的交互</a></p> <p><a href="http://www.aspstat.com/109">Silverlight 访问html元素</a></p><img src ="http://www.cnblogs.com/cofd/aggbug/975116.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41273/" target="_blank">[新闻]中国互联网历史上最伟大的产品TOP10（二）</a>]]></description></item><item><title>Silverlight程序动态创建添加UI元素</title><link>http://www.cnblogs.com/cofd/archive/2007/11/27/974606.html</link><dc:creator>cofd</dc:creator><author>cofd</author><pubDate>Tue, 27 Nov 2007 12:17:00 GMT</pubDate><guid>http://www.cnblogs.com/cofd/archive/2007/11/27/974606.html</guid><wfw:comment>http://www.cnblogs.com/cofd/comments/974606.html</wfw:comment><comments>http://www.cnblogs.com/cofd/archive/2007/11/27/974606.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/cofd/comments/commentRss/974606.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/cofd/services/trackbacks/974606.html</trackback:ping><description><![CDATA[<p>我们都知道XAML标签元素在sliverlight运行时被转换成相应的对象. 程序运行时, 也可以动态的添加UI元素.</p> <p>1.通过对象创建UI元素</p> <p>Rectangle rc = new Rectangle();<br>rc.Width = 20;<br>rc.Height = 20;<br>rc.Fill = new SolidColorBrush(Colors.Red);<br>rc.SetValue&lt;double&gt;(Canvas.LeftProperty, 200);  </p><p>this.Children.Add(rc);  </p><p>2.通过XAML创建UI元素  </p><p>通过XamlReader类的Load方法, 动态的创建UI元素  </p><p>string xamlStr = "&lt;Rectangle Canvas.Left=\"" + 20 + "\" Canvas.Top=\"" + 20 + "\""&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; + " Width=\""+40+"\" Height=\""+40+"\""&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; + " Fill =\"Red\" /&gt;";  </p><p>try<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Rectangle rc = (Rectangle)XamlReader.Load(xamlStr);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.Children.Add(rc);<br>}<br>catch { }  </p><img src ="http://www.cnblogs.com/cofd/aggbug/974606.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41271/" target="_blank">[新闻]盖茨官方否认天价租楼看奥运 纯属地产商炒作</a>]]></description></item><item><title>无废话Silverlight入门</title><link>http://www.cnblogs.com/cofd/archive/2007/11/27/974599.html</link><dc:creator>cofd</dc:creator><author>cofd</author><pubDate>Tue, 27 Nov 2007 12:10:00 GMT</pubDate><guid>http://www.cnblogs.com/cofd/archive/2007/11/27/974599.html</guid><wfw:comment>http://www.cnblogs.com/cofd/comments/974599.html</wfw:comment><comments>http://www.cnblogs.com/cofd/archive/2007/11/27/974599.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/cofd/comments/commentRss/974599.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/cofd/services/trackbacks/974599.html</trackback:ping><description><![CDATA[<p><strong>1.<a href="http://silverlight.net" target="_blank">Silverlight</a>是什么</strong></p> <p>Silverlight是一个跨浏览器的、跨平台的<strong>插件</strong>，为网络带来<u>下一代基于</u><u>.NET</u>的<strong>媒体体验和丰富的交互式应用程序</strong>。Silverlight提供<u>灵活的编程模型</u>，支持AJAX, VB, C#, Python, Ruby等语言，并<u>集成到现有的网络应用程序中</u>。Silverlight对运行在Mac或Windows上的主流浏览器<u>提供高质量视频信息的快速、低成本的传递</u> </p><p>Microsoft® Silverlight™ is a cross-browser, cross-platform plug-in for delivering the next generation of .NET based media experiences and rich interactive applications for the Web. Silverlight offers a flexible programming model that supports AJAX, VB, C#, Python, and Ruby, and integrates with existing Web applications. Silverlight supports fast, cost-effective delivery of high-quality video to all major browsers running on the Mac OS or Windows. </p><p><strong>2.开发环境</strong> </p><p>运行时: </p><p><a href="http://go.microsoft.com/fwlink/?LinkID=88986&amp;clcid=0x409" target="_blank">Microsoft Silverlight 1.1Alpha Refresh</a> </p><p>开发工具:  </p><p><a href="http://weblogs.asp.net/scottgu/archive/2007/11/19/visual-studio-2008-and-net-3-5-released.aspx" target="_blank">Microsoft Visula Studio 2008</a> </p><p><a href="http://weblogs.asp.net/scottgu/archive/2007/11/26/silverlight-1-1-tools-alpha-for-visual-studio-2008-available-for-download.aspx" target="_blank">Silverlight 1.1 Tools Alpha for Visual Studio 2008</a> </p><p>设计工具:(可选) </p><p><a href="http://go.microsoft.com/fwlink/?LinkID=79076&amp;clcid=0x409" target="_blank">Expression Blend 2</a> </p><p><strong>3.HelloWorld</strong> </p><p>打开VS, 新建一个Silverlight Project, 修改默认生成的Page.xaml文件为: </p><p>&lt;Canvas x:Name="parentCanvas"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xmlns="<a href="http://schemas.microsoft.com/client/2007%22">http://schemas.microsoft.com/client/2007"</a><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xmlns:x="<a href="http://schemas.microsoft.com/winfx/2006/xaml%22">http://schemas.microsoft.com/winfx/2006/xaml"</a><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Loaded="Page_Loaded" <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; x:Class="SilverlightProject1.Page;assembly=ClientBin/SilverlightProject1.dll"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Width="640"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Height="480"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Background="White"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &gt;<br>&nbsp; <strong>&lt;TextBlock x:Name="txt" Text="HelloWorld" MouseLeftButtonDown="SayHi"/&gt;<br></strong>&lt;/Canvas&gt; </p><p>修改Page.xaml.cs为: </p><p>using System;<br>using System.Windows.Controls;<br>using System.Windows.Input;  </p><p>namespace SilverlightProject1<br>{<br>&nbsp;&nbsp;&nbsp; public partial class Page : Canvas<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void Page_Loaded(object o, EventArgs e)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Required to initialize variables<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; InitializeComponent();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }  </p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>protected void SayHi(object sener, MouseEventArgs e)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.txt.Text = "HelloWorld to Silverlight";<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br></strong>&nbsp;&nbsp;&nbsp; }<br>} </p><p>按ctrl+F5运行.</p> <p>:)</p><img src ="http://www.cnblogs.com/cofd/aggbug/974599.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41271/" target="_blank">[新闻]盖茨官方否认天价租楼看奥运 纯属地产商炒作</a>]]></description></item></channel></rss>