Problem
Xamarin.Forms.Platform.MacOS が 2.4.0 リリースで Stable になっていたようです。
https://developer.xamarin.com/releases/xamarin-forms/xamarin-forms-2.4/2.4.0-stable/
当然IDEサポートはまだなので,Cocoa Appプロジェクトを作ったことがない方にもわかるように,作り方をまとめておきます。といっても Xamarin.Forms プロジェクトをブランクから作る方法と同じです。
Solution
プロジェクトを作る
ブランクのプロジェクトを適当に作りましょう。SharedでもPCLでもいいです。

すかさずCocoa Appプロジェクトを追加します。プロジェクト名を揃えてxxx.Macです。

Xamarin.Formsをインストールする
何はともあれ,NuGetからXamarin.Formsをインストールします。

ユーザーインタフェースの入っているSharedなりPCLプロジェクトを参照しておきます。

起動シーケンスを変更する
このまま実行するとMain.storyboardが読み込まれてウィンドウが構築されるので,これを抑止します。まずはMain.storyboardをすっぱり削除します。ViewController.csも要らないです。

Info.plistを開いてMain Interfaceをブランクにします。

AppDelegate.csを開いてusing Xamarin.Forms, using Xamarin.Forms.Platform.MacOSを追加し,NSApplicationDelegateの代わりにFormsApplicationDelegateを継承するようにします。
using AppKit;
using Foundation;
using Xamarin.Forms;
using Xamarin.Forms.Platform.MacOS;
namespace HelloForms.Mac
{
[Register("AppDelegate")]
public class AppDelegate : FormsApplicationDelegate
{
public AppDelegate()
{
}
public override void DidFinishLaunching(NSNotification notification)
{
// Insert code here to initialize your application
}
public override void WillTerminate(NSNotification notification)
{
// Insert code here to tear down your application
}
}
}
FormsApplicationDelegateは abstract class なので,要求している実装を追加します。NSWindow型のMainWindowプロパティを実装しましょう。さらにAppDelegateコンストラクタから初期化しておきます。
public AppDelegate()
{
var style = NSWindowStyle.Closable | NSWindowStyle.Resizable | NSWindowStyle.Titled;
var rect = new CoreGraphics.CGRect(200, 200, 800, 600);
this._window = new NSWindow(rect, style, NSBackingStore.Buffered, false)
{
Title = "Hello, Xamarin Forms!"
};
}
private NSWindow _window;
public override NSWindow MainWindow => this._window;
DidFinishLaunchingメソッドで作ったウィンドウが表示されるようにします。
public override void DidFinishLaunching(NSNotification notification)
{
Forms.Init();
LoadApplication(new App());
base.DidFinishLaunching(notification);
}
最後にMain.csを開いて,作ったFormsApplicationDelegateをアプリケーションに登録します。
using AppKit;
namespace HelloForms.Mac
{
static class MainClass
{
static void Main(string[] args)
{
NSApplication.Init();
// SharedApplication に触れるのは Init の後
NSApplication.SharedApplication.Delegate = new AppDelegate();
NSApplication.Main(args);
}
}
}
実行してみる
うまくいかないとき
-
Main.csで登録を忘れている -
AppDelegate.csでbase.DidFinishLaunching(notification);を書き忘れている
の実行時に起こりがちな2点以外は単にコンパイルエラーになると思うので適宜対処です。
Conclusion
このままではメインメニューがほとんど機能を持たないままなので,プログラムから作るなり,MainMenu.xibを作って追加するなり(see also:出た頃の記事)したほうがいいでしょう。
Cocoa App プロジェクトを追加し,Xamarin.Forms の起動シーケンスに乗っかるところまではこれでできるようになりました。.NET Standard化してみたり,カスタムレンダラーでmacOSの多彩なUI部品を使ってみたり,これを足がかりにトライしてみてください。