如何同时拥有VSTO功能区和上下文菜单?

7
编辑:海报的答案是正确的,除了应该将xmlns="http://schemas.microsoft.com/office/2009/07/customui"包含在内。作为一个副作用,在XML文件中定义的功能区和上下文菜单将无法在Office 2007中工作。如果您需要在2007中添加上下文菜单,请使用现在已弃用的方法,并且在Outlook 2007消息窗口内部不可能使用上下文菜单。
this.Application.ItemContextMenuDisplay += new Microsoft.Office.Interop.Outlook.ApplicationEvents_11_ItemContextMenuDisplayEventHandler(Application_ItemContextMenuDisplay);

我已经创建了一个功能区和上下文菜单,但是我不知道如何同时部署它们。
我的功能区 XML 大致如下:
<?xml version="1.0" encoding="UTF-8"?>

<customUI onLoad="Ribbon_Load" xmlns="http://schemas.microsoft.com/office/2006/01/customui">

<ribbon>

<tabs>

  <tab id="testTab" label="Test Label">

    <group id="testGroup" label="test">

      <button id="testButton" onAction="testAction" label="Test" size="large" 

          getImage ="GetCustomImage" screentip="Test Ribbon Functionality."/>         

    </group>      

  </tab>

 </tabs>

</ribbon>

</customUI>

Ribbon.cs有。
public string GetCustomUI(string ribbonID)

{

  String ui = null;

  // Examine the ribbonID to see if the current item

  // is a Mail inspector.

  if (ribbonID == "Microsoft.Outlook.Mail.Read" ||

    ribbonID == "Microsoft.Outlook.Mail.Compose")

  {

    // Retrieve the customized Ribbon XML.

    ui = GetResourceText("WDCrypt2.Ribbon.xml") ;



  }

  return ui;

}

ContextMenu的XML格式如下(来自教程)

<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui">

 <contextMenus>

  <contextMenu idMso="ContextMenuText">

   <button idMso="FontDialog" visible="false" />

   <toggleButton id="MyToggle" label="My Toggle Button" />

   <button id="MyButton" label="My Button" insertBeforeMso="HyperlinkInsert" onAction="GetButtonID" />

   <menuSeparator id="MySeparator" />

   <menu id="MySubMenu" label="My Submenu" >

    <button id="MyButton2" label="Button on submenu" />

   </menu>

   <gallery id="galleryOne" label="My Gallery">

    <item id="item1" imageMso="HappyFace" />

    <item id="item2" imageMso="HappyFace" />

    <item id="item3" imageMso="HappyFace" />

    <item id="item4" imageMso="HappyFace" />

   </gallery>

   <dynamicMenu id="MyDynamicMenu" label= "My Dynamic Menu" getContent="GetMyContent" />

  </contextMenu>

 </contextMenus>

</customUI>

带着看起来像这样的 cs 文件:
private Office.IRibbonUI ribbon;

public Ribbon2()
{
}

#region IRibbonExtensibility Members

public string GetCustomUI(string ribbonID)
{
  return GetResourceText("WDCrypt2.Ribbon2.xml");
}

问题是,在我的Addin类中,我必须使用以下之一:
protected override Microsoft.Office.Core.IRibbonExtensibility CreateRibbonExtensibilityObject()
{

  return new Ribbon();

}

或者

protected override Microsoft.Office.Core.IRibbonExtensibility CreateRibbonExtensibilityObject()
{

  return new Ribbon2(); //The Context Menu

}

但我不能同时做到两者。如何同时获得上下文菜单和功能区?
编辑:我也希望避免使用Application.ItemContextMenuDisplay,因为它已被API正式弃用。

你在阅读和撰写窗口都成功显示出右键菜单了吗?我只能在撰写时看到它。 - wpfwannabe
应该在阅读中工作吗?您不会只是使用资源管理器窗口上的标准上下文菜单来预览窗格吗?阅读模式检查器不可编辑。或者也许您有另一个非邮件场景要在此模式下启用。 - Anonymous Type
如果您有兴趣,请提交此内容:http://stackoverflow.com/documentation/outlook-addin/commit - Kushan Randima
1个回答

14

您需要合并这两个功能区XML文件,并将它们与一个回调文件关联:

<?xml version="1.0" encoding="UTF-8"?>
<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui" onLoad="Ribbon_Load">
<ribbon>
<tabs>
  <tab id="testTab" label="Test Label">
    <group id="testGroup" label="test">
      <button id="testButton" onAction="testAction" label="Test" size="large" 
          getImage ="GetCustomImage" screentip="Test Ribbon Functionality."/>         
    </group>      
  </tab>
 </tabs>
</ribbon>
<contextMenus>
  <contextMenu idMso="ContextMenuText">
   <button idMso="FontDialog" visible="false" />
   <toggleButton id="MyToggle" label="My Toggle Button" />
   <button id="MyButton" label="My Button" insertBeforeMso="HyperlinkInsert" onAction="GetButtonID" />
   <menuSeparator id="MySeparator" />
   <menu id="MySubMenu" label="My Submenu" >
    <button id="MyButton2" label="Button on submenu" />
   </menu>
   <gallery id="galleryOne" label="My Gallery">
    <item id="item1" imageMso="HappyFace" />
    <item id="item2" imageMso="HappyFace" />
    <item id="item3" imageMso="HappyFace" />
    <item id="item4" imageMso="HappyFace" />
   </gallery>
   <dynamicMenu id="MyDynamicMenu" label= "My Dynamic Menu" getContent="GetMyContent" />
  </contextMenu>
 </contextMenus>
</customUI>

1
这是正确的,但问题的真正核心在于您无法使用该标题定义上下文菜单和功能区加载,因为功能区上下文菜单对于该标题来说太新了,我将相应地编辑您的帖子。编辑:实际上我不能这样做,所以如果您可以将xmlns更改为“http://schemas.microsoft.com/office/2009/07/customui”,那么您的答案将是正确的。 - Shane Chin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接