オプション ページを作成する

このチュートリアルでは、プロパティ グリッドを使用してプロパティを確認および設定する簡単な [ツール] - [オプション] ページを作成します。

これらのプロパティを設定ファイルに保存したり、設定ファイルから復元したりするには、以下の手順に従った後、「設定カテゴリを作成する」をご覧ください。

MPF には、[ツール] - [オプション] ページの作成に役立つ 2 つのクラス (Package クラスと DialogPage クラス) が用意されています。 これらのページのコンテナーを提供する VSPackage を作成するには、Package クラスをサブクラス化します。 各 [ツール] - [オプション] ページを作成するには、DialogPage クラスから派生させます。

[ツール] - [オプション] のグリッド ページを作成する

このセクションでは、簡単な [ツール] - [オプション] のプロパティ グリッドを作成します。 このグリッドを使用すると、プロパティの値を表示および変更できます。

VSIX プロジェクトを作成して VSPackage を追加するには

  1. すべての Visual Studio 拡張機能は、拡張機能アセットを格納する VSIX デプロイ プロジェクトから始まります。 MyToolsOptionsExtension という名前の Visual Studio VSIX プロジェクトを作成します。 VSIX プロジェクト テンプレートは、[新しいプロジェクト] ダイアログで「vsix」と検索すると見つかります。

  2. MyToolsOptionsPackage という名前の Visual Studio パッケージ項目テンプレートを追加して、VSPackage を追加します。 ソリューション エクスプローラーで、プロジェクト ノードを右クリックして、[追加]>[新しい項目] の順に選択します。 [新しい項目の追加] ダイアログで、[Visual C# の項目]>[機能拡張] の順にアクセスし、[Visual Studio パッケージ] を選択します。 ダイアログの下部にある [名前] フィールドで、ファイル名を MyToolsOptionsPackage.cs に変更します。 VSPackage の作成方法の詳細については、「VSPackage を使用して拡張機能を作成する」をご覧ください。

[ツール] - [オプション] のプロパティ グリッドを作成するには

  1. コード エディターで MyToolsOptionsPackage ファイルを開きます。

  2. 次の using ステートメントを追加します。

    using System.ComponentModel;
    
  3. OptionPageGrid クラスを宣言し、DialogPage から派生させます。

    public class OptionPageGrid : DialogPage
    {  }
    
  4. ProvideOptionPageAttributeVSPackage クラスに適用して、OptionPageGrid のオプションのカテゴリとオプション ページ名をそのクラスに割り当てます。 結果は次のようになります。

    [PackageRegistration(UseManagedResourcesOnly = true)]
    [InstalledProductRegistration("#110", "#112", "1.0", IconResourceID = 400)]
    [ProvideMenuResource("Menus.ctmenu", 1)]
    [Guid(GuidList.guidMyToolsOptionsPkgString)]
    [ProvideOptionPage(typeof(OptionPageGrid),
        "My Category", "My Grid Page", 0, 0, true)]
    public sealed class MyToolsOptionsPackage : Package
    
  5. OptionInteger プロパティを OptionPageGrid クラスに追加します。

    public class OptionPageGrid : DialogPage
    {
        private int optionInt = 256;
    
        [Category("My Category")]
        [DisplayName("My Integer Option")]
        [Description("My integer option")]
        public int OptionInteger
        {
            get { return optionInt; }
            set { optionInt = value; }
        }
    }
    

    Note

    DialogPage の既定の実装では、適切なコンバーターを持つプロパティ、または適切なコンバーターを持つプロパティに拡張できる構造体または配列であるプロパティがサポートされています。 コンバーターの一覧については、System.ComponentModel 名前空間をご覧ください。

  6. プロジェクトをビルドし、デバッグを開始します。

  7. Visual Studio の実験用インスタンスで、[ツール] メニューの [オプション] をクリックします。

    左側のペインに [My Category] が表示されます (オプションのカテゴリはアルファベット順に一覧表示されるため、一覧の中ほどにそれが表示されます)。[My Category] を開いてから、[My Grid Page] をクリックします。 右側のペインに、オプションのグリッドが表示されます。 プロパティのカテゴリは My Options で、プロパティ名は My Integer Option です。 ペインの下部に My integer option というプロパティの説明が表示されます。 値を初期値の 256 から別の値に変更します。 [OK] をクリックしてから、[My Grid Page] をもう一度開きます。 新しい値が保持されていることがわかります。

    お客様のオプション ページは、Visual Studio の検索ボックスからも使用できます。 IDE の上部付近にある検索ボックスに「My Category」と入力すると、[My Category] -> [My Grid Page] が結果に表示されます。

[ツール] - [オプション] のカスタム ページを作成する

このセクションでは、カスタム UI を使用して [ツール] - [オプション] ページを作成します。 このページを使用すると、プロパティの値を表示および変更できます。

  1. コード エディターで MyToolsOptionsPackage ファイルを開きます。

  2. 次の using ステートメントを追加します。

    using System.Windows.Forms;
    
  3. OptionPageCustom クラスを OptionPageGrid クラスの直前に追加します。 DialogPage から新しいクラスを派生させます。

    public class OptionPageCustom : DialogPage
    {
        private string optionValue = "alpha";
    
        public string OptionString
        {
            get { return optionValue; }
            set { optionValue = value; }
        }
    }
    
  4. GUID 属性を追加します。 OptionString プロパティを追加します。

    [Guid("00000000-0000-0000-0000-000000000000")]
    public class OptionPageCustom : DialogPage
    {
        private string optionValue = "alpha";
    
        public string OptionString
        {
            get { return optionValue; }
            set { optionValue = value; }
        }
    }
    
  5. 2 つ目の ProvideOptionPageAttribute を VSPackage クラスに適用します。 この属性によって、オプションのカテゴリとオプション ページ名がそのクラスに割り当てます。

    [PackageRegistration(UseManagedResourcesOnly = true)]
    [InstalledProductRegistration("#110", "#112", "1.0", IconResourceID = 400)]
    [ProvideMenuResource("Menus.ctmenu", 1)]
    [Guid(GuidList.guidMyToolsOptionsPkgString)]
    [ProvideOptionPage(typeof(OptionPageGrid),
        "My Category", "My Grid Page", 0, 0, true)]
    [ProvideOptionPage(typeof(OptionPageCustom),
        "My Category", "My Custom Page", 0, 0, true)]
    public sealed class MyToolsOptionsPackage : Package
    
  6. MyUserControl という名前の新しいユーザー コントロールをプロジェクトに追加します。

  7. TextBox コントロールをそのユーザー コントロールに追加します。

    [プロパティ] ウィンドウのツール バーで、[イベント] ボタンをクリックしてから、Leave イベントをダブルクリックします。 新しいイベント ハンドラーが MyUserControl.cs コードに表示されます。

  8. パブリックの OptionsPage フィールド (Initialize メソッド) をコントロール クラスに追加し、イベント ハンドラーを更新して、オプションの値をテキスト ボックスの内容に設定します。

    public partial class MyUserControl : UserControl
    {
        public MyUserControl()
        {
            InitializeComponent();
        }
    
        internal OptionPageCustom optionsPage;
    
        public void Initialize()
        {
            textBox1.Text = optionsPage.OptionString;
        }
    
        private void textBox1_Leave(object sender, EventArgs e)
        {
            optionsPage.OptionString = textBox1.Text;
        }
    }
    

    optionsPage フィールドでは、親の OptionPageCustom インスタンスへの参照が保持されます。 Initialize メソッドによって OptionStringTextBox に表示されます。 フォーカスが TextBox から離れると、イベント ハンドラーによって TextBox の現在の値が OptionString に書き込まれます。

  9. パッケージ コード ファイルで、OptionPageCustom.Window プロパティのオーバーライドを OptionPageCustom クラスに追加して、MyUserControl のインスタンスを作成、初期化して、返します。 このクラスは以下のようになります。

    [Guid("00000000-0000-0000-0000-000000000000")]
    public class OptionPageCustom : DialogPage
    {
        private string optionValue = "alpha";
    
        public string OptionString
        {
            get { return optionValue; }
            set { optionValue = value; }
        }
    
        protected override IWin32Window Window
        {
            get
            {
                MyUserControl page = new MyUserControl();
                page.optionsPage = this;
                page.Initialize();
                return page;
            }
        }
    }
    
  10. プロジェクトをビルドして実行します。

  11. 実験用インスタンスで、[ツール]>[オプション] の順にクリックします。

  12. [My Category][My Custom Page] の順に検索します。

  13. OptionString の値を変更します。 [OK] をクリックしてから、[My Custom Page] をもう一度開きます。 新しい値が保持されていることがわかります。

アクセス オプション

このセクションでは、関連付けられている [ツール] - [オプション] ページをホストする VSPackage からオプションの値を取得します。 同じ手法を使用して、パブリック プロパティの値を取得することもできます。

  1. パッケージ コード ファイルで、OptionInteger というパブリック プロパティ を MyToolsOptionsPackage クラスに追加します。

    public int OptionInteger
    {
        get
        {
            OptionPageGrid page = (OptionPageGrid)GetDialogPage(typeof(OptionPageGrid));
            return page.OptionInteger;
        }
    }
    
    

    このコードでは、GetDialogPage を呼び出して OptionPageGrid インスタンスを作成または取得します。 OptionPageGrid では、LoadSettingsFromStorage を呼び出して、パブリック プロパティであるそのオプションを読み込みます。

  2. ここで、MyToolsOptionsCommand という名前のカスタム コマンド項目テンプレートを追加して、値を表示します。 [新しい項目の追加] ダイアログで、[Visual C#]>[機能拡張] の順にアクセスし、[カスタム コマンド] を選択します。 ウィンドウの下部にある [名前] フィールドで、コマンド ファイル名を MyToolsOptionsCommand.cs に変更します。

  3. MyToolsOptionsCommand ファイルで、コマンドの ShowMessageBox メソッドの本体を以下に置き換えます。

    private void ShowMessageBox(object sender, EventArgs e)
    {
        MyToolsOptionsPackage myToolsOptionsPackage = this.package as MyToolsOptionsPackage;
        System.Windows.Forms.MessageBox.Show(string.Format(CultureInfo.CurrentCulture, "OptionInteger: {0}", myToolsOptionsPackage.OptionInteger));
    }
    
    
  4. プロジェクトをビルドし、デバッグを開始します。

  5. 実験用インスタンスで、[ツール] メニューの [MyToolsOptionsCommand の呼び出し] をクリックします。

    メッセージ ボックスに OptionInteger の現在の値が表示されます。

[オプション] ページを開く

このセクションでは、コマンドと、オプション ページを開くボタンのイベントを追加します

  1. 最初に、OpenPageCommand.cs という名前のファイルを追加します。

  2. 次に、OpenPageCommand.cs を開き、Execute メソッドを変更します。

    private void Execute(object sender, EventArgs e)
    {
        ThreadHelper.ThrowIfNotOnUIThread();
        Type optionsPageType = typeof(OptionPageCustom);
        Instance.package.ShowOptionPage(optionsPageType);
    }
    
  3. プロジェクトを実行し、[呼び出し] ボタン (既定では [ツール] オプションの下にあります) をクリックすると、オプション ページが開きます。

  4. オプション ページを開く方法の詳細については、次のドキュメントを参照してください。