差分

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

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

2,397 バイト追加, 2015年1月29日 (木) 13:38
ページの作成:「MonoMacモーダルウインドウを表示する。 ==実装例1== モーダルウインドウ戻り値用にWinFormsのDialogResult風に...」
[[MonoMac]]で[[モーダルウインドウ]]を表示する。

==実装例1==
[[モーダルウインドウ]]の[[戻り値]]用に[[WinForms]]のDialogResult風に[[列挙体]]を用意しておくと[[可読性]]が向上する気がする。
<source lang="csharp">
// モーダルウインドウの戻り値用
public enum ModalResult
{
Unknown = 0,
OK = 1,
Cancel = 2,
}
</source>

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メソッドを使うようだ。これを呼ばずに子ウインドウを閉じると親ウインドウに制御が戻らないので注意すること。

この例では子ウインドウが普通に×ボタンで閉じる際に「ModalResult.OK」を返している。ダイアログ風にするのであればOKボタンやキャンセルボタンを用意して、それらが押した際にNSApplication.SharedApplication.StopModalWithCodeメソッド呼ぶとよいようだ。
<source lang="csharp">
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);
};
}
}
</source>

==関連項目==
*[[MonoMac/ウインドウが閉じる際に処理をする]]

==参考文献==
{{reflist}}

{{stub}}
匿名利用者

案内メニュー