日別アーカイブ: 2013/02/11

DynamicXamlReader

もう一つ IronPython ネタ。

ユーザーインターフェース付きのスクリプトをXAML×IronPythonを使って作る(2): 品質向上と効率改善の組み木パズル

え。。。。。

dynamic.xaml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<Window
    Title="DynamicXamlReader" Height="200" Width="300" Loaded="on_loaded">
    <DockPanel>
        <Menu DockPanel.Dock="Top">
            <MenuItem Header="_File">
                <MenuItem Header="_Open" Click="on_open" InputGestureText="Ctrl+O" />
                <Separator />
                <MenuItem Header="_Close" Click="on_close" InputGestureText="Ctrl+Q" />
            </MenuItem>
        </Menu>
        <TextBox Name="textbox" />
    </DockPanel>
</Window>

dynamic.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# -*- coding: UTF-8 -*-
 
import wpf
 
from System import *
from System.IO import *
from System.Windows import *
from Microsoft.Win32 import OpenFileDialog
 
class DynamicXamlReaderTest(Window):
    def __init__(self):
        # DynamicXamlReader Set
        wpf.LoadComponent(self, "dynamic.xaml")
 
    def on_loaded(self, sender, e):
        self.textbox.Focus()
 
    def on_open(self, sender, e):
        dlg = OpenFileDialog()
        if dlg.ShowDialog():
            # C# using(var sw = new StreamReader(dlg.FileName)){}
            with StreamReader(dlg.FileName) as sw:
                self.textbox.Text = sw.ReadToEnd()
 
    def on_close(self, sender, e):
        self.Close()
 
if __name__ == "__main__":
    Application().Run(DynamicXamlReaderTest())

dynamic

動的に XAML を合体できるんだ、知らなかったよ。
exe を作って一つにまとめるわけじゃないけどコレは便利。

と思ったけど…
LoadComponent は第一引数のオブジェクトと XAML を合体するので私の大好きなメニューだけ XAML みたいな方法が使えないよ。
ヒアドキュメントにもできないみたいだし、少し残念。
大半の人はそんなこと気にしないんだろうけど。

Microsoft.Scripting.Runtime.DynamicXamlReader
というのを使っているらしい。
IronPython ディレクトリにある Microsoft.Dynamic.dll リファレンスにあるようだ。

C# からも使えるかもと思って少し四苦八苦してみたけど無駄だった。
そりゃどう考えてもコンパイルで弾かれるわ。
「textbox は定義されていません」みたいな感じで。
動的割り当てなスクリプト言語だから可能な技だろうね。

MSBuild による WPF プログラムのビルド – WPF 入門
C# は素直にコレやるか VisualStudio を使えだろうね。