メインメニューを開く

MonoMacMacのアプリで定番のPreferences(設定画面)を実装する。

目次

実装1編集

プロジェクトにPreferencesWindowを追加する編集

  • 「追加」→「新しいファイル」でファイル追加ダイアログを表示する。
  • 「Cocoa Window with Controller」を選び、名前を「PreferencesWindow」にする(名前は何でもよい)。

PreferencesWindow.xibの基本設定をする編集

  • Preferences.xibを開く(Interface Builderが起動する)
  • ウインドウを選択した状態でアトリビュートインスペクターを開き、以下のチェックボックスを外す
    • Visible At Launch
    • Release When Close
  • ついでにTitleも「○○環境設定」など分かりやすい名前に変えておくとよい

以上が終わったらInterface Builderを閉じる。

MainMenu.xibに操作を追加する編集

  • MainMenu.xibを開く(Interface Builderが起動する)
  • アシスタントエディターを開く
  • ソースコード側で「AppDelegate.h」を開く
  • デザイナー側で「MacCocoaApp」→「Preferences」を表示させ、キーボードのCtrlを押しながらマウスをソースコード側へドラッグする
  • ダイアログが開くので以下のように設定する
    • Connection → Action
    • Name → ShowPreferencesWindow (メニュー項目が押されたときに呼ばれるメソッド名なので何でもよい)

以上が終わったらInterface Builderを閉じる。Interface Builderを閉じることでXamarin Studio側に対応するソースコードが自動的に生成される。

AppDelegate.csに処理を追加する編集

前述の操作でAppDelegate.csに部分メソッドが準備された状態になっているので中身を書いてやる。AppDelegate.csを開き、Xamarin Studioテキストエディタ上で「partial」とタイピングすればインテリセンスが働き「 partial void ShowPreferencesWindow(NSObject sender)」などと出てくるはず。

    public partial class AppDelegate : NSApplicationDelegate
    {
        // 〜〜中略〜〜

        PreferencesWindowController preferencesWindowController;

        partial void ShowPreferencesWindow(NSObject sender)
        {
            if (preferencesWindowController == null)
            {
                preferencesWindowController = new PreferencesWindowController();
            }
            preferencesWindowController.ShowWindow(this);
        }
    }

なお、上記の例ではモーダルウインドウにはなっていないので注意すること。モーダルウインドウにしたい場合は下記を参照して書き換える。

実装2編集

実装1のように1つのインスタンスを保持している方法だと、前回の画面が途中から再開されたりするため、タブなどを利用している場合はそこから再開になる。好みの問題かもしれないが、常に新しい画面がお好みなら閉じるたびにDisposeさせた方がいいかもしれない。

    public partial class AppDelegate : NSApplicationDelegate
    {
        // 〜〜中略〜〜

        partial void ShowPreferencesWindow(NSObject sender)
        {
            using (var preferencesWindowController = new PreferencesWindowController())
            {
                var ret = NSApplication.SharedApplication.RunModalForWindow(preferencesWindowController.Window);
                Console.WriteLine(ret);
            }
        }
    }

関連項目編集

参考文献編集