情報を表示するためのコントロールは、コンテンツを1つだけを含むものと、複数の項目を含むものとに大別できます。また、コンテンツには、テキストだけでなく、他のコントロールも含まれます。

    System.Windows.FrameworkElement
    +-- System.Windows.Controls.Decorator
    +-- System.Windows.Controls.Panel
    +-- System.Windows.Controls.Control
        +-- System.Windows.Controls.ContentControl
        +-- System.Windows.Controls.ItemsControl

各コントロールは、コンテンツを管理するために、固有のプロパティーを持っています。
f02


関数 Walk
次に示す関数 Walk は、IronPython をダウンロードすると得られる、付属の Tutorial/avalon.py に含まれます。
《付記》ここでは、プロパティー Items を持つコントロールにも対処できるように、コードを追加しています。□
# _ants.py
def Walk(tree):
print ",",; yield tree
if hasattr(tree, 'Children'):
for child in tree.Children:
for x in Walk(child):
print "Children,",; yield x
elif hasattr(tree, 'Child'):
for x in Walk(tree.Child):
print "Child,",; yield x
elif hasattr(tree, 'Content'):
for x in Walk(tree.Content):
print "Content,",; yield x
# ----------------------------------------- append ---
elif hasattr(tree, 'Items'):
for item in tree.Items:
for e in Walk(item):
print "Items,",; yield e

引数に指定された tree を頂点とする階層構造に沿って、各要素を順に参照(と同時にトレース情報を出力)します。コンテンツとして、単一のデータ項目を含む Content/Child の場合には、それに対して関数 Walk を再帰的に適用します。また、複数のデータ項目を含む Items/Children の場合には、各データ項目 item/child を頂点とする各要素に対して、さらに関数 Walk を再帰的に適用します。
《参照》yield の詳細は、付録を参照してください。□
例題を使って、階層構造に沿ってコントロールを参照する方法を紹介します。


事例1:コンテンツモデル
アプリケーションを起動すると、次のようなウィンドウが現れます。
f03
> ipy.exe exWalk_ListBox.py
, System.Windows.Window
, Content, IronPython.NewTypes.System.Windows.Controls.ListBox_1 Items.Count:3
, Items, Content, red
, Items, Content, green
, Items, Content, blue

この出力から、次のようなコントロールの階層構造が形成されているのが分かります。
Window.Content
+-- ListBox_1. Items
+-- red
+-- green
+-- blue

最初に出力されるのは、コントロール Window です。そのプロパティー Content には、単一のコントロール(ListBox)が含まれます。次に、そのコントロールのプロパティー Items には、複数のコントロール(3つの文字列 red/green/blue)が含まれます。
分離コードを使って
def walk(tree):
for e in Walk(tree):
print e

if __name__ == "__main__":
win = Window(Title=__file__, Width=150, Height=100)
s = ListBox()
for e in "red", "green", "blue":
s.Items.Add(e)
win.Content = s
walk(win)
Application().Run(win)

Window は、単一のコントロールを保持するだけですが、ListBox は、複数のコントロールを保持できます。


事例2:コンテンツモデル
アプリケーションを起動すると、次のようなウィンドウが現れます。
f04
> ipy.exe exWalk_Border.py
, System.Windows.Window
, Content, System.Windows.Controls.Border
, Child, Content, System.Windows.Controls.StackPanel
, Children, Child, Content, System.Windows.Controls.Button: red
, Content, Children, Child, Content, red
, Children, Child, Content, System.Windows.Controls.Button: green
, Content, Children, Child, Content, green
, Children, Child, Content, System.Windows.Controls.Button: blue
, Content, Children, Child, Content, blue

この出力から、次のようなコントロールの階層構造が形成されているのが分かります。
Window.Content
+-- Border.Child
+-- StackPanel.Children
+-- Button.Content
+-- red
+-- Button.Content
+-- green
+-- Button.Content
+-- blue

Window の次に出力されるのは、コントロール Border です。そのプロパティー Child には、単一のコントロール(StackPanel)が含まれます。次に、そのコントロールのプロパティー Children には、複数のコントロール(3つのボタン Button/green/blue)が含まれます。
マークアップを使って






Border は、単一のコントロールを保持するだけですが、StackPanel は、複数のコントロールを保持できます。

  • -