DynamicXamlReader

もう一つ IronPython ネタ。

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

え。。。。。

dynamic.xaml

<Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    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

# -*- 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 を使えだろうね。