第6章 WrapPanel 1/1
C#.use(better, IronPython=”WPF”) 《記事一覧》
WrapPanel
何が問題か:分離コードを使って
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
リファクタリングを実践して、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
■
WrapPanel は、子要素を順に配置します。配置できる子要素の数は無制限ですが、親の大きさが変化すると、中に収まるように子要素を調整します。