第3章 Command パターン 4/4, IronPython
IronPython で学ぶ WPF プログラミングの世界《IronPython2.6》
《著》森こねこ・後藤いるか・小粒ちゃん《監修》小泉ひよ子とタマゴ倶楽部
第1版♪1995/07/02 ● 第2版♪2003/01/29 ● 第3版♪2008/04/28
■ 概要
WPF の特徴を活かして、デザインパターン
イベントに呼応するアクションを規定したいときには〈GoF〉Command パターンを導入します。すると、密接に関係する「イベント/アクション」対を、再利用可能な「部品」として扱えます。
《Note》IronPython1.x 用に作成したセミナー課題を、IronPython2.6 で再構成しました。
ソースとターゲットとの関係は
ルーティングイベントハンドラー Execute では、2つのオブジェクトを参照できます。
Execute | note |
---|---|
引数 sender | 実際にイベントハンドラーが起動されたオブジェクト |
プロパティー .Source | 最初にイベントが発生したオブジェクト |
ここで、イベントが発生したオブジェクトと、それを処理するオブジェクトが同じときには、sender/.Source は同じものを参照します。
たとえば、ボタン〔Red〕をクリックすると、次のように出力されるので、
>ipy.exe CommandToolBar.py sender: System.Windows.Controls.Button: Red Source: System.Windows.Controls.Button: Red ...
ソース/ターゲットはともに、ボタン Button になるのが分かります。
# routedCommandToolBar2.py
class ExWindow(Window):
def init(self):
...
for content, command, toolBar in [
...
self.CommandBindings.Add(binding) # (@.@) here goes...
そこで、ターゲットをボタン button から、ウィンドウ self に変更すると、
class PaintColor(RoutedCommand):
def Execute(self, sender, e):
print "sender:", sender
print "Source:", e.Source
e = e.Source.Content # (@.@) here goes...
self.panel.Background = getattr(Brushes, e)
イベントハンドラー Execute では、それを呼び出したオブジェクト sender に代えて、イベントが発生したオブジェクト e.Source から、必要な情報を獲得できます。すると、
>ipy.exe CommandToolBar2.py CommandToolBar.xaml sender: IronPython.NewTypes.System.Windows.Window_2 Source: System.Windows.Controls.Button: Red ...
Execute | note | control |
---|---|---|
引数 sender | 実際にイベントハンドラーが起動されたオブジェクト | Window |
プロパティー .Source | 最初にイベントが発生したオブジェクト | Button |
ソースはボタンに、ターゲットはウィンドウになるのが分かります。つまり、階層構造の末端にあるボタンから、その頂点にあるウィンドウまで遡って、ルーティングイベントハンドラーが起動されたことになります。