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

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

# apeWrapPanel.py ------------------------------------- before ---
parent = WrapPanel(Background=Brushes.Beige,

# catWrapPanel.py ------------------------------------- after ----
parent = ExWrapPanel(None, background="Beige",

分離コードでは、プロパティー Background= の値を指定するときには、静的プロパティー Brushes.Beige を指定する必要があります。このとき、XAML と同様に文字列を指定できると便利です。そこで、新たなキーワード background= を導入して、その値に文字列 "Beige" を指定できるようにします。

# apeWrapPanel.py ------------------------------------- before ---
child = Button(Content="200", Width=200)
parent.Children.Add(child)

# catWrapPanel.py ------------------------------------- after ----
ExButton(parent, 200, Width=200)

分離コードでは、ボタンに表示する文字列を指定するときに、プロパティー Content= を利用する必要があります。このとき、XAML と同様に文字列だけで指定できると便利です。そこで、キーワードを省略すると、表示する文字列を指定したものと見なされるようにします。
分離コードでは、親子関係を築くのに、親要素のプロパティー Children を介して、子要素を追加 Add する必要があります。このとき、XAML と同様の入れ子構造を指定できると便利です。そこで、新たな引数を導入して、子要素を生成するときに親要素 parent を指定できるようにします。ただし、親要素が不要なら、None を指定します。

事例:WrapPanel

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


>ipy.exe cat.py xWrapPanel.xaml

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

マークアップ:WrapPanel

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

  




プロパティー Background= には、背景を描くときの色を文字列で指定します。まず、幅 200 のボタンを1つ配置します。次に、幅 80 のボタンを3つ配置します。 このとき、最後のボタンは、幅 200 の親パネルの中に収まるように、そこで折り返されます。すると、前述したウィンドウが現れます。

リファクタリング:WrapPanel

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

# catWrapPanel.py
class ExWrapPanel(WrapPanel, ExPanel):
def __init__(self, parent, background=None, **args):
ExPanel._init(self, parent, background=background)

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

# _cat.py
class ExPanel:
def _init(self, parent, ...
background=None, **args):

if background:
self.Background = getattr(Brushes, background)

キーワード引数 background= は、プロパティー Background= に対応するもので、指定した文字列から色情報を獲得するときの実現方法 Brushes を隠蔽します。
《参照》引数 **args の意味は、付録で解説します。□


1/1