メインメニューを開く

差分

Xamarin.Macでモーダルウインドウを作成する

460 バイト除去, 2018年8月7日 (火) 01:59
編集の要約なし
[[MonoMac]]および[[Xamarin.Mac]]で[[モーダルウインドウ]]を表示する。
==実装例1概要==[[Mac OS X]]では一般的に[[Windows]]風の「[[モーダルウインドウ]]」ではなく「[[シート]]」(親ウインドウに固定されたモーダルウィンドウ)を使うらしい。シートは親ウインドウに張り付くため、どれか親ウィンドウなのか明確なのでウインドウ開きすぎなグダグダな環境では良いとされている。 しかしながらが、特定業務専用機と化している[[Mac]]では親ウインドウを見ながら項目入力したいのとの苦情が殺到した。そのためWindows風のモーダルウインドウを実現する方法を模索した。 ==実装1==
===戻り値の準備===
[[モーダルウインドウ]]の[[戻り値]]用に[[WinForms]]のDialogResult風に[[列挙体]]を用意しておくと[[可読性]]が向上する気がする。<source lang="csharp">
// モーダルウインドウの戻り値用
public enum ModalResult
===親ウインドウから子ウインドウを呼び出す===
MonoMacで[[Xamarin.Mac]]で[[モーダルウインドウ]]を表示するには NSApplicationを表示するには「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>RunModalForWindowメソッド」を使うようだ。親ウインドウは勝手に認識されている?
===子ウインドウを閉じる===
子ウインドウを閉じるにはNSApplication子ウインドウを閉じるには「NSApplication.SharedApplication.StopModalWithCodeメソッドを使うようだ。このメソッドを呼ばずに子ウインドウを閉じると親ウインドウに制御が戻らないので注意すること。StopModalWithCodeメソッド」を使うようだ。このメソッドを呼ばずに子ウインドウを閉じると親ウインドウに制御が戻らないので注意すること。
この例では子ウインドウが普通に×ボタンで閉じる際に「ModalResultこの例では子ウインドウが普通に「×ボタン」で閉じる際に「ModalResult.OK」を返している。ダイアログ風にするのであればOKボタンやキャンセルボタンを用意して、それらが押した際にNSApplication.SharedApplication.StopModalWithCodeメソッド呼ぶとよいようだ。<source lang="csharp">
public partial class SubWindowController : MonoMac.AppKit.NSWindowController
{
</source>
なお、NSApplication.SharedApplication.StopModalWithCodeはウインドウのモーダル化が解除されるだけでウインドウ自体は閉じない。ボタンなどを押されたときにモーダルウインドウを閉じる場合にはthisStopModalWithCodeメソッドはウインドウのモーダル化が解除されるだけでウインドウ自体は閉じない。ボタンなどを押されたときにモーダルウインドウを閉じる場合にはthis.Window.Closeを呼んでやると良いようだ。<source lang="csharp"> ModalResult _result = ModalResult.Cancel;
public override void AwakeFromNib=== 表示してみる ===<syntaxhighlight lang="csharp">// ダイアログ生成var dialog = new SubWindowController();  {// LoadWindowでawakeNibなどの初期化処理が呼ばれる basedialog.AwakeFromNibLoadWindow(); // ----------------------------------------------------
this// ウインドウを最前面にしておく(不要かもしれない)dialog.Window.WillClose += MakeKeyAndOrderFront(object sender, EventArgs e) => { Console.WriteLine("WillClose"this); NSApplication.SharedApplication.StopModalWithCode((int)_result); };
// cancelButtonはInterfaceBuilderで貼付けたNSButtonモーダル表示実行 cancelButtonNSApplication.Activated += (object sender, EventArgs e) => { ConsoleSharedApplication.WriteLineRunModalForWindow("cancelButton"); _result = ModalResult.Cancel; thisdialog.Window.Close(); };
// cancelButtonはInterfaceBuilderで貼付けたNSButton okButton.Activated += (object sender, EventArgs e) => { Console.WriteLine("okButton"); _result = ModalResult.OK; this.Window.Close(); }; }</sourcesyntaxhighlight>
==関連項目==
[[category:MonoMac]]
[[category:Xamarin.Mac]]
匿名利用者