Xamarin.Mac/NSApplicationのサブクラスを使う
MonoMacおよびXamarin.MacでAppKitのNSApplicationのサブクラスを利用したい場面もあることだろう。多くの場合はNSApplicationDelegateで事足りるだろうが、稀にすべてのイベントをトラップしたい場面などではNSApplicationのサブクラスを作る必要がある。
目次
実装1[編集 | ソースを編集]
NSApplicationのサブクラスを作る[編集 | ソースを編集]
Register属性で指定した名前は後ほどInfo.plistで利用される。凄く重要。クラス名と同じにしておくと紛らわしくないと思われる。
NSApplicationがデフォルトコンストラクタを持たない関係でサブクラスにもコンストラクタがないとコンパイルが通らないが、デバッガで追ってみた限りでは呼ばれている気配はない。そのためAwakeFromNibメソッドをオーバーライドして初期化している。これでいいのかは知らん。
using System;
using Foundation;
using AppKit;
[Register("App")]
public class App : NSApplication
{
public App(IntPtr handle) : base(handle) {}
public App(NSCoder coder) : base(coder) {}
/// <summary>
/// 初期化はAwakeFromNibのタイミングでいいのか?
/// 調査中
/// </summary>
public override void AwakeFromNib()
{
base.AwakeFromNib();
this.Delegate = new AppDelegate();
}
/// <summary>
/// こいつをオーバーライドすればほぼ全てのイベントが取れる
/// </summary>
/// <param name="theEvent">The event.</param>
public override void SendEvent(NSEvent theEvent)
{
base.SendEvent(theEvent);
}
}
MainMenu.xibを追加する[編集 | ソースを編集]
MainMenu.xibが既にある場合はそのまま。MainMenu.xibがない場合はファイルを新規作成する。Xamarin Studioの新規作成ダイアログでは「Main Menu」という名称になっているはず。
Info.plistを設定する[編集 | ソースを編集]
Info.plistが既にある場合はそのまま。Info.plistがない場合はファイルを新規作成する。Xamarin Studioの新規作成ダイアログでは「Application Manifest」という名称になっているはず。
Info.plistを開き下部にある「ソース」タブを選択する。するとプロパティの一覧が列挙されるので以下の値を設定する。プロパティに目的の項目がない場合はリスト下部の「Add new entry」を選べば新しい行が追加される。
- Principal class(String型)→ 前述のRegister属性で付けた名前を入力する(この例であれば「App」)
- Main nib file name(String型)→ MainMenu
エントリポイントを書き換える[編集 | ソースを編集]
Xamarin Studioで「空のプロジェクト」を作ると初期値でこんな感じになっている。
static class MainClass
{
static void Main(string[] args)
{
NSApplication.Init();
var application = NSApplication.SharedApplication;
application.Delegate = new AppDelegate();
application.Run();
}
}
これを以下のように書き換える。なお「空のプロジェクト」ではなく「Cocoa」を選ぶと最初からこうなっている。
using System;
using AppKit;
static class MainClass
{
static void Main(string[] args)
{
NSApplication.Init();
NSApplication.Main(args);
}
}