Xamarin.MacでSystem.Drawingを使う

Xamarin.Macでプロジェクトのターゲットフレームワークに「Xamarin.Mac Modern」を選択していると、System.Drawingを使用できません。

System.Drawingの代わりに「ZKWeb.System.Drawing」を使用できます。

ZKWeb.System.Drawingは、クラス名はSystem.Drawingと同じですが、パッケージ名はSystem.DrawingCoreになります。

導入方法

プロジェクトのターゲットフレームワークは「Xamarin.Mac Modern」を選択します。

メニューから「プロジェクト」-「NuGetパッケージの追加」を選択し、「ZKWeb.System.Drawing」をインストールします。

使用例

サンプルアプリケーションでは、NSImageで楕円を描画し、Bitmapファイルに保存します。

var image = new NSImage(new CGSize(300, 100));
image.LockFocus();
var path = NSBezierPath.FromOvalInRect(new CGRect(new CGPoint(0, 0), new CGSize(300, 100)));
NSColor.Red.Set();
path.Fill();
image.UnlockFocus();

var bmprep = new NSBitmapImageRep(image.CGImage);
var data = bmprep.RepresentationUsingTypeProperties(NSBitmapImageFileType.Bmp);
var bitmap = new Bitmap(data.AsStream());

var folder = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory);
var filename = System.IO.Path.Combine(folder, "test.bmp");
bitmap.Save(filename);

Xamarin.MacでMacOSのバージョンを調べるには

OSのバージョンによって使用するAPIを変えたいとき、OSのバージョンを確認する必要があります。

MacOSのバージョンを確認する方法を紹介します。

MacOSのバージョンを取得する

/// <summary>
/// MacOSのバージョンを取得します
/// </summary>
private static string GetVersion()
{
    var version = NSProcessInfo.ProcessInfo.OperatingSystemVersion;
    StringBuilder sb = new StringBuilder();
    sb.AppendLine($"Major: {version.Major}");
    sb.AppendLine($"Minor: {version.Minor}");
    sb.AppendLine($"PatchVersion: {version.PatchVersion}");
    return sb.ToString();
}

MacOSのバージョンが指定バージョンより新しいか

/// <summary>
/// MacOSのバージョンが指定バージョンより新しければtrue
/// </summary>
private static bool IsLaterVersion(int major, int minor, int patchVersion)
{
    var version = new NSOperatingSystemVersion(major, minor, patchVersion);
    return NSProcessInfo.ProcessInfo.IsOperatingSystemAtLeastVersion(version);
}

サンプルアプリケーション

こちらからサンプルアプリケーションをダウンロードできます。

Xamarin.Macで表示デバイスの情報を取得する

Xamarin.Macで表示デバイスの情報を取得します。

ソースコード

void Button_Activated(object sender, EventArgs e)
{
    List<string> lines = new List<string>();
    // 画面のデバイス情報を取得する
    NSDictionary description = NSScreen.MainScreen.DeviceDescription;

    // デバイスの解像度
    var displayPixelSize = (description.ObjectForKey(new NSString("NSDeviceSize")) as NSValue).CGSizeValue;
    lines.Add($"デバイスの解像度 = ({displayPixelSize.Width}, {displayPixelSize.Height})");

    // 1インチあたりのドット数(dpi)
    var deviceResolution = (description.ObjectForKey(new NSString("NSDeviceResolution")) as NSValue).CGSizeValue;
    lines.Add($"1インチあたりのドット数(dpi) = ({deviceResolution.Width}, {deviceResolution.Height})");

    // デバイスの色空間名
    var deviceColorSpaceName = (description.ObjectForKey(new NSString("NSDeviceColorSpaceName")));
    lines.Add($"デバイスの色空間名 = {deviceColorSpaceName}");

    // デバイスの色深度
    var deviceBitsPerSample = (description.ObjectForKey(new NSString("NSDeviceBitsPerSample")) as NSNumber).Int32Value;
    lines.Add($"デバイスの色深度 = {deviceBitsPerSample}");

    // ディスプレイの幅と高さ(ミリメートル)
    var screenNumber = (description.ObjectForKey(new NSString("NSScreenNumber")) as NSNumber).UInt32Value;
    var displayPhysicalSize = CGDisplay.ScreenSize(screenNumber);
    lines.Add($"ディスプレイの幅と高さ(ミリメートル) = ({displayPhysicalSize.Width}, {displayPhysicalSize.Height})");

    // DPI
    var dpi = (displayPixelSize.Width / displayPhysicalSize.Width) * 25.4f;
    lines.Add($"DPI = {dpi}");

    TextField.StringValue = string.Join("\n", lines);
}

Xamarin.Macで複数行文字列を表示する

NSTextFieldを使って複数行の文字列を表示します。

改行は「\n」を使用します。

「\」はoption(alt)キーを押しながら¥キーを押して入力します。

TextField.StringValue = "1行目\n2行目\n3行目";

サンプルアプリケーションはこちら