もう一つ 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())
動的に XAML を合体できるんだ、知らなかったよ。
exe を作って一つにまとめるわけじゃないけどコレは便利。
と思ったけど…
LoadComponent は第一引数のオブジェクトと XAML を合体するので私の大好きなメニューだけ XAML みたいな方法が使えないよ。
ヒアドキュメントにもできないみたいだし、少し残念。
大半の人はそんなこと気にしないんだろうけど。
Microsoft.Scripting.Runtime.DynamicXamlReader
というのを使っているらしい。
IronPython ディレクトリにある Microsoft.Dynamic.dll リファレンスにあるようだ。
C# からも使えるかもと思って少し四苦八苦してみたけど無駄だった。
そりゃどう考えてもコンパイルで弾かれるわ。
「textbox は定義されていません」みたいな感じで。
動的割り当てなスクリプト言語だから可能な技だろうね。
MSBuild による WPF プログラムのビルド – WPF 入門
C# は素直にコレやるか VisualStudio を使えだろうね。