何が問題か:分離コードを使って

XAML と比べて、分離コードを素の IronPython(--before--)で記述すると、冗長になりがちです。そこで、これを拡張した IronPython(--after--)で記述したものとを比較検討します。

# apeStackPanel.py ------------------------------------ before ---
parent = StackPanel(
Orientation=Orientation.Horizontal, ...)
child = StackPanel(Orientation=Orientation.Vertical)
parent.Children.Add(child)

# catStackPanel.py ------------------------------------ after ----
parent = ExStackPanel(None,
orientation="Horizontal", ...)
child = ExStackPanel(parent, orientation="Vertical")

分離コードでは、プロパティー Orientation= の値を指定するときには、静的プロパティー Orientation.Vertical を指定する必要があります。このとき、XAML と同様に文字列を指定できると便利です。そこで、新たにキーワード orientation= を導入して、その値に文字列 "Horizontal" を指定できるようにします。
分離コードでは、親子関係を築くのに、親要素のプロパティー Children を介して、子要素を追加 Add する必要があります。このとき、XAML と同様の入れ子構造を指定できると便利です。そこで、新たな引数を導入して、子要素を生成するときに親要素 parent を指定できるようにします。ただし、親要素が不要なら、None を指定します。

# apeStackPanel.py ------------------------------------ before ---
e = Button(Content="red")
child.Children.Add(e)

# catStackPanel.py ------------------------------------ after ----
ExButton(child, "red")

分離コードでは、ボタンに表示する文字列を指定するときに、プロパティー Content= を利用する必要があります。このとき、XAML と同様に文字列だけで指定できると便利です。そこで、キーワードを省略すると、表示する文字列を指定したものと見なされるようにします。

事例:StackPanel

例題を使って、StackPanel を利用する方法を紹介します。


>ipy.exe cat.py xStackPanel.xaml

このアプリケーションを起動すると、ウィンドウの中に6つのボタンが表示されます。ここで着目して欲しいのは(ウィンドウの中に収まらない)最後のボタン yellow の一部が、表示されないことです。
《付記》XAML ファイルをダブルクリックしても、起動できます。□

マークアップ:StackPanel

パネル(親要素)の中に、別のパネル(子要素)を配置します。

  <StackPanel Width="200" Height="100" Orientation="Horizontal">
<StackPanel Orientation="Vertical">




<StackPanel Orientation="Horizontal">




プロパティー Orientation= には、子要素を配置する方向を指定します。まず、ボタン red/green/blue を縦方向 Vertical に配置します。次に、ボタン cyan/magenta/yellow を横方向 Horizontal に配置します。すると、前述したウィンドウが現れます。

リファクタリング:StackPanel

リファクタリングを実践して、XAML と同等の簡潔な表現ができるようにします。

# catStackPanel.py
class ExStackPanel(StackPanel, ExPanel):
def __init__(self, parent, orientation=None, **args):
if orientation:
self.Orientation = getattr(Orientation, orientation)
self._init(parent)

このクラスでは、既存の StackPanel を再利用するとともに、共通の ExPanel が提供する mix-in 操作を使って拡張します。キーワード引数 orientation= を導入して、方向を文字列で指定できるようにします。


1/1