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