12

Visual Studio 2010 リボン デザイナーで作成された複数のリボンを持つ Outlook 2010 アドインに取り組んでいます。追加の XML リボンを作成しました (デザイナーでは実行できない組み込みのリボン ボタンの既定の動作をオーバーライドする必要がありました)。

XML リボンを有効にすると、すべてのデザイナー リボンが無効になります。これは、CreateRibbonExtensibilityObject をオーバーライドする必要があるためです (私の XML リボンは ContactButtonOverrides です)。

protected override Microsoft.Office.Core.IRibbonExtensibility CreateRibbonExtensibilityObject()
{
    return new ContactButtonOverrides();
}

私がオーバーライドしている基本クラスの実装は、「プロジェクト内のすべてのリボン (ビジュアル デザイナー) アイテムを表す RibbonManager オブジェクトを返します」。

XML リボンとデザイナーで作成したリボンの両方を使用する方法はありますか? XML リボンを既定の RibbonManager に追加する方法はありますか?

4

1 に答える 1

25

(2) 個別のアドインを使用しない限り、リボン デザイナーリボン XMLの両方を使用する方法はありません。はIAddInExtension.CreateRibbonExtensibilityObject、アドインのライフ サイクルで 1 回だけ呼び出されます。DesignerまたはXMLルートを使用してインターフェースを実装することを選択できます。これらは 2 つの別個の API フックです。

リボン デザイナは、Office リボンの開発に慣れていない人にとっては、より重要な役割を果たします。リボン XMLアプローチに慣れると、はるかに単純になり、動作をより細かく制御できます (OP で示しているように)。リボン デザイナー サーフェスからコンテキスト メニューを使用して、リボン デザイナーから XML に移行できます。ただし、モデルがまったく異なるため、画像とコールバックにいくらかの手直しがあります。リボン XMLはコンテキスト メニュー (非推奨) を拡張する唯一の方法であり、デザイナがないため Backstage ビューであるため、時間をかけてリボン XMLに投資する価値があります。CommandBars

リボン XML ルート

protected override Microsoft.Office.Core.IRibbonExtensibility CreateRibbonExtensibilityObject()
    {
        return new ContactButtonOverrides();
    }

次に、 ...リボン ID タイプのどのパスをContactButtonOverrides介して、どの XML をロードするかをトリガーできます...IRibbonExtensibility.GetCustomUI

public string GetCustomUI(string ribbonID)
{
    switch (ribbonID)
    {
        case "Microsoft.Outlook.Appointment" : 
            return GetResourceText("OutlookRibbonApp.IPM.Appointment.Ribbon.xml");
        case "Microsoft.Outlook.Mail.Compose" : 
            return GetResourceText("OutlookRibbonApp.IPM.Note.Ribbon.xml");
        default:
            return "";
    }
}

リボン デザイナー ルート

protected override Microsoft.Office.Core.IRibbonExtensibility CreateRibbonExtensibilityObject()
{
    if (myCondition == true)
    {
        return Globals.Factory.GetRibbonFactory().CreateRibbonManager(
            new Microsoft.Office.Tools.Ribbon.IRibbonExtension[] { new Ribbon1() });
    }
    else
    {
        return Globals.Factory.GetRibbonFactory().CreateRibbonManager(
            new Microsoft.Office.Tools.Ribbon.IRibbonExtension[] { new Ribbon2() });
    }
}
于 2013-06-21T16:30:05.263 に答える