次の方法で共有


チュートリアル: Outlook で電子メール メッセージと共にカスタム作業ウィンドウを表示する

このチュートリアルでは、作成した、または開いた電子メール メッセージごとに固有のカスタム作業ウィンドウのインスタンスを表示する方法を示します。 ユーザーは、各電子メール メッセージのリボンにあるボタンを使用して、カスタム作業ウィンドウを表示または非表示にすることができます。

適用対象: このトピックの情報は、Outlook の VSTO アドイン プロジェクトに適用されます。 詳細については、「Office アプリケーションおよびプロジェクトの種類別の使用可能な機能」を参照してください。

複数のエクスプローラーやインスペクターのウィンドウでカスタム作業ウィンドウを表示するには、開いているそれぞれのウィンドウに対してカスタム作業ウィンドウのインスタンスを作成する必要があります。 Outlook ウィンドウでのカスタム作業ウィンドウの動作に関する詳細については、「カスタム作業ウィンドウ」を参照してください。

Note

このチュートリアルでは、コードのロジックについての説明をわかりやすくするために、VSTO アドイン コードを小さなセクションで提示します。

このチュートリアルでは、次の作業について説明します。

  • カスタム作業ウィンドウのユーザー インターフェイス (UI) の設計。

  • カスタム リボン UI の作成。

  • 電子メール メッセージと共にカスタム リボン UI を表示する。

  • インスペクター ウィンドウとカスタム作業ウィンドウを管理するクラスの作成。

  • VSTO アドインで使用されるリソースの初期化とクリーンアップ。

  • リボンのトグル ボタンとカスタム作業ウィンドウとの同期。

Note

次の手順で参照している Visual Studio ユーザー インターフェイス要素の一部は、お使いのコンピューターでは名前や場所が異なる場合があります。 これらの要素は、使用している Visual Studio のエディションや独自の設定によって決まります。 詳細については、「Visual Studio IDE のカスタマイズ」を参照してください。

前提条件

このチュートリアルを実行するには、次のコンポーネントが必要です。

プロジェクトを作成する

カスタム作業ウィンドウは、VSTO アドインに実装されています。まず、Outlook の VSTO アドイン プロジェクトを作成します。

新しいプロジェクトを作成するには

  1. OutlookMailItemTaskPane という名前の Outlook アドインプロジェクトを作成します。 Outlook アドイン プロジェクトのテンプレートを使用します。 詳細については、「方法: Visual Studio で Office プロジェクトを作成する」を参照してください。

    Visual Studio によって、ThisAddIn.cs コード ファイルまたは ThisAddIn.vb コード ファイルが開かれ、ソリューション エクスプローラーOutlookMailItemTaskPane プロジェクトが追加されます。

カスタム作業ウィンドウのユーザー インターフェイスを設計する

カスタム作業ウィンドウにはビジュアルなデザイナーはありませんが、お好きな UI を使用してユーザー コントロールを設計できます。 この VSTO アドインのカスタム作業ウィンドウには、 TextBox コントロールを含む単純な UI が装備されています。 この後に説明するチュートリアルでは、ユーザー コントロールをカスタム作業ウィンドウに追加します。

カスタム作業ウィンドウのユーザー インターフェイスを設計するには

  1. ソリューション エクスプローラーで、 OutlookMailItemTaskPane プロジェクトをクリックします。

  2. [プロジェクト] メニューの [ユーザー コントロールの追加]をクリックします。

  3. [新しい項目の追加] ダイアログ ボックスでユーザー コントロールの名前を TaskPaneControlに変更し、 [追加]をクリックします。

    ユーザー コントロールがデザイナーで開きます。

  4. [ツールボックス][コモン コントロール]タブから TextBox コントロールをユーザー コントロールにドラッグします。

リボンのユーザー インターフェイスを設計する

この VSTO アドインの目標の 1 つは、各電子メール メッセージのリボンからカスタム作業ウィンドウを表示または非表示にする方法をユーザーに提供することです。 ユーザー インターフェイスを提供するには、カスタム リボン UI を作成して、カスタム作業ウィンドウを表示または非表示にするためにクリックするトグル ボタンを表示します。

カスタム リボン UI を作成するには

  1. [プロジェクト] メニューの [新しい項目の追加] をクリックします。

  2. [新しい項目の追加] ダイアログ ボックスで、 [リボン (ビジュアル デザイナー)]をクリックします。

  3. 新しいリボンの名前を ManageTaskPaneRibbonに変更し、 [追加]をクリックします。

    リボン デザイナーで ManageTaskPaneRibbon.cs ファイルまたは ManageTaskPaneRibbon.vb ファイルが開き、既定のタブとグループが表示されます。

  4. リボン デザイナーで、 group1をクリックします。

  5. [プロパティ] ウィンドウで、 [ラベル] プロパティを [作業ウィンドウ マネージャー]に設定します。

  6. [ツールボックス][Office リボン コントロール]タブから、[ToggleButton] コントロールを [作業ウィンドウ マネージャー] グループにドラッグします。

  7. toggleButton1をクリックします。

  8. [プロパティ] ウィンドウで、 [ラベル] プロパティを [作業ウィンドウの表示]に設定します。

電子メール メッセージと共にカスタム リボン ユーザー インターフェイスを表示する

このチュートリアルで作成したカスタム作業ウィンドウは、電子メール メッセージを含むインスペクター ウィンドウでのみ表示されるよう設計されています。 そのため、これらのウィンドウでのみ、カスタム リボン UI を表示するようプロパティを設定します。

電子メール メッセージと共にカスタム リボン UI を表示するには

  1. リボン デザイナーで、 [ManageTaskPaneRibbon] リボンをクリックします。

  2. [プロパティ] ウィンドウで、 [RibbonType]の隣にあるドロップダウン リストをクリックして、 Microsoft.Outlook.Mail.ComposeMicrosoft.Outlook.Mail.Readを選択します。

インスペクター ウィンドウとカスタム作業ウィンドウを管理するクラスを作成する

特定の電子メール メッセージにどのカスタム作業ウィンドウが関連付けられているかを VSTO アドインが識別する必要がある場合があります。 たとえば、次のようなケースがあります。

  • ユーザーが電子メール メッセージを閉じるとき。 この場合、VSTO アドインで、対応するカスタム作業ウィンドウを削除して、VSTO アドインで使用されるリソースが適切にクリーンアップされるようにする必要があります。

  • ユーザーがカスタム作業ウィンドウを閉じるとき。 この場合、VSTO アドインで、電子メール メッセージのリボンのトグル ボタンの状態を更新する必要があります。

  • ユーザーがリボンのトグル ボタンをクリックするとき。 この場合、VSTO アドインで、対応する作業ウィンドウを非表示にしたり、表示したりする必要があります。

    各電子メール メッセージに関連付けられているカスタム作業ウィンドウを継続して追跡する VSTO アドインを有効にするには、InspectorCustomTaskPane オブジェクトのペアをラップするカスタム クラスを作成します。 このクラスは、電子メール メッセージごとに新しいカスタム作業ウィンドウのオブジェクトを作成し、対応する電子メール メッセージが閉じられたときに、カスタム作業ウィンドウを削除します。

インスペクター ウィンドウとカスタム作業ウィンドウを管理するクラスを作成するには

  1. ソリューション エクスプローラーで、 ThisAddIn.cs または ThisAddIn.vb ファイルを右クリックし、 [コードの表示]をクリックします。

  2. 次の ステートメントをファイルの先頭に追加します。

    using Microsoft.Office.Tools;
    
  3. 次のコードを クラスの外側で ThisAddIn.cs または ThisAddIn.vb ThisAddIn ファイルに追加します (Visual C# の場合はこのコードを OutlookMailItemTaskPane 名前空間内部に追加します)。 InspectorWrapper クラスは InspectorCustomTaskPane オブジェクトのペアを管理します。 次の手順で、このクラスの定義が完了します。

    public class InspectorWrapper
    {
        private Outlook.Inspector inspector;
        private CustomTaskPane taskPane;
    
  4. 前の手順で追加したコードの後に、次のコンストラクターを追加します。 このコンストラクターは、渡される Inspector オブジェクトに関連付けられている新しいカスタム作業ウィンドウの作成と初期化を行います。 C# の場合は、コンストラクターはイベント ハンドラーを Close オブジェクトの Inspector イベントと VisibleChanged オブジェクトの CustomTaskPane イベントにもアタッチします。

    public InspectorWrapper(Outlook.Inspector Inspector)
    {
        inspector = Inspector;
        ((Outlook.InspectorEvents_Event)inspector).Close +=
            new Outlook.InspectorEvents_CloseEventHandler(InspectorWrapper_Close);
        
        taskPane = Globals.ThisAddIn.CustomTaskPanes.Add(
            new TaskPaneControl(), "My task pane", inspector);
        taskPane.VisibleChanged += new EventHandler(TaskPane_VisibleChanged);
    }
    
  5. 前の手順で追加したコードの後に、次のメソッドを追加します。 このメソッドは、 VisibleChanged クラスに含まれている CustomTaskPane オブジェクトの InspectorWrapper イベント用のイベント ハンドラーです。 このコードは、カスタム作業ウィンドウを開いたり閉じたりするたびに、トグル ボタンの状態を更新します。

    void TaskPane_VisibleChanged(object sender, EventArgs e)
    {
        Globals.Ribbons[inspector].ManageTaskPaneRibbon.toggleButton1.Checked = 
            taskPane.Visible;
    }
    
  6. 前の手順で追加したコードの後に、次のメソッドを追加します。 このメソッドは、現在の電子メール メッセージを含んでいる Close オブジェクトの Inspector イベント用のイベント ハンドラーです。 イベント ハンドラーは、電子メール メッセージが閉じられたときにリソースを解放します。 またイベント ハンドラーは、 CustomTaskPanes コレクションから現在のカスタム作業ウィンドウを削除します。 これにより、次の電子メール メッセージを開いたときに、カスタム作業ウィンドウのインスタンスが複数実行されないようにできます。

    void InspectorWrapper_Close()
    {
        if (taskPane != null)
        {
            Globals.ThisAddIn.CustomTaskPanes.Remove(taskPane);
        }
    
        taskPane = null;
        Globals.ThisAddIn.InspectorWrappers.Remove(inspector);
        ((Outlook.InspectorEvents_Event)inspector).Close -=
            new Outlook.InspectorEvents_CloseEventHandler(InspectorWrapper_Close);
        inspector = null;
    }
    
  7. 前の手順で追加したコードの後に、次のコードを追加します。 このチュートリアルの後の部分で、このプロパティをカスタム リボン UI 内のメソッドから呼び出して、カスタム作業ウィンドウの表示と非表示を行います。

        public CustomTaskPane CustomTaskPane
        {
            get
            {
                return taskPane;
            }
        }
    }
    

アドインで使用されるリソースの初期化とクリーンアップを行う

コードを ThisAddIn クラスに追加して、VSTO アドインを読み込む際に初期化し、また VSTO アドインをアンロードする際には使用したリソースをクリーンアップします。 NewInspector イベントのイベント ハンドラーを設定して、すべての既存の電子メール メッセージをこのイベント ハンドラーに渡すことによって、VSTO アドインを初期化します。 VSTO アドインを読み込む際に、イベント ハンドラーをデタッチして、VSTO アドインで使用されたオブジェクトをクリーンアップします。

VSTO アドインで使用されるリソースの初期化とクリーンアップをするには

  1. ThisAddIn.cs または ThisAddIn.vb ファイルで、 ThisAddIn クラスの定義を検索します。

  2. ThisAddIn クラスに次の宣言を追加します。

    • inspectorWrappersValue フィールドには、VSTO アドインによって管理される InspectorInspectorWrapper のオブジェクトすべてが格納されます。

    • inspectors フィールドは、Outlook の現在のインスタンスに含まれるインスペクター ウィンドウのコレクションへの参照を保持します。 この参照によって、次の手順で宣言する、 NewInspector イベントのイベント ハンドラーが格納されたメモリをガベージ コレクターが解放することを防止できます。

      private Dictionary<Outlook.Inspector, InspectorWrapper> inspectorWrappersValue =
          new Dictionary<Outlook.Inspector, InspectorWrapper>();
      private Outlook.Inspectors inspectors;
      

  3. ThisAddIn_Startup メソッドを次のコードに置き換えます。 このコードは、イベント ハンドラーを NewInspector イベントにアタッチし、すべての既存の Inspector オブジェクトをそのイベント ハンドラーに渡します。 Outlook を既に実行した後に、VSTO アドインを読み込む場合は、VSTO アドインよってこの情報を使用して既に開いているすべての電子メール メッセージに対し、カスタム作業ウィンドウが作成されます。

    private void ThisAddIn_Startup(object sender, System.EventArgs e)
    {
        inspectors = this.Application.Inspectors;
        inspectors.NewInspector +=
            new Outlook.InspectorsEvents_NewInspectorEventHandler(
            Inspectors_NewInspector);
    
        foreach (Outlook.Inspector inspector in inspectors)
        {
            Inspectors_NewInspector(inspector);
        }
    }
    
  4. ThisAddIn_ShutDown メソッドを次のコードに置き換えます。 このコードは、 NewInspector イベント ハンドラーをデタッチして、VSTO アドインで使用されたオブジェクトをクリーンアップします。

    private void ThisAddIn_Shutdown(object sender, System.EventArgs e)
    {
        inspectors.NewInspector -=
            new Outlook.InspectorsEvents_NewInspectorEventHandler(
            Inspectors_NewInspector);
        inspectors = null;
        inspectorWrappersValue = null;
    }
    
  5. 次の NewInspector イベント ハンドラーを ThisAddIn クラスに追加します。 新しい Inspector に電子メール メッセージが含まれている場合、メソッドによって、新しい InspectorWrapper オブジェクトのインスタンスが作成され、電子メール メッセージと対応する作業ウィンドウ間のリレーションシップが管理されます。

    void Inspectors_NewInspector(Outlook.Inspector Inspector)
    {
        if (Inspector.CurrentItem is Outlook.MailItem)
        {
            inspectorWrappersValue.Add(Inspector, new InspectorWrapper(Inspector));
        }
    }
    
  6. ThisAddIn クラスに次のプロパティを追加します。 このプロパティは、プライベート inspectorWrappersValue フィールドを ThisAddIn クラスの外部のコードに公開します。

    public Dictionary<Outlook.Inspector, InspectorWrapper> InspectorWrappers
    {
        get
        {
            return inspectorWrappersValue;
        }
    }
    

Checkpoint

エラーが発生することなくプロジェクトをコンパイルできるように、必ずプロジェクトをビルドします。

プロジェクトをビルドするには

  1. ソリューション エクスプローラーで、 OutlookMailItemTaskPane プロジェクトを右クリックし、 [ビルド]をクリックします。 プロジェクトのコンパイルでエラーが発生しないことを確認します。

リボンのトグル ボタンをカスタム作業ウィンドウと同期する

作業ウィンドウが表示されている場合、トグル ボタンは押されているように見え、作業ウィンドウが非表示になっている場合は、押されていないように見えます。 ボタンの状態をカスタム作業ウィンドウと同期させるには、トグル ボタンの Click イベント ハンドラーを変更します。

カスタム作業ウィンドウをトグル ボタンと同期させるには

  1. リボン デザイナーで、 [作業ウィンドウの表示] トグル ボタンをダブルクリックします。

    Visual Studio によって、 toggleButton1_Clickという名前のイベント ハンドラーが自動的に生成されます。トグル ボタンの Click イベントは、このハンドラーが処理します。 また Visual Studio により、コード エディターに ManageTaskPaneRibbon.cs または ManageTaskPaneRibbon.vb ファイルも開かれます。

  2. ManageTaskPaneRibbon.cs または ManageTaskPaneRibbon.vb ファイルの先頭に次のステートメントを追加します。

    using Outlook = Microsoft.Office.Interop.Outlook;
    using Microsoft.Office.Tools;
    
  3. toggleButton1_Click イベント ハンドラーを次のコードで置き換えます。 トグル ボタンをクリックすると、このメソッドによって、現在のインスペクター ウィンドウに関連付けられているカスタム作業ウィンドウが非表示または表示にされます。

    private void toggleButton1_Click(object sender, RibbonControlEventArgs e)
    {
        Outlook.Inspector inspector = (Outlook.Inspector)e.Control.Context;
        InspectorWrapper inspectorWrapper = Globals.ThisAddIn.InspectorWrappers[inspector];
        CustomTaskPane taskPane = inspectorWrapper.CustomTaskPane;
        if (taskPane != null)
        {
            taskPane.Visible = ((RibbonToggleButton)sender).Checked;
        }
    }
    

プロジェクトをテストする

プロジェクトのデバッグを開始すると、Outlook が開き、VSTO アドインが読み込まれます。 VSTO アドインにより、開かれている電子メール メッセージごとにカスタム作業ウィンドウの一意のインスタンスが表示されます。 コードをテストする新しい電子メール メッセージをいくつか作成します。

VSTO アドインをテストするには

  1. F5 キーを押します。

  2. Outlook で、[新規作成] をクリックして、新しい電子メール メッセージを作成します。

  3. 電子メール メッセージのリボンで、[アドイン] タブ、[作業ウィンドウの表示] ボタンの順にクリックします。

    [個人用作業ウィンドウ] というタイトルの作業ウィンドウが電子メール メッセージと共に表示されていることを確認します。

  4. 作業ウィンドウで、テキスト ボックスに「 最初の作業ウィンドウ 」と入力します。

  5. タスク ウィンドウを閉じます。

    [作業ウィンドウの表示] ボタンの状態が変更され、ボタンが押されていない状態になっていることを確認します。

  6. [作業ウィンドウの表示] ボタンをもう一度クリックします。

    作業ウィンドウが開き、テキスト ボックスにも、「 最初の作業ウィンドウ」という文字列が含まれていることを確認します。

  7. Outlook で、[新規作成] をクリックして、2 番目の電子メール メッセージを作成します。

  8. 電子メール メッセージのリボンで、[アドイン] タブ、[作業ウィンドウの表示] ボタンの順にクリックします。

    [個人用作業ウィンドウ] というタイトルの作業ウィンドウが電子メール メッセージと共に表示されていて、かつこの作業ウィンドウのテキスト ボックスが空白であることを確認します。

  9. 作業ウィンドウで、テキスト ボックスに「 2 番目の作業ウィンドウ 」と入力します。

  10. 最初の電子メール メッセージにフォーカスを切り替えます。

    この電子メール メッセージに関連付けられている作業ウィンドウのテキスト ボックスに、引き続き「最初の作業ウィンドウ」と表示されていることを確認します。

    また、この VSTO アドインでは、より高度なシナリオも試すことができます。 たとえば、電子メールを表示する際に、[次の項目][前の項目] ボタンを使用して、動作をテストできます。 VSTO アドインをアンロードして、いくつかの電子メール メッセージを開き、もう一度 VSTO アドインを読み込む場合の動作もテストできます。

次のステップ

カスタム作業ウィンドウの作成方法の詳細については、次のトピックを参照してください。