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

提供: MonoBook
ナビゲーションに移動 検索に移動
57行目: 57行目:
 
         }
 
         }
 
     }
 
     }
 +
</source>
 +
 +
なお、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.Activated += (object sender, EventArgs e) => {
 +
                Console.WriteLine("cancelButton");
 +
                _result = ModalResult.Cancel;
 +
                this.Window.Close();
 +
            };
 +
 +
            okButton.Activated += (object sender, EventArgs e) => {
 +
                Console.WriteLine("okButton");
 +
                _result = ModalResult.OK;
 +
                this.Window.Close();
 +
            };
 +
        }
 
</source>
 
</source>
  

2015年2月4日 (水) 08:14時点における版

MonoMacモーダルウインドウを表示する。

実装例1

戻り値の準備

モーダルウインドウ戻り値用にWinFormsのDialogResult風に列挙体を用意しておくと可読性が向上する気がする。

    // モーダルウインドウの戻り値用
    public enum ModalResult
    {
        Unknown = 0,
        OK = 1,
        Cancel = 2,
    }

親ウインドウから子ウインドウを呼び出す

MonoMacでモーダルウインドウを表示するには NSApplication.SharedApplication.RunModalForWindowメソッドを使うようだ。 親ウインドウは勝手に認識されている?

    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");
                }
            };
        }
    }

子ウインドウを閉じる

子ウインドウを閉じるにはNSApplication.SharedApplication.StopModalWithCodeメソッドを使うようだ。このメソッドを呼ばずに子ウインドウを閉じると親ウインドウに制御が戻らないので注意すること。

この例では子ウインドウが普通に×ボタンで閉じる際に「ModalResult.OK」を返している。ダイアログ風にするのであればOKボタンやキャンセルボタンを用意して、それらが押した際にNSApplication.SharedApplication.StopModalWithCodeメソッド呼ぶとよいようだ。

    public partial class SubWindowController : MonoMac.AppKit.NSWindowController
    {
        // 中略

        public override void AwakeFromNib()
        {
            base.AwakeFromNib();

            this.Window.WillClose += (object sender, EventArgs e) => {
                Console.WriteLine("willClose");
                NSApplication.SharedApplication.StopModalWithCode((int)ModalResult.OK);
            };
        }
    }

なお、NSApplication.SharedApplication.StopModalWithCodeはウインドウのモーダル化が解除されるだけでウインドウ自体は閉じない。ボタンなどを押されたときにモーダルウインドウを閉じる場合にはthis.Window.Closeを呼んでやると良いようだ。

        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.Activated += (object sender, EventArgs e) => {
                Console.WriteLine("cancelButton");
                _result = ModalResult.Cancel;
                this.Window.Close();
            };

            okButton.Activated += (object sender, EventArgs e) => {
                Console.WriteLine("okButton");
                _result = ModalResult.OK;
                this.Window.Close();
            };
        }

関連項目

参考文献