自由テーマ

Tech

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()

コード解説

  1. アセンブリのロード: Add-Type -AssemblyName PresentationFramework, PresentationCore, WindowsBase コマンドで、WPFアプリケーションの実行に必要なアセンブリをPowerShellセッションにロードする。これにより、WPFのクラスやメソッドが利用可能になる。
  2. XAML定義: $xaml 変数にヒアドキュメント形式でXAML文字列を格納する。これにより、複数行のXAMLをスクリプト内に直接記述できる。
  3. XAMLの読み込み: System.Xml.XmlNodeReaderSystem.Xml.XmlDocument を利用してXAML文字列をXMLドキュメントとして解析し、[System.Windows.Markup.XamlReader]::Load() メソッドでWPFオブジェクトツリーを生成する。このメソッドはルート要素(この場合はWindow)のオブジェクトを返す。
  4. コントロールへのアクセス: 生成された$windowオブジェクトのFindName()メソッドを使用して、XAMLでx:Name属性を指定したコントロール(例: MessageBlock, ClickMeButton)を取得する。取得したオブジェクトを通じて、コントロールのプロパティを変更したり、イベントを購読したりできる。
  5. イベントハンドラの定義と割り当て: WPFコントロールのイベント(例: Clickイベント)には、PowerShellのスクリプトブロックを直接割り当てられる。Add_Click() のように、イベント名の前にAdd_を付けてメソッドとして呼び出し、引数にスクリプトブロックを渡すことでイベントハンドラを登録する。イベント発生時にこのスクリプトブロックが実行される。
  6. ウィンドウの表示: $window.ShowDialog() メソッドを呼び出すと、GUIウィンドウがモーダルダイアログとして表示される。このメソッドはウィンドウが閉じられるまでスクリプトの実行をブロックする。非モーダル表示の場合は$window.Show()を使用する。

この手順により、PowerShellスクリプト内で動的にXAMLベースのWPF GUIを構築し、ユーザー操作に応じた処理を実装できる。

ライセンス:本記事のテキスト/コードは特記なき限り CC BY 4.0 です。引用の際は出典URL(本ページ)を明記してください。
利用ポリシー もご参照ください。

コメント

タイトルとURLをコピーしました