(VAOT Xml Multi Ribbon Load)
一つのアドインの中で、いろんなとこにリボンを追加したい場合にはちょっと一手間と制約があります。
アドインをOutlookなどのOfficeアプリが読み込み時に、対象となるリボン読み込み処理があります。
public partial class ThisAddIn { //アドイン起動時にリボンの読み込みを行う処理 protected override Office.IRibbonExtensibility CreateRibbonExtensibilityObject() { return base.CreateRibbonExtensibilityObject(); } }
アドイン起動時にCreateRibbonExtensibilityObject()が一度だけ呼ばれます。
"Office.IRibbonExtensibility"を継承したリボンローダーがずっと使われます。
"Office.IRibbonExtensibility"を継承したローダーの実装は、ビジュアルデザイナとXMLデザインでは異なるので一つのアドインの中でビジュアルデザイナとXMLデザインは共存できません。
ビジュアルデザイナ編
ビジュアルデザイナで複数のリボンを読み込むときは、配列にリボンクラスのインスタンスを複数渡せばよいので簡単。
protected override Microsoft.Office.Core.IRibbonExtensibility CreateRibbonExtensibilityObject() { return Globals.Factory.GetRibbonFactory().CreateRibbonManager( new Microsoft.Office.Tools.Ribbon.IRibbonExtension[] { new Ribbon1(),new Ribbon2()}); }
XMLデザイナ編
XMLリボンを複数読み込む場合には、リボンローダーを自分で実装します。
[ComVisible(true)] public class CustomRibbonLoader : Microsoft.Office.Core.IRibbonExtensibility { #region IRibbonExtensibility メンバー public string GetCustomUI(string RibbonID) { if (RibbonID == "Microsoft.Outlook.Explorer") { return GetResourceText("OutlookAddIn8.Ribbon1.xml"); } else if (RibbonID == "Microsoft.Outlook.Mail.Compose") { return GetResourceText("OutlookAddIn8.Ribbon2.xml"); } return ""; } #endregion #region ヘルパー private static string GetResourceText(string resourceName) { Assembly asm = Assembly.GetExecutingAssembly(); string[] resourceNames = asm.GetManifestResourceNames(); for (int i = 0; i < resourceNames.Length; ++i) { if (string.Compare(resourceName, resourceNames[i], StringComparison.OrdinalIgnoreCase) == 0) { using (StreamReader resourceReader = new StreamReader(asm.GetManifestResourceStream(resourceNames[i]))) { if (resourceReader != null) { return resourceReader.ReadToEnd(); } } } } return null; } #endregion }
"IRibbonExtensibility"を継承したクラスを作ればいいだけですが一つポイント、作成したクラスには必ず[ComVisible(true)]の属性を付与すること。
これを付けないと、読み込まれません。