「Xamarin.Macでモーダルウインドウを作成する」を編集中

ナビゲーションに移動 検索に移動

警告: ログインしていません。編集を行うと、あなたの IP アドレスが公開されます。ログインまたはアカウントを作成すれば、あなたの編集はその利用者名とともに表示されるほか、その他の利点もあります。

この編集を取り消せます。 下記の差分を確認して、本当に取り消していいか検証してください。よろしければ変更を保存して取り消しを完了してください。

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

MonoBookへの投稿はすべて、他の投稿者によって編集、変更、除去される場合があります。 自分が書いたものが他の人に容赦なく編集されるのを望まない場合は、ここに投稿しないでください。
また、投稿するのは、自分で書いたものか、パブリック ドメインまたはそれに類するフリーな資料からの複製であることを約束してください(詳細はMonoBook:著作権を参照)。 著作権保護されている作品は、許諾なしに投稿しないでください!

このページを編集するには、下記の確認用の質問に回答してください (詳細):

取り消し 編集の仕方 (新しいウィンドウで開きます)

このページで使用されているテンプレート:

このページは 1 個の隠しカテゴリに属しています: