Share via


Xamarin.Mac の .xib ファイル

この記事は、Xcode の Interface Builder で作成された .xib ファイルを操作して、Xamarin.Mac アプリケーションのユーザー インターフェイスを作成および管理する方法について説明しています。

Note

Xamarin.Mac アプリのユーザー インターフェイスを作成するには、ストーリーボードを使用することをお勧めします。 このドキュメントは、過去の経緯を残すという歴史的な理由と、古い Xamarin.Mac プロジェクトに対応するために、そのまま残されています。 詳細については、ストーリーボードの概要に関するドキュメントをご覧ください。

概要

Xamarin.Mac アプリケーションで C# と .NET を使用している場合、Objective-CXcode を使用する開発者が使用しているのと同じユーザー インターフェイス要素とツールを使用できます。 Xamarin.Mac は直接 Xcode と統合できるため、Xcode の Interface Builder を使用して、ユーザー インターフェイスを作成および保守できます (または、必要に応じて C# コードで直接作成することも可能です)。

.xib ファイルは、Xcode の Interface Builder でグラフィカルに作成および管理されるアプリケーションのユーザー インターフェイス (メニュー、Windows、ビュー、ラベル、テキスト フィールドなど) の要素を定義するために macOS によって使用されます。

実行中のアプリの例

この記事では、Xamarin.Mac アプリケーションでの .xib ファイルの使用の基本について説明します。 「Hello, Mac」記事では、この記事で使用することになる主要な概念と手法が説明されているため、まずはこれを確認することを強くお勧めします。

Xamarin.Mac Internals ドキュメントの C# クラス/メソッドの Objective-C への公開に関するセクションも参照することをお勧めします。C# クラスを Objective-C オブジェクトと UI 要素に結び付けるために使われる Register および Export 属性について説明されています。

Xcode と Interface Builder の概要

Xcode の一部として、Apple は Interface Builder というツールを作成しました。このツールを使用すると、Designer でユーザー インターフェイスを視覚的に作成できます。 Xamarin.Mac は Interface Builder とスムーズに統合され、Objective-C ユーザーと同じツールで UI を作成できます。

Xcode のコンポーネント

Visual Studio for Mac から Xcode で .xib ファイルを開くと、左側にプロジェクト ナビゲーター、中央にインターフェイス階層インターフェイス エディター、右側にプロパティとユーティリティのセクションが表示されます。

Xcode UI のコンポーネント

これらの Xcode セクションの機能と、それらを使用して Xamarin.Mac アプリケーションのインターフェイスを作成する方法を見てみましょう。

プロジェクトのナビゲーション

Xcode で .xib ファイルを開くと、Visual Studio for Mac によって Xcode プロジェクト ファイルがバックグラウンドで作成され、Visual Studio for Mac と Xcode の間で変更が通知されます。 その後、Xcode から Visual Studio for Mac に戻ると、このプロジェクトに対する変更は Visual Studio for Mac によって Xamarin.Mac プロジェクトと同期されます。

プロジェクト ナビゲーション セクションでは、この shim Xcode プロジェクトを構成するすべてのファイル間を移動できます。 通常、この一覧の .xib ファイル (MainMenu.xibMainWindow.xib など) にのみ関心があります。

インターフェイス階層

インターフェイス階層セクションでは、プレースホルダーやメイン ウィンドウなどのユーザー インターフェイスの主要な複数のプロパティに簡単にアクセスできます。 また、このセクションを使用して、ユーザー インターフェイスを構成する個々の要素 (ビュー) にアクセスしたり、階層内でそれらの要素をドラッグして、入れ子にする方法を調整したりできます。

インターフェイス エディター

インターフェイス エディターのセクションでは、ユーザー インターフェイスをグラフィカルにレイアウトする画面が提供されます。 プロパティとユーティリティのセクションにあるライブラリ セクションから要素をドラッグして、デザインを作成します。 ユーザー インターフェイス要素 (ビュー) をデザイン サーフェイスに追加すると、インターフェイス エディターに表示されている順序でインターフェイス階層セクションに追加されます。

プロパティとユーティリティ

プロパティとユーティリティのセクションは、プロパティ (インスペクターとも呼ばれる) とライブラリという使用する 2 つの主要なセクションに分かれています。

プロパティ インスペクター

最初はこのセクションはほとんど空ですが、インターフェイス エディターまたはインターフェイス階層で要素を選択すると、プロパティ セクションには指定した要素と調整可能なプロパティに関する情報が設定されます。

プロパティ セクションには、次の図に示すように 8 つの異なるインスペクター タブがあります。

すべてのインスペクターの概要

左から順に次のタブがあります。

  • ファイル インスペクター – ファイル インスペクターは編集中の Xib ファイルの場所やファイル名などのファイル情報を示します。
  • クイック ヘルプ – クイック ヘルプでは、Xcode での選択内容に基づいたヘルプが表示されます。
  • ID インスペクター – ID インスペクターでは、選択したコントロールまたはビューに関する情報が表示されます。
  • 属性インスペクター – 属性インスペクターを使用すると、選択したコントロールまたはビューのさまざまな属性をカスタマイズできます。
  • サイズ インスペクター – サイズ インスペクターを使用すると、選択したコントロールまたはビューのサイズとサイズ変更の動作を制御できます。
  • 接続インスペクター – 接続インスペクターには、選択したコントロールのアウトレットとアクションの接続が表示されます。 アウトレットとアクションをすぐに確認します。
  • バインド インスペクター – バインド インスペクターを使用すると、値が自動的にデータ モデルにバインドされるようにコントロールを構成できます。
  • 表示効果インスペクター – 表示効果インスペクターを使用すると、コントロールにアニメーションなどの効果を指定できます。

ライブラリ セクションでは、コントロールとオブジェクトを探してデザイナーに配置し、グラフィカルにユーザー インターフェイスを構築します。

ライブラリ インスペクターの例

Xcode IDE とインターフェイス ビルダーについて理解したので、それを使用してユーザー インターフェイスを作成する方法を見てみましょう。

Xcode でのウィンドウの作成と保守

Xamarin.Mac アプリのユーザー インターフェイスを作成するための推奨される方法は、ストーリーボード (ストーリーボードの概要に関するドキュメントをご覧ください) であり、その結果、Xamarin.Mac で開始された新しいプロジェクトでは、既定でストーリーボードが使用されます。

.xib ベースの UI の使用に切り替えるには、次の操作を行います。

  1. Visual Studio for Mac を開き、新しい Xamarin.Mac プロジェクトを開始します。

  2. Solution Pad でプロジェクトを右クリックし、[追加]>[新しいファイル...] を選択します。

  3. Mac>Windows コントローラーを選択します。

    新しいウィンドウ コントローラーの追加

  4. 名前に「MainWindow」と入力し、[新規] ボタンをクリックします。

    新しいメイン ウィンドウの追加

  5. プロジェクト名を右クリックし、[追加]>[新しいファイル] を選びます。

  6. [Mac]>[メイン メニュー] を選択します。

    新しいメイン メニューの追加

  7. 名前は「MainMenu」のままにし、[新規] ボタンをクリックします。

  8. Solution PadMain.storyboard ファイルを選択し、右クリックして [削除] を選択します。

    メイン ストーリーボードの選択

  9. [削除] ダイアログ ボックスで、[削除] ボタンをクリックします。

    削除の確認

  10. Solution PadInfo.plist ファイルをダブルクリックして編集用に開きます。

  11. メインインターフェイス ドロップダウンから MainMenu を選択します。

    メイン メニューの設定

  12. Solution Pad で、MainMenu.xib ファイルをダブルクリックして Xcode のインターフェイス ビルダーで編集するために開きます。

  13. ライブラリインスペクターで、検索フィールドに「object」と入力し、新しいオブジェクトをデザイン画面にドラッグします。

    メイン メニューの編集

  14. ID インスペクターで、クラスAppDelegate を入力します:

    アプリ デリゲートの選択

  15. インターフェイス階層からファイルの所有者を選択し、接続インスペクターに切り替えて、デリゲートからプロジェクトに追加したAppDelegateオブジェクトに行をドラッグします。

    アプリ デリゲートの接続

  16. 変更を保存し、Visual Studio for Mac に戻ります。

これらすべての変更を行った状態で、AppDelegate.cs ファイルを編集し、次のようにします。

using AppKit;
using Foundation;

namespace MacXib
{
    [Register ("AppDelegate")]
    public class AppDelegate : NSApplicationDelegate
    {
        public MainWindowController mainWindowController { get; set; }

        public AppDelegate ()
        {
        }

        public override void DidFinishLaunching (NSNotification notification)
        {
            // Insert code here to initialize your application
            mainWindowController = new MainWindowController ();
            mainWindowController.Window.MakeKeyAndOrderFront (this);
        }

        public override void WillTerminate (NSNotification notification)
        {
            // Insert code here to tear down your application
        }
    }
}

これで、アプリのメイン ウィンドウが、ウィンドウ コントローラーの 追加時にプロジェクトに自動的に含まれる .xib ファイルに定義されます。 Windows デザインを編集するには、Solution PadMainWindow.xib ファイルをダブルクリックします。

MainWindow.xib ファイルの選択

これにより、Xcode の Interface Builder でウィンドウ デザインが開きます:

MainWindow.xib の編集

標準ウィンドウ ワークフロー

Xamarin.Mac アプリケーションで作成して操作するウィンドウの場合、プロセスは基本的に同じです。

  1. プロジェクトに自動的に追加される既定ではない新しいウィンドウの場合は、新しいウィンドウ定義をプロジェクトに追加します。
  2. .xib ファイルをダブルクリックして、Xcode の Interface Builder で編集用のウィンドウ デザインを開きます。
  3. 属性インスペクターサイズ インスペクターで、必要なウィンドウ プロパティを設定します。
  4. インターフェイスを構築するために必要なコントロールをドラッグし、それらを属性インスペクターで構成します。
  5. [サイズ インスペクター] を使用して、UI 要素のサイズ変更を処理します。
  6. アウトレットとアクションを使用して、ウィンドウの UI 要素を C# コードに公開します。
  7. 変更内容を保存し、Visual Studio for Mac に戻って Xcode と同期します。

ウィンドウ レイアウトの設計

Interface ビルダーでユーザー インターフェイスをレイアウトするプロセスは、追加するすべての要素で基本的に同じです。

  1. [ライブラリ インスペクター] で目的のコントロールを見つけて、[インターフェイス エディタ] にドラッグして配置します。
  2. [属性インスペクター] で、必要なウィンドウ プロパティを設定します。
  3. [サイズ インスペクター] を使用して、UI 要素のサイズ変更を処理します。
  4. カスタム クラスを使用している場合は、[ID インスペクター] で設定します。
  5. アウトレットとアクションを使用して、UI 要素を C# コードに公開します。
  6. 変更内容を保存し、Visual Studio for Mac に戻って Xcode と同期します。

例:

  1. Xcode で、ライブラリ セクションからボタンをドラッグします。

    ライブラリからボタンを選択

  2. [インターフェイス エディター] のボタンの横にあるウィンドウにラベルをドラッグします。

    ウィンドウへのボタンの追加

  3. 属性インスペクターTitle プロパティをクリックし、ボタンのタイトルを「Click Me」に変更します。

    ボタン属性の設定

  4. ライブラリ セクションからラベルをドラッグします。

    ライブラリでラベルを選択

  5. Interface Editor のボタンの横にあるウィンドウにラベルをドラッグします。

    ウィンドウへのラベルの追加

  6. ラベルの右ハンドルをつかみ、ウィンドウの端に近づくまでドラッグします。

    ラベル サイズの変更

  7. [インターフェイス エディター] でラベルが選択された状態で、[サイズ インスペクター] に切り替えます。

    サイズ インスペクターの選択

  8. [自動サイズ設定] ボックスで、右側の赤い角かっこをクリックし、中央の赤い矢印をクリックします。

    自動サイズ設定プロパティの編集

  9. これにより、実行中のアプリケーションでウィンドウのサイズが変更されると、ラベルが拡大および縮小されます。 [自動サイズ設定ボックス] ボックスの上部と左側の赤い角かっこは、指定された X と Y の位置にラベルが貼り付けられることを示します。

  10. ユーザー インターフェイスに対する変更を保存します

コントロールのサイズを変更したり移動したりすると、OS X のヒューマン インターフェイス ガイドラインに基づいた役立つスナップ ヒントがインターフェイス ビルダーに表示されます。 これらのガイドラインは、Mac ユーザーにとってなじみのある外観と操作感を備えた高品質のアプリケーションを作成するのに役立ちます。

[インターフェイス階層] セクションを見ると、ユーザー インターフェイスを構成する要素のレイアウトと階層がどのように表示されるかがわかります。

インターフェイス階層内の要素の選択

ここから、必要に応じて項目を選んで編集することや、UI 要素をドラッグして順序を変更することができます。 たとえば、UI 要素が別の要素で覆われている場合、その要素をリストの一番下にドラッグすると、その要素をウィンドウの一番上の項目にすることができます。

Xamarin.Mac アプリケーションでの Windows の操作の詳細については、Microsoft の Windows のドキュメントをご覧ください。

UI 要素を C# コードに公開する

Interface Builder でユーザー インターフェイスの外観をレイアウトしたら、UI の要素を公開して、C# コードからアクセスできるようにする必要があります。 これを行うには、アクションとアウトレットを使用します。

カスタム メイン ウィンドウ コントローラーの設定

アウトレットとアクションを作成して UI 要素を C# コードに公開できるようにするには、Xamarin.Mac アプリでカスタム ウィンドウ コントローラーを使用する必要があります。

次の操作を行います。

  1. Xcode の Interface Builder でアプリのストーリーボードを開きます。

  2. デザイン サーフェイスで [NSWindowController] を選択します。

  3. Identity Inspector ビューに切り替え、クラス名として「WindowController」と入力します:

    クラス名の設定

  4. 変更内容を保存し、Visual Studio for Mac に戻って同期します。

  5. WindowController.cs ファイルは、Visual Studio for Mac の Solution Pad のプロジェクトに追加されます。

    Visual Studio for Mac の新しいクラス名

  6. Xcode の Interface Builder でアプリのストーリーボードを再度開きます。

  7. WindowController.h ファイルが使用できるようになります。

    Xcode 内の一致する .h ファイル

アウトレットとアクション

では、アウトレットとアクションとは何でしょうか。 従来の .NET ユーザー インターフェイス プログラミングでは、ユーザー インターフェイスのコントロールは追加時にプロパティとして自動的に公開されます。 Mac では事情が異なり、ビューにコントロールを追加しただけでは、コントロールはコードにアクセスできません。 開発者は、UI 要素を明示的にコードに公開する必要があります。 これを行うために、Apple は 2 つのオプションを提供しています。

  • Outlet – Outlet はプロパティに似ています。 コントロールをアウトレットに接続すると、プロパティを介してコードに公開されるため、イベント ハンドラーをアタッチしたり、メソッドを呼び出したりする操作を行うことができます。
  • アクション – アクションは WPF のコマンド パターンに似ています。 たとえば、コントロールに対してボタンのクリックなどのアクションが実行されると、コントロールはコード内でメソッドを自動的に呼び出します。 多くのコントロールを同じアクションに接続できるため、アクションは強力で便利です。

Xcode では、アウトレットとオークションはコントロールのドラッグで直接コードに追加されます。 具体的には、アウトレットまたはアクションを作成するために、アウトレットまたはアクションを追加するコントロール要素を選択し、キーボードの Control ボタンを押したまま、コントロールをコードに直接ドラッグします。

Xamarin.Mac 開発者にとって、これはアウトレットまたはアクションを作成する Objective-C スタブ ファイル (C# ファイルに対応) にドラッグすることを意味します。 Visual Studio for Mac は、Interface Builder を使用するために生成した shim Xcode プロジェクトの一部として MainWindow.h というファイルを作成しました。

Xcode の .h ファイルの例

このスタブ .h ファイルは、新しい NSWindow が作成されたときに自動的に Xamarin.Mac プロジェクトに追加される MainWindow.designer.cs を反映しています。 このファイルは、Interface Builder によって行われた変更を同期するためにも使用されます。そしてこのファイルでアウトレットとアクションが作成され、UI 要素が C# コードに公開されます。

アウトレットの追加

アウトレットとアクションが何であるかの基本を理解したので、C# コードに UI 要素を公開するアウトレットの作成について見てみましょう。

次の操作を行います。

  1. Xcode の画面の右上の端にある二連の輪のボタンをクリックして、アシスタント エディターを開きます。

    アシスタント エディターの表示

  2. Xcode が分割ビュー モードに切り替わり、一方の側にインターフェイス エディター、もう一方の側にコード エディターが表示されます。

  3. Xcode によりコード エディターで自動的に MainWindowController.m ファイルが選択されたことに注意してください。これは間違っています。 上記のアウトレットとアクションに関する説明を覚えている場合は、MainWindow.h を選択する必要があります。

  4. コード エディターの上部で、[自動リンク] をクリックし、MainWindow.h ファイルを選択します。

    正しい .h ファイルの選択

  5. Xcode で正しいファイルが選択されます。

    正しいファイルが選択されている

  6. 最後のステップは非常に重要です! 正しいファイルを選択していない場合、アウトレットとアクションを作成できないか、C# で間違ったクラスに公開されます。

  7. インターフェイス エディターで、キーボードの Control キーを押しながら、前述の手順で作成したラベルをクリックしてコード エディターの @interface MainWindow : NSWindow { } コードのすぐ下にドラッグします。

    ドラッグして新しいアウトレットを作成

  8. ダイアログ ボックスが表示されます。 [接続] を [アウトレット] に設定したままにして、[名前] に「ClickedLabel」と入力します。

    アウトレット プロパティの設定

  9. [接続] ボタンをクリックしてアウトレットを作成します。

    完成したアウトレット

  10. 変更をファイルに保存します。

アクションの追加

次に、UI 要素とのユーザー操作を C# コードに公開するアクションを作成する方法を見てみましょう。

次の操作を行います。

  1. アシスタント エディターにまだ存在し、MainWindow.h ファイルがコード エディターに表示されていることを確認します。

  2. インターフェイス エディターで、キーボードの Control キーを押しながら、前述の手順で作成したボタンをクリックしてコード エディターの @property (assign) IBOutlet NSTextField *ClickedLabel; コードのすぐ下にドラッグします。

    ドラッグしてアクションを作成

  3. [接続] の種類を [アクション] に変更します。

    アクション タイプを選択する

  4. [名前] に「ClickedButton」を入力します。

    アクションの構成

  5. [接続] ボタンをクリックしてアクションを作成します。

    完了したアクション

  6. 変更をファイルに保存します。

ユーザー インターフェイスを接続して C# コードに公開したので、Visual Studio for Mac に戻り、Xcode と Interface Builder で行った変更を同期させます。

コードの記述

ユーザー インターフェイスが作成され、UI 要素がアウトレットとアクションを介してコードに公開されたので、プログラムを実現するためのコードを書く準備が整いました。 たとえば、編集用のMainWindow.cs ファイルを Solution Pad でダブルクリックして開きます。

MainWindow.cs ファイル

次のコードを MainWindow クラスに追加して、上記で作成したサンプル アウトレットを操作します。

private int numberOfTimesClicked = 0;
...

public override void AwakeFromNib ()
{
    base.AwakeFromNib ();

    // Set the initial value for the label
    ClickedLabel.StringValue = "Button has not been clicked yet.";
}

NSLabel は、Xcode でアウトレットを作成したときに Xcode で割り当てた直接名によって C# でアクセスされることに注意してください。この場合、ClickedLabel と呼ばれます。 通常の C# クラスと同じように、公開オブジェクトの任意のメソッドまたはプロパティにアクセスできます。

重要

(Initialize などの別のメソッドではなく) AwakeFromNib を使う必要があります。AwakeFromNib は、OS が読み込まれ、.xib ファイルからユーザー インターフェイスのインスタンスが作成された に呼び出されるためです。 .xib ファイルが完全に読み込まれ、インスタンスが作成される前にラベル コントロールにアクセスしようとすると、ラベル コントロールがまだ作成されていないため、NullReferenceException エラーが発生します。

次に、次の部分クラスを MainWindow クラスに追加します。

partial void ClickedButton (Foundation.NSObject sender) {

    // Update counter and label
    ClickedLabel.StringValue = string.Format("The button has been clicked {0} time{1}.",++numberOfTimesClicked, (numberOfTimesClicked < 2) ? "" : "s");
}

このコードは、Xcode と Interface Builder で作成されたアクションにアタッチされ、ユーザーがボタンをクリックするたびに呼び出されます。

一部の UI 要素には、既定のメニュー バーの項目 ([開く].... メニュー項目 (openDocument:)) などのアクションが自動的に組み込まれています。 Solution Pad で、AppDelegate.cs ファイルをダブルクリックして編集用に開き、DidFinishLaunching メソッドの下に次のコードを追加します。

[Export ("openDocument:")]
void OpenDialog (NSObject sender)
{
    var dlg = NSOpenPanel.OpenPanel;
    dlg.CanChooseFiles = false;
    dlg.CanChooseDirectories = true;

    if (dlg.RunModal () == 1) {
        var alert = new NSAlert () {
            AlertStyle = NSAlertStyle.Informational,
            InformativeText = "At this point we should do something with the folder that the user just selected in the Open File Dialog box...",
            MessageText = "Folder Selected"
        };
        alert.RunModal ();
    }
}

ここでの重要な行は [Export ("openDocument:")] であり、これは、AppDelegateopenDocument: アクションに応答する void OpenDialog (NSObject sender) メソッドがあることを NSMenu 示しています。

メニューの操作の詳細については、メニューに関するドキュメントをご覧ください。

Xcode との変更の同期

Xcode から Visual Studio for Mac に戻ると、Xcode で行った変更は自動的に Xamarin.Mac プロジェクトと同期されます。

ソリューション パッドMainWindow.designer.cs を選択すると、アウトレットとアクションが C# コードでどのように構成されているかを確認できます。

Xcode との変更の同期

MainWindow.designer.cs ファイル内の 2 つの定義がどのようになっているかに注目してください。

[Outlet]
AppKit.NSTextField ClickedLabel { get; set; }

[Action ("ClickedButton:")]
partial void ClickedButton (Foundation.NSObject sender);

Xcode の MainWindow.h ファイルの定義と比べてみましょう。

@property (assign) IBOutlet NSTextField *ClickedLabel;
- (IBAction)ClickedButton:(id)sender;

ここでわかるように、Visual Studio for Mac は .h ファイルの変更をリッスンし、それぞれの .designer.cs ファイルでこれらの変更を自動的に同期して、アプリケーションに公開します。 また、MainWindow.designer.cs は部分クラスであるため、Visual Studio for Mac で MainWindow.cs を変更する必要がないことにも注目してください。そのようなことをすると、クラスに加えた変更は上書きされます。

通常、MainWindow.designer.cs を自分で開く必要はありません。ここでは教育目的でのみ提示しています。

重要

ほとんどの場合、Visual Studio for Mac は Xcode で行われた変更を自動的に確認し、Xamarin.Mac プロジェクトに同期します。 同期が自動的に行われないときは Xcode に戻り、再び Visual Studio for Mac に戻ります。 こうすると通常、同期サイクルが開始します。

プロジェクトへの新しいウィンドウの追加

メイン ドキュメント ウィンドウとは別に、Xamarin.Mac アプリケーションでは、環境設定やインスペクター パネルなど、他の種類のウィンドウをユーザーに表示することが必要になる場合があります。 プロジェクトに新しいウィンドウを追加する場合は、.xib ファイルからウィンドウを読み込むプロセスが容易になるので、Cocoa Window with Controller オプションを常に使用する必要があります。

新しいウィンドウを追加するには、次の操作を行います:

  1. Solution Pad でプロジェクトを右クリックし、[追加]>[新しいファイル...] を選択します。

  2. [新しいファイル] ダイアログ ボックスで、[Xamarin.Mac]>[Cocoa Window wth Contoller] の順に選択します:

    新しいウィンドウ コントローラーの追加

  3. [名前] に「PreferencesWindow」と入力し、[新規] ボタンをクリックします。

  4. PreferencesWindow.xib ファイルをダブルクリックして、インターフェイス ビルダーで編集用に開きます。

    Xcode でのウィンドウの編集

  5. インターフェイスを設計する:

    ウィンドウ レイアウトの設計

  6. 変更内容を保存し、Visual Studio for Mac に戻って Xcode と同期します。

次のコードを AppDelegate.cs に追加して、新しいウィンドウを表示します。

[Export("applicationPreferences:")]
void ShowPreferences (NSObject sender)
{
    var preferences = new PreferencesWindowController ();
    preferences.Window.MakeKeyAndOrderFront (this);
}

var preferences = new PreferencesWindowController (); 行は、.xib ファイルから Window を読み込んで拡張する、ウィンドウ コントローラーの新しいインスタンスを作成します。 preferences.Window.MakeKeyAndOrderFront (this); 行には、ユーザーに新しいウィンドウが表示されます。

コードを実行し、[アプリケーション メニュー] から [ユーザー設定...] を選択すると、ウィンドウが表示されます:

スクリーンショットは、[アプリケーション] メニューから表示される [基本設定] ウィンドウを示しています。

Xamarin.Mac アプリケーションでの Windows の操作の詳細については、Microsoft の Windows のドキュメントをご覧ください。

プロジェクトへの新しいビューの追加

ウィンドウのデザインをいくつかのより管理しやすい .xib ファイルに分割する方が簡単な場合があります。 たとえば、[環境設定] ウィンドウでツール バー項目を選択するときにメイン ウィンドウの内容を切り替えたり、ソース リストの選択に応じてコンテンツをスワップアウトしたりします。

プロジェクトに新しいビューを追加する場合は、.xib ファイルからビューを読み込むプロセスが容易になるので、Cocoa View with Controller オプションを常に使用する必要があります。

新しいビューを追加するには、次の操作を行います:

  1. Solution Pad でプロジェクトを右クリックし、[追加]>[新しいファイル...] を選択します。

  2. [新しいファイル] ダイアログ ボックスで、[Xamarin.Mac]>[Cocoa View wth Contoller] の順に選択します:

    新しい項目の追加

  3. [名前] に「SubviewTable」と入力し、[新規] ボタンをクリックします。

  4. SubviewTable.xib ファイルをダブルクリックして、インターフェイス ビルダーで編集用に開き、ユーザー インターフェイスをデザインします。

    Xcode での新しいビューの設計

  5. 必要なアクションとアウトレットを接続します。

  6. 変更内容を保存し、Visual Studio for Mac に戻って Xcode と同期します。

次に、SubviewTable.cs を編集し、次のコードを AwakeFromNib ファイルに追加して、新しいビューが読み込まれるときに設定します。

public override void AwakeFromNib ()
{
    base.AwakeFromNib ();

    // Create the Product Table Data Source and populate it
    var DataSource = new ProductTableDataSource ();
    DataSource.Products.Add (new Product ("Xamarin.iOS", "Allows you to develop native iOS Applications in C#"));
    DataSource.Products.Add (new Product ("Xamarin.Android", "Allows you to develop native Android Applications in C#"));
    DataSource.Products.Add (new Product ("Xamarin.Mac", "Allows you to develop Mac native Applications in C#"));
    DataSource.Sort ("Title", true);

    // Populate the Product Table
    ProductTable.DataSource = DataSource;
    ProductTable.Delegate = new ProductTableDelegate (DataSource);

    // Auto select the first row
    ProductTable.SelectRow (0, false);
}

プロジェクトに列挙型を追加して、現在表示されているビューを追跡します。 たとえば、SubviewType.cs:

public enum SubviewType
{
    None,
    TableView,
    OutlineView,
    ImageView
}

ビューを使用して表示するウィンドウの .xib ファイルを編集します。 C# コードによってメモリに読み込まれた後、ビューのコンテナーとして機能するカスタム ビューを追加し、次のように呼び出された ViewContainer アウトレットに公開します。

必要な OUtlet の作成

変更内容を保存し、Visual Studio for Mac に戻って Xcode と同期します。

次に、新しいビューを表示するウィンドウの .cs ファイル (MainWindow.cs など) を編集し、次のコードを追加します。

private SubviewType ViewType = SubviewType.None;
private NSViewController SubviewController = null;
private NSView Subview = null;
...

private void DisplaySubview(NSViewController controller, SubviewType type) {

    // Is this view already displayed?
    if (ViewType == type) return;

    // Is there a view already being displayed?
    if (Subview != null) {
        // Yes, remove it from the view
        Subview.RemoveFromSuperview ();

        // Release memory
        Subview = null;
        SubviewController = null;
    }

    // Save values
    ViewType = type;
    SubviewController = controller;
    Subview = controller.View;

    // Define frame and display
    Subview.Frame = new CGRect (0, 0, ViewContainer.Frame.Width, ViewContainer.Frame.Height);
    ViewContainer.AddSubview (Subview);
}

ウィンドウのコンテナー (上記で追加したカスタム ビュー) に .xib ファイルから読み込まれた新しいビューを表示する必要がある場合、このコードは既存のビューを削除し、新しいビューにスワップアウトします。 ビューが既に表示されている場合は、そのビューが画面から削除されていることがわかります。 次に、渡されたビュー (ビュー コントローラーから読み込まれたビュー) を受け取り、コンテンツ領域に収まるようにサイズを変更し、表示用のコンテンツに追加します。

新しいビューを表示するには、次のコードを使用します。

DisplaySubview(new SubviewTableController(), SubviewType.TableView);

これにより、表示する新しいビューのビュー コントローラーの新しいインスタンスが作成され、その型 (プロジェクトに追加された列挙型で指定) が設定され、Window のクラスに追加された DisplaySubview メソッドを使用してビューが実際に表示されます。 次に例を示します。

スクリーンショットは、[画像の操作] ウィンドウで [テーブル ビュー] が選択されている状態を示しています。

Xamarin.Mac アプリケーションでの Windows の操作の詳細については、Microsoft の WindowsDialogs のドキュメントをご覧ください。

まとめ

この記事では、Xamarin.Mac アプリケーションでの .xib ファイルの使用について詳しく説明しました。 さまざまな種類の .xib ファイルを使用してアプリケーションのユーザー インターフェイスを作成し、Xcode の Interface Builder で .xib ファイルを作成して維持する方法、C# コードで .xib ファイルを操作する方法について説明しました。