第6章 StackPanel 1/1
C#.use(better, IronPython=”WPF”) 《記事一覧》
StackPanel
何が問題か:分離コードを使って
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 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
■
StackPanel は、子要素をスタック内に配置します。配置できる子要素の数は無制限ですが、その中に収まらない部分は、表示されません。