「Xamarin.Macでモーダルウインドウを作成する」の版間の差分
ナビゲーションに移動
検索に移動
2行目: | 2行目: | ||
==実装例1== | ==実装例1== | ||
+ | ===戻り値の準備=== | ||
[[モーダルウインドウ]]の[[戻り値]]用に[[WinForms]]のDialogResult風に[[列挙体]]を用意しておくと[[可読性]]が向上する気がする。 | [[モーダルウインドウ]]の[[戻り値]]用に[[WinForms]]のDialogResult風に[[列挙体]]を用意しておくと[[可読性]]が向上する気がする。 | ||
<source lang="csharp"> | <source lang="csharp"> | ||
13行目: | 14行目: | ||
</source> | </source> | ||
+ | ===親ウインドウから子ウインドウを呼び出す=== | ||
MonoMacで[[モーダルウインドウ]]を表示するには NSApplication.SharedApplication.RunModalForWindowメソッドを使うようだ。 | MonoMacで[[モーダルウインドウ]]を表示するには NSApplication.SharedApplication.RunModalForWindowメソッドを使うようだ。 | ||
親ウインドウは勝手に認識されている? | 親ウインドウは勝手に認識されている? | ||
36行目: | 38行目: | ||
</source> | </source> | ||
+ | ===子ウインドウを閉じる=== | ||
子ウインドウを閉じるにはNSApplication.SharedApplication.StopModalWithCodeメソッドを使うようだ。これを呼ばずに子ウインドウを閉じると親ウインドウに制御が戻らないので注意すること。 | 子ウインドウを閉じるにはNSApplication.SharedApplication.StopModalWithCodeメソッドを使うようだ。これを呼ばずに子ウインドウを閉じると親ウインドウに制御が戻らないので注意すること。 | ||
2015年1月30日 (金) 01:44時点における版
実装例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);
};
}
}