在Silverlight中使用DLR:“纯文本”方法的实践指南
1. “纯文本”方法简介
“纯文本”方法极大地简化了使用动态语言运行时(DLR)的Silverlight应用程序的更改和手动测试过程。我们只需对网页进行更改,然后在浏览器中重新加载该网页即可。若想深入了解“纯文本”方法,可下载文档 Back to “Just Text” with Silverlight 进行学习。
2. Apache HTTP服务器配置
要在Silverlight中使用“纯文本”方法托管基于DLR的语言代码,需要一个支持Silverlight的Web服务器和浏览器。以下以Apache HTTP Server 2.2.16作为Web服务器,Google Chrome作为浏览器为例,介绍具体的配置步骤:
1. 下载并安装Apache HTTP Server :这是配置的基础步骤。
2. 配置虚拟主机 :
- 在 C:\WINDOWS\system32\drivers\etc\hosts 文件中添加以下行:
127.0.0.1 ProDLR
- 使用文本编辑器打开 `C:\Program Files\Apache Software Foundation\Apache2.2\conf\httpd.conf` 文件,并在文件末尾添加以下行:
Include conf/virtual-hosts.conf
- 创建 `C:\Program Files\Apache Software Foundation\Apache2.2\conf\virtual-hosts.conf` 文件,将以下代码复制粘贴到该文件中:
<Directory "C:\ProDLR\src\Examples\Chapter11">
Order allow,deny
Allow from all
</Directory>
# Use name-based virtual hosting.
NameVirtualHost 127.0.0.1:80
<VirtualHost 127.0.0.1:80>
ServerName ProDLR
DocumentRoot "C:\ProDLR\src\Examples\Chapter11"
CustomLog logs/ProDLR.access.log combined
ErrorLog logs/ProDLR.error.log
</VirtualHost>
上述代码设置了一个虚拟主机,用于托管示例网站。网站名称为ProDLR,其URI为 http://ProDLR ,网站文件存储在 C:\ProDLR\src\Examples\Chapter11 文件夹中。 <Directory...> 条目用于授予浏览器访问该文件夹中文件的必要权限。
3. 重启Apache HTTP Server :完成上述更改后,记得重启服务器。可以通过加载 http://ProDLR/index.html 页面来验证服务器是否配置正确。若看到页面显示Apache HTTP Server已设置完成,则说明配置成功。
3. 使用托管的Gestalt组件
“纯文本”方法得益于名为Gestalt的项目所开发的几个软件组件,其主页为 http://visitmix.com/labs/gestalt/ 。可以通过以下两种方式使用Gestalt组件:
- 使用托管组件 :由于Gestalt组件托管在 http://gestalt.ironpython.net 和 http://gestalt.ironruby.net 上,这是最简单的使用方式。
- 自行下载并托管 :这种方式需要更多的工作,但提供了更大的灵活性。
以下是使用托管的Gestalt组件在Silverlight应用程序中运行Python和Ruby代码的示例:
- Python示例 :
<html>
<head>
<script src="http://gestalt.ironpython.net/dlr-latest.js" type="text/javascript">
</script>
</head>
<body>
<h1 id="greeting"></h1>
<script type="text/python">
document.greeting.innerHTML = "Hello!!!"
</script>
</body>
</html>
- Ruby示例 :
<html>
<head>
<script src="http://gestalt.ironruby.net/dlr-latest.js" type="text/javascript">
</script>
</head>
<body>
<h1 id="greeting"></h1>
<script type="text/ruby">
document.greeting.innerHTML = "Hello World from Ruby in Silverlight!"
</script>
</body>
</html>
4. 自行托管Gestalt组件
尽管使用托管的Gestalt组件可以轻松地在HTML页面中嵌入Python和Ruby代码,但在某些情况下,可能不希望Silverlight应用程序依赖于与Gestalt网站的网络连接。此时,可以自行下载并托管Gestalt组件,具体步骤如下:
1. 下载Gestalt组件 :从 http://visitmix.com/labs/gestalt/downloads/ 下载 Gestalt-1.0.zip 文件。
2. 解压并复制文件 :将下载的文件解压到 C:\Gestalt1.0 ,然后将 C:\Gestalt1.0\dlr 文件夹复制到 C:\ProDLR\src\Examples\Chapter11 。此时, C:\ProDLR\src\Examples\Chapter11\dlr 文件夹应包含以下文件: dlr.js 、 dlr.xap 、 gestaltmedia.js 、 IronPython.slvx 、 IronRuby.slvx 和 Microsoft.Scripting.slvx 。
3. 使用本地文件的示例 :
- Python示例 :
<html>
<head>
<script src="/dlr/dlr.js" type="text/javascript"></script>
</head>
<body>
<h1 id="greeting"></h1>
<script type="text/python">
document.greeting.innerHTML = "Hello World from Python in Silverlight!"
</script>
</body>
</html>
- **Ruby示例**:
<html>
<head>
<script src="/dlr/dlr.js" type="text/javascript"></script>
</head>
<body>
<h1 id="message"></h1>
<script type="text/ruby">
document.message.innerHTML = "Hello World from Ruby in Silverlight!"
</script>
</body>
</html>
5. 剖析Gestalt组件
C:\ProDLR\src\Examples\Chapter11\dlr 文件夹中的Gestalt组件使基于DLR的语言代码能够嵌入HTML页面。下面详细剖析这些组件的工作原理:
- dlr.js文件 :该文件包含JavaScript代码,嵌入HTML页面时会创建一个Silverlight控件。该控件的 source 参数设置为 C:\ProDLR\src\Examples\Chapter11\dlr 文件夹中的 dlr.xap 文件。
- dlr.xap文件 :实际上是一个zip文件,重命名为 dlr.zip 并打开后,会发现包含两个文件: AppManifest.xaml 和 languages.config 。
- AppManifest.xaml :指定Silverlight应用程序的入口程序集和入口类型。 dlr.xap 的入口程序集是 Microsoft.Scripting.Silverlight.dll ,入口类型是 Microsoft.Scripting.Silverlight.DynamicApplication 类。
- languages.config :配置 dlr.xap Silverlight应用程序支持的语言。
当在浏览器中加载示例HTML页面时, dlr.js 创建的Silverlight控件将加载 dlr.xap 应用程序,并创建 Microsoft.Scripting.Silverlight.DynamicApplication 类的实例。该类的 DynamicApplication_Startup 方法会在应用程序执行时被调用,它使用HTML页面的DOM扫描所有 <script> 标签,查找包含DLR语言代码的标签,并使用DLR Hosting API执行这些代码。
6. 内在对象
DynamicEngine 类的 CreateScope 方法将以下内在对象注入脚本作用域,供所有基于DLR的语言代码使用:
- document :表示宿主HTML文档,类型为 System.Windows.Browser.HtmlDocument 。
- window :表示宿主HTML窗口,类型为 System.Windows.Browser.HtmlWindow 。
- me 和 xaml :都表示关联XAML代码的根视觉元素(如果有),类型为 System.Windows.UIElement 。
7. HTML脚本编程
前面的示例展示了如何使用Ruby或Python代码通过更改HTML元素的内部文本操作宿主HTML页面的DOM。下面介绍如何使用Ruby或Python代码作为HTML事件的事件处理程序:
- Ruby示例 :
<html>
<head>
<script src="/dlr/dlr.js" type="text/javascript"></script>
</head>
<body>
<h1 id="message"></h1>
<script type="text/ruby">
def onclick_event_handler(sender, event)
document.message.innerHTML = "Hello!!!"
end
</script>
<input id="click_me" type="button" value="click me" />
<script type="text/ruby">
document.click_me.attach_event('onclick', System::EventHandler.new(method(:onclick_event_handler)))
</script>
</body>
</html>
- Python示例 :
<html>
<head>
<script src="/dlr/dlr.js" type="text/javascript"></script>
</head>
<body>
<h1 id="message"></h1>
<script type="text/python">
def onclick_event_handler(sender, event):
document.message.innerHTML = "Hello!!!"
</script>
<input id="click_me" type="button" value="click me" />
<script type="text/python">
import System
document.click_me.AttachEvent('onclick', System.EventHandler(onclick_event_handler))
</script>
</body>
</html>
此外,还可以在一个 <script> 标签中定义全局变量,并在另一个标签中使用该变量,以强调内联的DLR语言代码片段在同一脚本作用域中执行。同时,也可以一次性定义并注册匿名函数作为事件处理程序,例如:
<html>
<head>
<script src="/dlr/dlr.js" type="text/javascript"></script>
</head>
<body>
<h1 id="message"></h1>
<script type="text/ruby">
$message = "Hello!!!"
</script>
</body>
</html>
通过以上步骤和示例,你可以在Silverlight应用程序中使用“纯文本”方法运行基于DLR的语言代码,并实现HTML脚本编程。这种方法不仅简化了开发过程,还提供了更大的灵活性和便利性。
在Silverlight中使用DLR:“纯文本”方法的实践指南
8. 内联代码的脚本作用域示例
为了更清晰地展示内联的DLR语言代码片段在同一脚本作用域中执行,下面给出具体示例。
Ruby示例 :
<html>
<head>
<script src="/dlr/dlr.js" type="text/javascript"></script>
</head>
<body>
<h1 id="message"></h1>
<script type="text/ruby">
def onclick_event_handler(sender, event)
document.message.innerHTML = $message
end
</script>
<input id="click_me" type="button" value="click me" />
<script type="text/ruby">
$message = "Hello!!!"
document.click_me.attach_event('onclick', System::EventHandler.new(method(:onclick_event_handler)))
</script>
</body>
</html>
在这个示例中,第一个 <script> 标签定义了 onclick_event_handler 函数,该函数使用了全局变量 $message 。第二个 <script> 标签中定义了 $message 的值,并将 onclick_event_handler 函数注册为按钮 click_me 的 onclick 事件处理程序。由于两个 <script> 标签内的代码在同一脚本作用域中执行,所以 onclick_event_handler 函数可以访问并使用 $message 变量。
Python示例 :
<html>
<head>
<script src="/dlr/dlr.js" type="text/javascript"></script>
</head>
<body>
<h1 id="message"></h1>
<script type="text/python">
def onclick_event_handler(sender, event):
document.message.innerHTML = message
</script>
<input id="click_me" type="button" value="click me" />
<script type="text/python">
import System
message = "Hello!!!"
document.click_me.AttachEvent('onclick', System.EventHandler(onclick_event_handler))
</script>
</body>
</html>
同样,在Python示例中,第一个 <script> 标签定义了 onclick_event_handler 函数,使用了变量 message 。第二个 <script> 标签中定义了 message 的值,并将 onclick_event_handler 函数注册为按钮的事件处理程序。两个 <script> 标签内的代码共享同一脚本作用域,使得函数能够正确访问变量。
9. 匿名函数作为事件处理程序
除了定义命名函数并注册为事件处理程序,还可以使用匿名函数。以下是一个使用匿名Ruby函数作为HTML按钮 onclick 事件处理程序的示例:
<html>
<head>
<script src="/dlr/dlr.js" type="text/javascript"></script>
</head>
<body>
<h1 id="message"></h1>
<script type="text/ruby">
$message = "Hello!!!"
document.click_me = document.createElement('input')
document.click_me.type = 'button'
document.click_me.value = 'click me'
document.body.appendChild(document.click_me)
document.click_me.attach_event('onclick', System::EventHandler.new(lambda { document.message.innerHTML = $message }))
</script>
</body>
</html>
在这个示例中,使用 lambda 关键字创建了一个匿名函数,该函数在按钮被点击时将 $message 的值赋给 message 元素的 innerHTML 属性。这种方式更加简洁,适合一些简单的事件处理场景。
10. 总结与流程梳理
为了更好地理解在Silverlight中使用“纯文本”方法运行基于DLR的语言代码的整个过程,下面通过一个流程图和表格进行总结。
流程图 :
graph TD;
A[配置Apache HTTP Server] --> B[下载并安装];
B --> C[配置虚拟主机];
C --> D[重启服务器并验证];
D --> E[选择使用Gestalt组件的方式];
E --> F[使用托管组件];
E --> G[自行下载并托管];
F --> H[编写HTML页面运行代码];
G --> I[下载Gestalt组件];
I --> J[解压并复制文件];
J --> K[编写使用本地文件的HTML页面];
H --> L[剖析Gestalt组件工作原理];
K --> L;
L --> M[理解内在对象和脚本作用域];
M --> N[进行HTML脚本编程];
步骤表格总结 :
| 步骤 | 操作内容 | 详细说明 |
| ---- | ---- | ---- |
| 1 | 配置Apache HTTP Server | 下载安装,配置虚拟主机,重启并验证 |
| 2 | 选择使用Gestalt组件的方式 | 可选择托管组件或自行下载托管 |
| 3 | 使用托管组件 | 直接在HTML页面引用托管的组件文件运行代码 |
| 4 | 自行下载并托管 | 从指定网站下载组件,解压复制文件,编写使用本地文件的HTML页面 |
| 5 | 剖析Gestalt组件 | 了解 dlr.js 和 dlr.xap 文件的作用和工作原理 |
| 6 | 理解内在对象和脚本作用域 | 掌握注入脚本作用域的内在对象,明白内联代码的脚本作用域特性 |
| 7 | 进行HTML脚本编程 | 使用Ruby或Python代码作为HTML事件的事件处理程序 |
通过以上步骤和示例,我们详细介绍了在Silverlight中使用“纯文本”方法运行基于DLR的语言代码的过程。这种方法通过简化开发和测试流程,结合灵活的脚本编程方式,为开发者提供了一种高效便捷的开发途径。无论是初学者还是有经验的开发者,都可以利用这种方法快速实现功能丰富的Silverlight应用程序。在实际开发中,可以根据具体需求选择合适的组件使用方式和编程技巧,以达到最佳的开发效果。
Silverlight中DLR纯文本方法指南
超级会员免费看
1818

被折叠的 条评论
为什么被折叠?



