1

我为 Visual Studio 2012 开发了 Excel 插件。使用项目 Excel 2010 插件。在项目中创建了一个 Ribbon (XML):

[ComVisible(true)]
public class PricelistRibbon : Office.IRibbonExtensibility
{
    private Office.IRibbonUI _ribbon;

    public PricelistRibbon()
    {
    }

    public event EventHandler ClickButtonRibben;

    protected virtual void OnClickButtonRibben()
    {
        var handler = ClickButtonRibben;
        if (handler != null) handler(this, EventArgs.Empty);
    }

    #region IRibbonExtensibility Members

    public string GetCustomUI(string ribbonID)
    {
        return GetResourceText("ProcessingPricelist.PricelistRibbon.xml");
    }

    #endregion

    #region Ribbon Callbacks
    //Create callback methods here. For more information about adding callback methods, select the Ribbon XML item in Solution Explorer and then press F1

    public void Ribbon_Load(Office.IRibbonUI ribbonUI)
    {
        _ribbon = ribbonUI;
    }

    public void OnAction(Office.IRibbonControl control)
    {
        OnClickButtonRibben();
    }

    #endregion

    #region Helpers

    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
}

在 ThisAddIn 中使用如下功能区:

public partial class ThisAddIn
{
    private void ThisAddIn_Startup(object sender, EventArgs e)
    {
    }

    private void ThisAddIn_Shutdown(object sender, EventArgs e)
    {
    }

    protected override Microsoft.Office.Core.IRibbonExtensibility CreateRibbonExtensibilityObject()
    {
        var pricelistRibbon = new PricelistRibbon();
        pricelistRibbon.ClickButtonRibben += PricelistRibbonOnClickButtonRibben;
        return pricelistRibbon;
    }

    private void PricelistRibbonOnClickButtonRibben(object sender, EventArgs eventArgs)
    {
        var control = sender as Office.IRibbonControl;
        if (control == null) return;
        try
        {
            Application.ScreenUpdating = false;

            switch (control.Id)
            {
                case "customButton1":
                    CreateSpecification();
                    break;
                //..............
            }
        }
        catch (Exception throwedException)
        {
            MessageBox.Show(throwedException.Message, @"Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
        finally
        {
            Application.ScreenUpdating = true;
        }
    }

    private void CreateSpecification()
    {
    }

    #region VSTO generated code

    /// <summary>
    /// Required method for Designer support - do not modify
    /// the contents of this method with the code editor.
    /// </summary>
    private void InternalStartup()
    {
        Startup += ThisAddIn_Startup;
        Shutdown += ThisAddIn_Shutdown;
    }

    #endregion
}

接下来我通过 ClickOnce 部署这个插件。已安装 MS Office 2007。已成功部署插件。在设置中,您可以看到 Excel 插件已安装,但在我的 TabControl 的磁带上不可见。如果我在磁带出现 TabControl 时创建了功能区(可视化设计器)而不是功能区(xml)。我该如何解决?

4

1 回答 1

2

这可能是因为ribbon.xml 中使用的命名空间在Office 2010 和2007 功能区中不同。Office 2007 Ribbon.xml 需要命名空间,例如

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

与 2010 年一样,您将不得不使用

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

建议创建两个ribbon.xml 并在下面的代码中执行类似的操作

protected override Office.IRibbonExtensibility CreateRibbonExtensibilityObject()
{
       majorVersion = Globals.ThisAddIn.Application.Version.Split(new char[] { '.' })[0];
        if (majorVersion == 12) //office 2007
        {
             return new Ribbon2007();
        }
        else if (majorVersion >= 14) //office 2010
        {
            return new Ribbon2010();
        }


}


[ComVisible(true)]
public class Ribbon2007: Office.IRibbonExtensibility
{
    public string GetCustomUI(string ribbonID)
        {
                    var ribbonXml = GetResourceText("Ribbon2007.xml");                 

    }
}


[ComVisible(true)]
public class Ribbon2007: Office.IRibbonExtensibility
{
    public string GetCustomUI(string ribbonID)
        {
            var ribbonXml = GetResourceText("Ribbon2010.xml");                 

    }
}
于 2013-04-05T01:15:08.533 回答