「Xamarin.Macでモーダルウインドウを作成する」の版間の差分

imported>Administrator
imported>Administrator
編集の要約なし
2行目: 2行目:


==概要==
==概要==
[[Mac OS X]]では一般的に[[Windows]]風の[[モーダルウインドウ]]ではなく[[シート]](親ウインドウに固定されたモーダルウィンドウ)を使うらしい。シートは親ウインドウがどれか明確なのでウインドウ開きすぎな環境ではよいよいだ。
[[Mac OS X]]では一般的に[[Windows]]風の「[[モーダルウインドウ]]」ではなく「[[シート]]」(親ウインドウに固定されたモーダルウィンドウ)を使うらしい。シートは親ウインドウに張り付くため、どれか親ウィンドウなのか明確なのでウインドウ開きすぎなグダグダな環境では良いとされている。


しかしながらが、特定業務専用機と化している[[Mac]]では親ウインドウを見ながら項目入力したいのとの苦情が殺到した。そのためWindows風のモーダルウインドウを実現する方法を模索している。
しかしながらが、特定業務専用機と化している[[Mac]]では親ウインドウを見ながら項目入力したいのとの苦情が殺到した。そのためWindows風のモーダルウインドウを実現する方法を模索した。


==実装1==
==実装1==
===戻り値の準備===
===戻り値の準備===
[[モーダルウインドウ]]の[[戻り値]]用に[[WinForms]]のDialogResult風に[[列挙体]]を用意しておくと[[可読性]]が向上する気がする。
[[モーダルウインドウ]]の[[戻り値]]用に[[WinForms]]のDialogResult風に[[列挙体]]を用意しておくと[[可読性]]が向上する気がする。<source lang="csharp">
<source lang="csharp">
     // モーダルウインドウの戻り値用
     // モーダルウインドウの戻り値用
     public enum ModalResult
     public enum ModalResult
20行目: 19行目:


===親ウインドウから子ウインドウを呼び出す===
===親ウインドウから子ウインドウを呼び出す===
[[MonoMac]]で[[モーダルウインドウ]]を表示するには NSApplication.SharedApplication.RunModalForWindowメソッドを使うようだ。
[[Xamarin.Mac]]で[[モーダルウインドウ]]を表示するには「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メソッドを使うようだ。このメソッドを呼ばずに子ウインドウを閉じると親ウインドウに制御が戻らないので注意すること。
子ウインドウを閉じるには「NSApplication.SharedApplication.StopModalWithCodeメソッド」を使うようだ。このメソッドを呼ばずに子ウインドウを閉じると親ウインドウに制御が戻らないので注意すること。


この例では子ウインドウが普通に×ボタンで閉じる際に「ModalResult.OK」を返している。ダイアログ風にするのであればOKボタンやキャンセルボタンを用意して、それらが押した際にNSApplication.SharedApplication.StopModalWithCodeメソッド呼ぶとよいようだ。
この例では子ウインドウが普通に「×ボタン」で閉じる際に「ModalResult.OK」を返している。ダイアログ風にするのであればOKボタンやキャンセルボタンを用意して、それらが押した際にNSApplication.SharedApplication.StopModalWithCodeメソッド呼ぶとよいようだ。<source lang="csharp">
<source lang="csharp">
     public partial class SubWindowController : MonoMac.AppKit.NSWindowController
     public partial class SubWindowController : MonoMac.AppKit.NSWindowController
     {
     {
64行目: 41行目:
</source>
</source>


なお、NSApplication.SharedApplication.StopModalWithCodeはウインドウのモーダル化が解除されるだけでウインドウ自体は閉じない。ボタンなどを押されたときにモーダルウインドウを閉じる場合にはthis.Window.Closeを呼んでやると良いようだ。
なお、NSApplication.SharedApplication.StopModalWithCodeメソッドはウインドウのモーダル化が解除されるだけでウインドウ自体は閉じない。ボタンなどを押されたときにモーダルウインドウを閉じる場合にはthis.Window.Closeを呼んでやると良いようだ。<source lang="csharp">
<source lang="csharp">
         ModalResult _result = ModalResult.Cancel;
         ModalResult _result = ModalResult.Cancel;