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部品を使ってみたり,これを足がかりにトライしてみてください。