「Xamarin.Macでモーダルウインドウを作成する」を編集中
ナビゲーションに移動
検索に移動
この編集を取り消せます。 下記の差分を確認して、本当に取り消していいか検証してください。よろしければ変更を保存して取り消しを完了してください。
最新版 | 編集中の文章 | ||
2行目: | 2行目: | ||
==概要== | ==概要== | ||
− | [[Mac OS X]]では一般的に[[Windows]] | + | [[Mac OS X]]では一般的に[[Windows]]風の[[モーダルウインドウ]]ではなく[[シート]](親ウインドウに固定されたモーダルウィンドウ)を使うらしいが、親ウインドウを見ながら項目入力したいのとの苦情が殺到した。シートは親ウインドウがどれか明確なのでウインドウ開きすぎな環境ではいいのかもしれないが、特定業務専用機と化している[[Mac]]には向かないようだ。そのためWindows風のモーダルウインドウを実現する方法を模索している。 |
− | |||
− | |||
==実装1== | ==実装1== | ||
===戻り値の準備=== | ===戻り値の準備=== | ||
− | [[モーダルウインドウ]]の[[戻り値]]用に[[WinForms]]のDialogResult風に[[列挙体]]を用意しておくと[[可読性]]が向上する気がする。<source lang="csharp"> | + | [[モーダルウインドウ]]の[[戻り値]]用に[[WinForms]]のDialogResult風に[[列挙体]]を用意しておくと[[可読性]]が向上する気がする。 |
+ | <source lang="csharp"> | ||
// モーダルウインドウの戻り値用 | // モーダルウインドウの戻り値用 | ||
public enum ModalResult | public enum ModalResult | ||
19行目: | 18行目: | ||
===親ウインドウから子ウインドウを呼び出す=== | ===親ウインドウから子ウインドウを呼び出す=== | ||
− | [[ | + | [[MonoMac]]で[[モーダルウインドウ]]を表示するには NSApplication.SharedApplication.RunModalForWindowメソッドを使うようだ。 |
+ | 親ウインドウは勝手に認識されている? | ||
+ | <source lang="csharp"> | ||
+ | public partial class MainWindowController : MonoMac.AppKit.NSWindowController | ||
+ | { | ||
+ | // 中略 | ||
+ | |||
+ | public override void WindowDidLoad() | ||
+ | { | ||
+ | base.WindowDidLoad(); | ||
+ | |||
+ | showSubWindowButton.Activated += (object sender, EventArgs e) => { | ||
+ | var sub = new SubWindowController(); | ||
+ | var ret = NSApplication.SharedApplication.RunModalForWindow(sub.Window); | ||
+ | if (ret == (int)ModalResult.OK) | ||
+ | { | ||
+ | Console.WriteLine("ok"); | ||
+ | } | ||
+ | }; | ||
+ | } | ||
+ | } | ||
+ | </source> | ||
===子ウインドウを閉じる=== | ===子ウインドウを閉じる=== | ||
− | + | 子ウインドウを閉じるにはNSApplication.SharedApplication.StopModalWithCodeメソッドを使うようだ。このメソッドを呼ばずに子ウインドウを閉じると親ウインドウに制御が戻らないので注意すること。 | |
− | + | この例では子ウインドウが普通に×ボタンで閉じる際に「ModalResult.OK」を返している。ダイアログ風にするのであればOKボタンやキャンセルボタンを用意して、それらが押した際にNSApplication.SharedApplication.StopModalWithCodeメソッド呼ぶとよいようだ。 | |
+ | <source lang="csharp"> | ||
public partial class SubWindowController : MonoMac.AppKit.NSWindowController | public partial class SubWindowController : MonoMac.AppKit.NSWindowController | ||
{ | { | ||
41行目: | 62行目: | ||
</source> | </source> | ||
− | なお、NSApplication.SharedApplication. | + | なお、NSApplication.SharedApplication.StopModalWithCodeはウインドウのモーダル化が解除されるだけでウインドウ自体は閉じない。ボタンなどを押されたときにモーダルウインドウを閉じる場合にはthis.Window.Closeを呼んでやると良いようだ。 |
+ | <source lang="csharp"> | ||
+ | ModalResult _result = ModalResult.Cancel; | ||
− | + | public override void AwakeFromNib() | |
− | + | { | |
− | + | base.AwakeFromNib(); | |
− | + | // ---------------------------------------------------- | |
− | + | this.Window.WillClose += (object sender, EventArgs e) => { | |
− | + | Console.WriteLine("WillClose"); | |
+ | NSApplication.SharedApplication.StopModalWithCode((int)_result); | ||
+ | }; | ||
− | // | + | // cancelButtonはInterfaceBuilderで貼付けたNSButton |
− | + | cancelButton.Activated += (object sender, EventArgs e) => { | |
+ | Console.WriteLine("cancelButton"); | ||
+ | _result = ModalResult.Cancel; | ||
+ | this.Window.Close(); | ||
+ | }; | ||
− | // | + | // cancelButtonはInterfaceBuilderで貼付けたNSButton |
− | + | okButton.Activated += (object sender, EventArgs e) => { | |
− | + | Console.WriteLine("okButton"); | |
− | </ | + | _result = ModalResult.OK; |
+ | this.Window.Close(); | ||
+ | }; | ||
+ | } | ||
+ | </source> | ||
==関連項目== | ==関連項目== |