IronRubyでXAMLで作った画面を表示する

# 概要
IronRubyを使い、XAMLで作った画面を表示する方法の紹介です。

# 環境
Windows 8.1（64ビット）
IronRuby 1.1

# XAMLファイルをロードする例
画面レイアウトをXAMLファイル（XMLファイル）に作成し、それをIronRubyにロードさせて画面を表示します。

## コード
最初にXAMLファイルです。
私はWPFやXAMLについては素人同然ですので、作りが悪いと思います。ご容赦ください。

````wpf_load_xaml.xml
<?xml version="1.0" encoding="UTF-8"?>
<Window
	xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
	xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
	Title="IronRuby"
	Width="400"
	Height="200">
	
	<StackPanel>
		<TextBlock Margin="0 15 0 10">あなたの氏名は？</TextBlock>
		<DockPanel Margin="5"><!-- 上下の空白を確保するのが目的 -->
			<DockPanel.Resources>
				<!-- TextBoxの枠線とテキストとの間に余白を確保するのが目的。TextBlockは余白パラメータを一致させて不揃いになるのを防ぐために設定。 -->
				<Style TargetType="TextBlock"><Setter Property="Padding" Value="5" /></Style>
				<Style TargetType="TextBox"><Setter Property="Padding" Value="5" /></Style>
			</DockPanel.Resources>
			<TextBox DockPanel.Dock="Right" MinWidth="150" >ななしの</TextBox>
			<TextBlock Margin="0 0 10 0" >苗字:</TextBlock>
		</DockPanel>
		<DockPanel Margin="5"><!-- 上下の空白を確保するのが目的 -->
			<DockPanel.Resources>
				<!-- TextBoxの枠線とテキストとの間に余白を確保するのが目的。TextBlockは余白パラメータを一致させて不揃いになるのを防ぐために設定。 -->
				<Style TargetType="TextBlock"><Setter Property="Padding" Value="5" /></Style>
				<Style TargetType="TextBox"><Setter Property="Padding" Value="5" /></Style>
			</DockPanel.Resources>
			<TextBox DockPanel.Dock="Right" MinWidth="150" >ごんべえ</TextBox>
			<TextBlock Margin="0 0 10 0" >名前:</TextBlock>
		</DockPanel>
	</StackPanel>
	
</Window>
````

次にコードです。
ネット上にたくさんあるC#で書かれたコードを参考にして、IronRubyに移植しただけです。

````wpf_load_xaml.rb
# coding: utf-8

require 'PresentationFramework'

include System::IO
include System::Windows
include System::Windows::Markup

stream = FileStream.new("wpf_load_xaml.xml", FileMode.Open, FileAccess.Read)

window = XamlReader.load(stream)

app = Application.new
app.run(window)
````

`wpf_load_xaml.xml`と`wpf_load_xaml.rb`は同じフォルダに保存してください。

## 実行方法

[1] DOS窓を開き、`wpf_load_xaml.rb`を実行します

```
> "C:\Program Files (x86)\IronRuby 1.1\bin\ir.exe" wpf_load_xaml.rb
```

[2] 次の図のような画面が出ます。見終わったら×ボタンを押して画面を閉じてください
![wpf_load_xaml.PNG](https://qiita-image-store.s3.amazonaws.com/0/304851/041bd28d-1a06-d59c-0ae9-389d79ec62a5.png)


# IronRubyスクリプト中に埋め込んだXAMLを使う例
Rubyのヒアドキュメントを使ってXAMLをスクリプト中に埋め込み、それをIronRubyに読み込ませて画面を表示します。

## コード
前述のXMLファイルをそのままヒアドキュメントを使ってスクリプト中に埋め込んでいます。
このコードもC#の例を参考にして移植しただけです。

````wpf_parse_xaml.rb
# coding: utf-8

require 'PresentationFramework'

include System::Windows
include System::Windows::Markup

XAML_SRC =<<ENDEND
<?xml version="1.0" encoding="UTF-8"?>
<Window
	xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
	xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
	Title="IronRuby"
	Width="400"
	Height="200">
	
	<StackPanel>
		<TextBlock Margin="0 15 0 10">あなたの氏名は？</TextBlock>
		<DockPanel Margin="5"><!-- 上下の空白を確保するのが目的 -->
			<DockPanel.Resources>
				<!-- TextBoxの枠線とテキストとの間に余白を確保するのが目的。TextBlockは余白パラメータを一致させて不揃いになるのを防ぐために設定。 -->
				<Style TargetType="TextBlock"><Setter Property="Padding" Value="5" /></Style>
				<Style TargetType="TextBox"><Setter Property="Padding" Value="5" /></Style>
			</DockPanel.Resources>
			<TextBox DockPanel.Dock="Right" MinWidth="150" >ななしの</TextBox>
			<TextBlock Margin="0 0 10 0" >苗字:</TextBlock>
		</DockPanel>
		<DockPanel Margin="5"><!-- 上下の空白を確保するのが目的 -->
			<DockPanel.Resources>
				<!-- TextBoxの枠線とテキストとの間に余白を確保するのが目的。TextBlockは余白パラメータを一致させて不揃いになるのを防ぐために設定。 -->
				<Style TargetType="TextBlock"><Setter Property="Padding" Value="5" /></Style>
				<Style TargetType="TextBox"><Setter Property="Padding" Value="5" /></Style>
			</DockPanel.Resources>
			<TextBox DockPanel.Dock="Right" MinWidth="150" >ごんべえ</TextBox>
			<TextBlock Margin="0 0 10 0" >名前:</TextBlock>
		</DockPanel>
	</StackPanel>
	
</Window>
ENDEND

window = XamlReader.parse(XAML_SRC)

app = Application.new
app.run(window)
````

## 実行方法

[1] DOS窓を開き、`wpf_parse_xaml.rb`を実行します

[2] 前述のXMLファイルをロードする場合と同じ画面が出ます。見終わったら×ボタンを押して画面を閉じてください

# 比較
私はXMLファイルとrbファイルの2つに分かれるのが嫌で、最初は埋め込み方式をとっていました。
しかし、次のような欠点があり、今は2つのファイルを使うことにしています。
・エディタがXML文書であると認識してくれないためツールの補助が受けられず、一度作った後の微調整がやりにくい
・XMLにエラーがあった時にエラーメッセージで正しい行番号を表示してくれないので、一度作った後の修正がやりにくい