[Xamarin.Mac] メニューを追加してみました

2020.11.14

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

1 はじめに

CX事業本部の平内(SIN)です。

Xamarin.Macを使用すると、C#でネイティブなMacのアプリが作成可能です。 ここでは、私自身がXamarin.Macに入門して学習した事項を覚書として書かせて頂いています。

今回は、メニューを操作してみました。

2 メニューの追加

メニューの追加は、Interface Builderを使用すると、簡単に追加できます。 トップの項目は、Menu(NSMenu)で、その下は、MenuItem(NSMenuItem)を使用します。

タイトルは、プロパティで設定します。

3 IBActionによる処理

AssistantAppDevegate.hを開き、IBActionを作成します。

C#からは、partialで定義されたメソッド myMenuItem1() を実装します。

[Register("AppDelegate")]
public partial class AppDelegate : NSApplicationDelegate {
    public AppDelegate() {
    }

    partial void myMenuItem1(NSObject sender) {
        Console.WriteLine("meMenuItem1");
    }

4 First Responder

First Responderを開き、新規にアクションを追加します。

追加したアクションは、一覧に表示されますので、メニューに紐付けます。

First Responderからメッセージは、C#から [Export("ActionName:")] で処理します。下記は、AppDelegate.csで処理しているコードです。

[Register("AppDelegate")]
public partial class AppDelegate : NSApplicationDelegate {
    public AppDelegate() {
    }

    [Export("myMenuItem2:")]
    public void myMenuItem2(NSObject sender) {
        Console.WriteLine("myMenuItemn2");
    }

First Responderからメッセージは、ViewControllerでも処理出来ます。

public partial class ViewController : NSViewController {
    public ViewController(IntPtr handle) : base(handle) {

    }

    [Export("myMenuItem2:")]
    public void myMenuItem2(NSObject sender) {
        Console.WriteLine("myMenuItemn2-ViewController");
    }

5 最後に

今回は、メニューについて確認してみました。

Xamarin.Macで新規にCocoaアプリを作成すると、最初から一般的なメニューが配置されており、First Responderでデフォルトの処理に紐付いています。

Macの標準的なインターフェースに従うには、まずは、この動作を尊重することが重要だと思います。

また、First Responderのデフォルト動作は、[Export("ActionName:")] でいつでもトラップ出来ますので、必要に応じてオーバーライドすれば良いでしょう。