ここでは YKToolkit 開発にまつわる日記的なものを掲載しています。
いわば自分用メモみたいなものもあれば、「こんなテク使ったよ」的なことも載せます。
2015.04.10 - 子ウィンドウを作ってみた
唐突に更新された YKToolkit.Controls.dll Ver.1.11.0.0 ですが、
ParentPanel および ChildWindow コントロールがなんの説明もなく追加されています。
これらは子ウィンドウを実現するためのコントロールです。
さすがに誰も使えないだろうと思うので、
とりあえずこちらにサンプルコードを載せておきます。ああ、説明書も更新しなきゃ...
そもそも子ウィンドウとはなんなのか。
Excel や Word なんかで複数のファイルを開いたとき、
それぞれのファイルに対してウィンドウが与えられますよね。
そのウィンドウは Excel 本体のウィンドウの中であれば自由に移動できるし、リサイズもできます。
そんなウィンドウをここでは子ウィンドウと呼んでいます。
こういう子ウィンドウを WPF でもできないかな〜なんて思ってしまったのがきっかけで、
ただなんとなく作ってしまったのが今回の更新に含まれています。
そんなわけでかなり中途半端かつオレオレコントロールになっています。
とにかく子ウィンドウを表示したいんだい!という場合は Canvas コントロールの上に
ChildWindow コントロールを配置します。
実行してみると、次のように 3 つの子ウィンドウが表示されます。
一応ウィンドウのようなコントロール外観となっており、
タイトルバーをドラッグすれば移動できるし、
境界線をドラッグすればリサイズもできるようになっています。
最大化ボタンを押せば Canvas コントロールいっぱいにリサイズされます。
しかし、閉じるボタンを押しても閉じてくれません。ここからじわじわとオレオレ仕様に突入します。
閉じるボタンが効かない現象についてなんのフォローもなく、唐突に ParentPanel を導入します。
ParentPanel は IChildWindow インターフェースを実装したクラスを対象とした ItemsSource プロパティを持っています。
というわけでまずサンプルとして次のような Person クラスを用意します。
サンプルとして動けばいいので INotifyPropertyChanged とかあんまり考えていません。それから Closed イベントが定義してあるところでなんとなくお察しいただけるでしょうか。
次にこれを扱う ViewModel 側のコードです。
Person クラスの追加は AddCommand コマンドで、
削除は Closed イベントが発生したときにおこないます。
そして有無を言わさず View の XAML を次のように書きます。
ParentPanel の ItemsSource プロパティに People プロパティをデータバインドしています。
また、ItemTemplate プロパティには、子ウィンドウのコンテンツ表示に対する DataTemplate が指定できます。
そんなわけで実行結果がこちら。
以上子ウィンドウ表示のための ParentPanel および ChildWindow コントロールでした... で終わるのもアレなので、少し雑談を。
そもそも子ウィンドウを WPF で実現させようと思ったきっかけは、冒頭でも書いたように、
Excel や Word なんかで見るいわゆる MDI 形式なアプリケーションを使っていた時です。
WPF は確か公式でも MDI はサポートしないよと言われてしまったフレームワークですが、
別にできないよとは言われていません。
つまり、サポートされなければ自作すればいいじゃないというスタンスです。
というわけで MDI 形式に耐えられる枠組みを考えようかと。
そして真っ先に手を付けられるのがこの子ウィンドウの実現でした。
そもそもこれができないと MDI の枠組みを考えたところで無意味ですし。
で、とりあえずそれっぽいものができて嬉しくなったのでついうっかりライブラリに追加してしまいました。反省。
MDI として機能させるためには何が必要か。
- 子ウィンドウの表示 <- とりあえずできた
- 子ウィンドウの管理 <- ViewModel が持つコレクション
- 切り替えのためのウィンドウメニュー <- 機能は ViewModel で実現
- タブ機能 <- TabControl をカスタマイズ
なんだ、後はほとんど ViewModel でやることじゃん。
TabControl のカスタマイズはライブラリとして用意したほうがいいのかなぁ。めんどいなぁ。
こうして考えてみると後は MDI として作り込むための雛形があればもうできるんじゃないか。
というわけでやってみる ... 時間はないので適当に作ったバイナリエディタのスクショを投下して逃げます。
MDI を完成させるのは実業務でない限りやる気も気合いも出ないなぁ。