今までGUIアプリケーションといえば、C++BuilderでVCLを使って作ったり、VC++でMFCを使って作ったり、JavaでSwingを使って作ったり、.NETでWindowsFormsを使って作ったりしてきた。
今のWPFは勉強中なので、何かまとまったもとを作ったか?といわれると作ってない!
話は変わってコマンドです。
WindowsFormsで何かを作ろうとしたときには、毎回コマンドインターフェースを定義してとかっていうことをやってた。
(毎回というほど作りこんで無いけど)
Idleイベントを捕まえて表示を更新したりする仕組みとか、Executeメソッドを定義してメニューがおされたら特定のコマンドのExecuteが呼ばれるとかいうのを作りこんだ。
WPFでは?コマンドが用意されています。
すばらしい!!しかも、自分で作るなんちゃってクラスよりもきっといいもののはずだ。
ということで、超基本のSystem.Windows.Input.ICommandインターフェースから見ていこうと思う。
このインターフェースは、ExecuteとCanExecuteの2つのメソッドと、CanExecuteChangedイベントが定義されているだけのシンプル設計。コードで書くとしたらこんな感じ?
interface ICommand
{
void Execute(object parameter);
bool CanExecute(object parameter);
event EventHandler CanExecuteChanged;
}
未コンパイルなので間違いがあっても知らない!イメージだけ。
とりあえず、使ってみようと思う。
作ってみるのは、以下のような仕様のクラス。
"print 表示したい文字列"という文字列を受け取ると"表示したい文字列"の部分を標準出力へ出力する。
それ以外の文字列が渡された場合は、CanExecuteがfalseを返す。
さくっと作る。
class PrintCommand : ICommand
{
private static readonly Regex PATTERN = new Regex(@"^print (?<param>.+)$");
public bool CanExecute(object parameter)
{
string input = parameter as string;
if (input == null)
{
return false;
}
return PATTERN.IsMatch(input);
}
public event EventHandler CanExecuteChanged; // 今回は使いません
public void Execute(object parameter)
{
Match match = PATTERN.Match(parameter as string);
Console.WriteLine(match.Groups["param"].Value);
}
}
動きを確認するためのテスト用メインメソッド
class Program
{
static void Main(string[] args)
{
string input = Console.ReadLine();
ICommand command = new PrintCommand();
if (command.CanExecute(input))
{
command.Execute(input);
}
}
}
実行すると
print Hello world ← これを入力
Hello world
みたいになる。
こういう基本的だけど、みんなが作りそうなクラスがあらかじめ用意されているというのはすばらしいことだね。
これを見て感じることは、毎回ICommandを実装するの??ということだけど、そんなことは勿論無い。
でも眠いので今日はここまで。