FileExit.cs


class FileExit(MenuItem, Command):

  • System.Windows.Forms.MenuItem に代えて、System.Windows.Controls.MenuItem を拡張しています。


def __init__(self, frm):
self.Header = "Exit" # .Text
self.form = frm

  • Text に代えて、Header に値を設定しています。


def Execute(self):
self.form.Close()

  • Command の規定に従って、Execute を実現しています。

RedButton.cs


class RedButton(Button, Command):

  • System.Windows.Forms.Button に代えて、System.Windows.Controls.Button を拡張しています。


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 に変更しています。

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 を利用するまでの暫定措置になっています。

FileOpen.cs


class FileOpen(MenuItem, Command):

  • System.Windows.Forms.MenuItem に代えて、System.Windows.Controls.MenuItem を拡張しています。


def __init__(self):
self.Header = "Open" # .Text

  • Text に代えて、Header に値を設定しています。


def Execute(self):
fd = OpenFileDialog()
fd.ShowDialog()

  • Command の規定に従って、Execute を実現しています。

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 に子要素を追加しています。

《Note》Windows Forms → WPF

  • Menu を介して、メインメニューを設定するのではなく、StackPanel を利用して(上)メニューから順に各コントロールを配置しています。そのため、各コントロールは (StackPanel(Menu, Canvas(Button))) という階層構造になっています。


def commandClick(self, sender, e):
self._eventLog("commandClick", sender, e) # (@.@) keep a log
comd = sender
comd.Execute()
《Note》参考文献との違い

  • イベントに関するログ情報を確認できるようにしています。


def _eventLog(self, s, sender, e):
print ">>> %s"%s
for e in sender, e:
print "... %s"%e