RedButton.cs
class RedButton(Button, Command):
def Execute(self):
c = self.Parent
c.Background = Brushes.Red # .BackColor = Color
self.Background = Brushes.Yellow # .BackColor = Color (@.@) Yellow
- Command の規定に従って、Execute を実現しています。
- Color に代えて、Brushes を利用しています。
- BackColor に代えて、Background に値を設定しています。
《Note》
- 変化が分かりやすいように、Background を、LightGray から Yellow に変更しています。
《参考文献》
- C# Design Patterns 22. The Command Pattern.
ButtonMenu_WPF.py
- WPF アプリケーションとして、IronPython で実現した事例を紹介します。
# -*- coding: utf-8 -*-
#===============================================================================
# Copyright (C) 2000-2008, 小泉ひよ子とタマゴ倶楽部
#
# History: Design Pattern
# 2008/01/25, IronPython 1.1.1 (download)
# 2008/08/22, IronPython 1.1.2 (download)
# 2008/01/15, ver.1.0, Windows Forms
# 2008/03/21, ver.2.0, WPF
# 2008/10/05, ver.2.1, IronPython 1.1.2
#===============================================================================
import clr
clr.AddReference("System.Windows.Forms")
from System.Windows.Forms import OpenFileDialog # (@.@)
#
clr.AddReference("PresentationFramework")
clr.AddReference("PresentationCore")
from System.Windows import *
from System.Windows.Controls import *
from System.Windows.Media import *
《Note》暫定版
- System.Windows.Controls.OpenFileDialog を利用するまでの暫定措置になっています。
Command.cs
class Command: # interface Command
def Execute(self):
raise NotImplementedError("Execute")
- interface に代えて、例外 NotImplementedError を生成しています。
Form1.cs
class ButtonMenu_WPF(Window): # Form
- Form に代えて、Window を拡張しています。
def __init__(self, **args):
self.InitializeComponent()
self.init()def InitializeComponent(self):
self.btRed = self._btRed()
self._Controls()
def init(self):
evh = self.commandClick
self.btRed.Click += evh
file = MenuItem(Header="File") # MenuItem("File")
self.main.Items.Add(file) # .MenuItems
mnflo = FileOpen()
mnflo.Click += evh
fex = FileExit(frm=self)
fex.Click += evh
for e in mnflo, fex:
file.Items.Add(e) # .MenuItems
- Header に値を設定しています。
- MenuItems に代えて、Items にメニュー項目を追加します。
def _btRed(self):
e = RedButton(
Name = "btRed",
Width=75, Height=32, # Size = Size(75, 32)
Content = "Red", # .Text
)
Canvas.SetLeft(e, 88) # Location = Point(88, 48)
Canvas.SetTop (e, 48)
return e
- Size に代えて、Width/Height に値を設定しています。
- Text に代えて、Content に値を設定しています。
- Location に代えて、SetLeft/SetTop を利用しています。
def _Controls(self):
self.Width = 272 # ClientSize = Size(272, 141)
self.Height = 141
self.Content = StackPanel()
self.main = Menu() # MainMenu
canvas = Canvas(Width=self.Width, Height=self.Height)
for e in self.main, canvas:
self.Content.Children.Add(e)
canvas.Children.Add(self.btRed) # .Controls
- ClientSize に代えて、Width/Height に値を設定しています。
- StackPanel 内に、各コントロールを配置します。
- MainMenu に代えて、Menu を利用しています。
- Canvas 内に、各コントロールを配置します。
- Controls に代えて、Children に子要素を追加しています。
- Menu を介して、メインメニューを設定するのではなく、StackPanel を利用して(上)メニューから順に各コントロールを配置しています。そのため、各コントロールは (StackPanel(Menu, Canvas(Button))) という階層構造になっています。
《Note》参考文献との違い
def commandClick(self, sender, e):
self._eventLog("commandClick", sender, e) # (@.@) keep a log
comd = sender
comd.Execute()
- イベントに関するログ情報を確認できるようにしています。
def _eventLog(self, s, sender, e):
print ">>> %s"%s
for e in sender, e:
print "... %s"%e