31、在Silverlight中使用DLR:“纯文本”方法的实践指南

Silverlight中DLR纯文本方法指南

在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应用程序。在实际开发中,可以根据具体需求选择合适的组件使用方式和编程技巧,以达到最佳的开发效果。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值