け〜くんこと K.Ktouth のだらだらした日常と突発的に作るプログラムや読み物とかの雑多サイト
XAMLとWPFの勉強中……
画面設計は試行錯誤しつつ進行中。
が、メニューのイベントハンドラのバインドさせるのに丸一日かかりました(笑)
以下、自分メモ。
Delphi(VCL)ではだいぶん前に実装されていたアクション機能。WPFでようやく実装された模様。
で、コレによってXAML(ウィンドウ構成)とC#(実装)が明確に分けられるように。
一般的なアプリケーションで使用される用なコマンドは標準で準備されているので、あとはそのコマンドに対応するイベントハンドラをつくってコマンドと対応づけるだけという、簡単操作。
public partial class MainWindow : Window
{
public MainWindow() {
:
:
CommandBinding bind = new new CommandBinding(ApplicationCommands.Close, DoClose);
this.CommandBindings.Add(bind);
}private void DoClose(object sender, ExecutedRoutedEventArgs e)
{
Close();
}
}
CommandBindingのコマンドとイベントハンドラを引数にインスタンスを生成。
WPFのイベントは投げられた要素だけでなく、その要素の親要素にも伝播していく(ルートは当然Window)ので、今回は生成したインスタンスをWindowのCommandBindingsに登録。
これで、標準コマンド[ ApplicationCommands.Close ]の実装を宣言できたので、次はXAML側での定義。
<Menu>
<MenuItem Header="ファイル(_F)">
<MenuItem Header="終了(_X)" Command="Close" />
</MenuItem>
</Menu>
今回はシンプルなメニューで定義。標準で準備されているコマンドは文字表記で簡単に参照可能。
ちなみにコマンドに実装がバインドされていない場合、自動的にdisabledになる。
しかし、バージョン情報の表示など、標準コマンドに適当なものがない場合、コマンドを自作する必要がある。
# もちろんコマンドを使用せず、メニューなどに直接イベントハンドラを登録する方法もある。
public partial class MainWindow : Window
{
public readonly static RoutedUICommand About;
static MainWindow()
{
About = new RoutedUICommand("バージョン情報を表示します", "About", typeof(MainWindow));
}public MainWindow() {
:
:
this.CommandBindings.Add(new CommandBinding(MainWindow.About, delegate(object sender, ExecutedRoutedEventArgs e)
{
MessageBox.Show("バージョン情報");
}));
}
まず、コマンドの生成。特定クラスのreadonly静的変数として定義するのが一般的らしい。
readonly属性がついているので、当然クラスコンストラクタを準備してその中で初期化する。やりかたは依存プロパティのキー作成とほぼ一緒。
イベントハンドラのバインドは標準コマンドへのバインドと同じ。単純なものなら上記のような無名デリゲートを使うほうが早いかも。
<Window x:Class="Example.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:app="clr-namespace:Example">
:
:
<Menu>
<MenuItem Header="ヘルプ(_F)">
<MenuItem Header="バージョン情報(_A)" Command="{x:Static app:MainWindow.About}" />
</MenuItem>
</Menu>
:
:
</Window>
ちょっと追加処理が必要なのがXAML側。
まず、標準のままでは独自コマンドが認識できない。名前空間の修飾が必要なので、ルート要素にxmlns:app名前空間属性を追加。
次にコマンドの参照。標準コマンドと違い、stringからの変更はきかないようなのでコード定義に頼る。
アプリケーションでの実装機能などを呼び出す事はよくあると思うので、名前空間はさっさと追加しておくのが一番らしい。
OVA『バカとテストと召喚獣 〜祭〜』上巻 [Blu-ray]
(メディアファクトリー)
新品 ¥ 4,409
中古 ¥ 3,680
OVA『バカとテストと召喚獣 〜祭〜』下巻 [Blu-ray]
(メディアファクトリー)
新品 ¥ 4,438
中古 ¥ 2,980
生徒会役員共DJCD「アニメ生徒会役員共が全部わかるラジオ、略して全ラ!...
(キングレコード)
新品 ¥ 2,253
中古 ¥ 1,850
WORKING!! 9 初回限定特装版 (SEコミックスプレミアム)
(高津 カリノ)
新品 ¥ 2,896
中古 ¥ 2,835
「声優グランプリ」公認!声優界<雀王>決定戦! <J-1グランプリ> V...
(オムニバス)
新品 ¥ 3,159
中古 ¥ 3,099
デッドライジング 2【CEROレーティング「Z」】
(カプコン)
新品 ¥ 2,740
中古 ¥ 1,014
スプリンターセル コンヴィクション
(ユービーアイ ソフト)
新品 ¥ 2,979
中古 ¥ 1,397
Xbox 360 250GB
(マイクロソフト)
新品 ¥ 34,980
中古 ¥ 25,400
学園黙示録 HIGHSCHOOL OF THE DEAD 7 オリジナル...
(佐藤 大輔)
新品 ¥ 9,800
中古 ¥ 4,797
学園黙示録 HIGHSCHOOL OF THE DEAD SECRET ...
(佐藤 大輔)
中古 ¥ 2,500
ソードアート・オンライン〈5〉ファントム・バレット (電撃文庫)
(川原 礫)
新品 ¥ 578
中古 ¥ 692
RPG W(・∀・)RLD6 ―ろーぷれ・わーるど― (富士見ファンタ...
(吉村 夜)
新品 ¥ 651
中古 ¥ 1
魔法少女リリカルなのはViVid (3)限定版 (角川コミックス・エース...
(藤真 拓哉)
新品 ¥ 1,680
中古 ¥ 1,338
魔法戦記リリカルなのはForce (3)限定版 (角川コミックス・エース...
(緋賀 ゆかり)
新品 ¥ 1,680
中古 ¥ 418
ダンジョンズ&ドラゴンズ第4版スターター・セット
(ジェームズ ワイアット)
新品 ¥ 4,980
中古 ¥ 4,311
アリアンロッド・サガ・リプレイ(5) 激闘のピースメイカー (富士見ド...
(菊池 たけし/F.E.A.R.)
新品 ¥ 693
中古 ¥ 190
アリアンロッド・サガ・コンチェルト 1 (電撃コミックス)
(佐々木 あかね)
新品 ¥ 599
中古 ¥ 90
堀さんと宮村くん(7)(ガンガンコミックスONLINE)
(HERO)
新品 ¥ 1,000
中古 ¥ 747
浅尾さんと倉田くん(3)(ガンガンコミックスONLINE)
(HERO)
新品 ¥ 690
中古 ¥ 370
7と嘘吐きオンライン―HERO個人作品集―(ガンガンコミックスONLIN...
(HERO)
新品 ¥ 710
中古 ¥ 158
ONE PIECE 65 (ジャンプコミックス)
(尾田 栄一郎)
NARUTO―ナルト― 59 (ジャンプコミックス)
(岸本 斉史)
ワンピース 海賊無双(通常版)(初回特典:オリジナルカスタムテーマ9種DLコード、ソーシャルゲーム専用レアフィギュア用コード同梱)
(バンダイナムコゲームス)
ドラゴンズドグマ(数量限定特典『バイオハザード6』体験版用DLコード同梱)
(カプコン)