PowerShellでXAMLベースのWPF GUIを構築する基本的な手順とコード例を示す。XAML定義の読み込み、コントロールへのアクセス、イベント処理を解説する。
XAML定義の準備
WPF (Windows Presentation Foundation) のGUIはXAML (Extensible Application Markup Language) で定義される。まず、シンプルなウィンドウとボタンを持つXAMLを準備する。ここではXML形式の文字列としてPowerShellスクリプト内に埋め込む。
<Window x:Class="MyWpfApp" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="WPF GUI Sample" Height="200" Width="300"> <Grid> <StackPanel Margin="10"> <TextBlock x:Name="MessageBlock" Text="Hello WPF!" Margin="0,0,0,10"/> <Button x:Name="ClickMeButton" Content="Click Me"/> </StackPanel> </Grid> </Window>
x:Name
属性は、PowerShellから特定のコントロールにアクセスするために使用する識別子である。
PowerShellからのXAMLロードとGUI構築
PowerShellスクリプト内でXAMLをロードし、GUIウィンドウを生成する。System.Windows.Markup.XamlReader
クラスを利用する。
# WPFアセンブリのロード Add-Type -AssemblyName PresentationFramework, PresentationCore, WindowsBase # XAML定義 $xaml = @" <Window x:Class="MyWpfApp" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="WPF GUI Sample" Height="200" Width="300"> <Grid> <StackPanel Margin="10"> <TextBlock x:Name="MessageBlock" Text="Hello WPF!" Margin="0,0,0,10"/> <Button x:Name="ClickMeButton" Content="Click Me"/> </StackPanel> </Grid> </Window> "@ # XAMLを読み込み、ウィンドウオブジェクトを生成 $reader = New-Object System.Xml.XmlNodeReader (New-Object System.Xml.XmlDocument) $reader.LoadXml($xaml) $window = [System.Windows.Markup.XamlReader]::Load($reader) # コントロールへのアクセス $messageBlock = $window.FindName("MessageBlock") $clickMeButton = $window.FindName("ClickMeButton") # イベントハンドラの定義と割り当て $clickMeButton.Add_Click({ $messageBlock.Text = "Button Clicked!" Write-Host "Button Clicked in Console!" }) # ウィンドウの表示 $window.ShowDialog()
コード解説
- アセンブリのロード:
Add-Type -AssemblyName PresentationFramework, PresentationCore, WindowsBase
コマンドで、WPFアプリケーションの実行に必要なアセンブリをPowerShellセッションにロードする。これにより、WPFのクラスやメソッドが利用可能になる。 - XAML定義:
$xaml
変数にヒアドキュメント形式でXAML文字列を格納する。これにより、複数行のXAMLをスクリプト内に直接記述できる。 - XAMLの読み込み:
System.Xml.XmlNodeReader
とSystem.Xml.XmlDocument
を利用してXAML文字列をXMLドキュメントとして解析し、[System.Windows.Markup.XamlReader]::Load()
メソッドでWPFオブジェクトツリーを生成する。このメソッドはルート要素(この場合はWindow
)のオブジェクトを返す。 - コントロールへのアクセス:
生成された
$window
オブジェクトのFindName()
メソッドを使用して、XAMLでx:Name
属性を指定したコントロール(例:MessageBlock
,ClickMeButton
)を取得する。取得したオブジェクトを通じて、コントロールのプロパティを変更したり、イベントを購読したりできる。 - イベントハンドラの定義と割り当て:
WPFコントロールのイベント(例:
Click
イベント)には、PowerShellのスクリプトブロックを直接割り当てられる。Add_Click()
のように、イベント名の前にAdd_
を付けてメソッドとして呼び出し、引数にスクリプトブロックを渡すことでイベントハンドラを登録する。イベント発生時にこのスクリプトブロックが実行される。 - ウィンドウの表示:
$window.ShowDialog()
メソッドを呼び出すと、GUIウィンドウがモーダルダイアログとして表示される。このメソッドはウィンドウが閉じられるまでスクリプトの実行をブロックする。非モーダル表示の場合は$window.Show()
を使用する。
この手順により、PowerShellスクリプト内で動的にXAMLベースのWPF GUIを構築し、ユーザー操作に応じた処理を実装できる。
コメント