読者です 読者をやめる 読者になる 読者になる

Managed CodeからDOMを参照する

Silverlight IronPytohn

SilverlightのManaged CodeからHTMLのDOMを参照したり、イベントを受け取ったりできることが分かった。これができるならば、XAMLSilverlightのUIを定義しなくても、ユーザからの入力を受け取って何らかの処理ができる。

ボタンを押すとsourceというテキストフィールドの入力内容を大文字に変えるというテストコードを書いてみた。

# app/app.py
from System import EventHandler
from System.Windows.Browser.HtmlPage import Document

def btn_Clicked(sender, event):
    Document.source.value = Document.source.value.upper()

handler = EventHandler(btn_Clicked)
Document.btn.AttachEvent("onclick", handler)

最初、IronRubyの例を参考にしていたため、少し苦労した。IronRubyならば、EventHandlerを使わずに、次のような感じで書けるらしい。

document.submit_search.onclick do |sender, event|
    # ここで何かする
end

IronPythonの場合の書き方は、IronPython Cookbookで同様のコードを見つけたので、これで分かった。

IronPython Cookbook
http://www.ironpython.info/index.php/Contents

Silverlightを組み込むHTML(index.html)は次のような感じ。

<html>
<head>
<meta http-equiv="Control-Type" content="text/html;charset=utf-8" />
<title>DOM and IronPython</title>
<script src="http://silverlight.net/quickstarts/Silverlight.js" type="text/javascript" ></script>
</head>

<body>
<form action="javascript:void(0)">
  <input type="text" id="source" value="" />
  <input type="submit" id="btn" value="To Upper" />
</form>

<div id="SilverlightControlHost">
<script type="text/javascript"><!--
var controlID = "SilverlightControl";
Silverlight.createObjectEx({
  source: "app.xap",
  parentElement: document.getElementById("SilverlightControlHost"),
  id: controlID,
  properties: {
    width : '1',
    height: '1',
    inplaceInstallPrompt: false,
    isWindowless: 'True',
    version: '1.1'
  },
  events: {},
  initParams: "debug=True"
});
//-->
</script>
</div>
</body>
</html>

app.pyとindex.htmlを次のように配置し、Chironから確認。

+ dom
++ index.html
++ app
+++ app.py

Silverlight.jsを使えば、objectタグを自分で書かずにJavascriptの関数を呼び出してSilverlightを組み込めるようなので、これを使うことにした。
Silverlight.jsについては以下の記事等が参考になる。

【ハウツー】ゼロからはじめるSilverlight - (3) Silverlight.jsを使う
http://journal.mycom.co.jp/articles/2007/08/16/silverlight/002.html