2

我正在按照教程通过 VSTO 添加 Excel 功能区。我的问题和这个
完全一样。我已经访问了链接,但它对我没有帮助。答案很差,让我对如何解决这个问题一无所知。 如果我将功能区项直接添加到项目中,我就可以编译和运行加载项。但是,当我添加一个新文件夹然后在该文件夹中粘贴一个新项目(功能区)时,我收到了一个错误。我认为这与路径有关。 不知何故,我了解到 Visual Studio 2012 使用智能文件夹结构

(对不起这个糟糕的命名)这意味着它会在默认目录等中查找文件。如果您更改结构,那么您必须编辑一个文件(我不知道哪个)并指定您的新路径。我怀疑上面的问题。

解决方案资源管理器文件夹结构:
解决方案资源管理器文件夹结构

错误消息:

> 'MyAddIn.Ribbon.ThisRibbonCollection' does not contain a definition
> for 'GetRibbon' and no extension method 'GetRibbon' accepting a first
> argument of type 'MyAddIn.Ribbon.ThisRibbonCollection' could be found
> (are you missing a using directive or an assembly reference?)

编码:

partial class ThisRibbonCollection
{
    internal MyCustomRibbon MyCustomRibbon
    {
        get { return this.GetRibbon<MyCustomRibbon>(); }
    }
}


我的问题是:为了将部分类指向正确的位置,我必须修改哪些代码(命名空间?)?

4

3 回答 3

5

哈!我刚刚意识到这个问题有一个非常简单的解决方法。我确信还有其他方法,可能更复杂并且需要编码,来解决这个问题,但你为什么要首先让你的生活复杂化呢?:) 我认为这个解决方案通常适用于任何有类似问题的人。
我记得读过ASP.NET 4.5 IN C# and VB.NET。作者非常详细地向您介绍了 Visual Studio,并解释了如何使用Solution Exlorer. 我意识到可以在解决方案资源管理器中移动文件,而 Visual Studio 会自动references为我们更新所有文件。
当我将文件作为新项目(功能区 [Visual Designer])直接添加到项目中时,我能够编译和运行项目。当我在名为的项目解决方案中创建一个新文件夹时功能区 ,然后右键单击并添加了一个我收到错误的新项目。因此,我没有将新文件添加到功能区文件夹,而是将其直接添加到项目中,然后简单地将其拖到功能区文件夹中。嘘!该项目编译并运行,没有错误!
我不敢相信我一开始就没有想到它 -> 我想我按照教程太走神了......

步骤:
添加一个名为 Right click MyExcelAddIn > 的新文件夹和一个新项目(Visual Designer) 拖放到文件夹中 编译运行!享受Ribbon
将新文件夹添加到项目

Ribbon
右键单击

myRibbon.csRibbon
拖放



于 2013-06-14T11:08:38.917 回答
1

在我的情况下,ribbon.designer.cs 类中的命名空间错误(它是从不同项目复制的功能区,因此它具有其他项目命名空间名称)。

将命名空间更改为应该修复的名称。

于 2016-02-04T12:06:09.737 回答
0

我将尝试对这个问题提供更详细的解释。

ThisRibbonCollection存储在里面MyCustomRibbon.Designer.cs的类是一个部分类(https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/partial-classes-and-methods),这意味着这个内容类可以保存在不同的cs文件中。类的另一部分ThisRibbonCollection存在于内部ThisAddIn.Designer.cs,如下所示:

internal sealed partial class ThisRibbonCollection : Microsoft.Office.Tools.Ribbon.RibbonCollectionBase {
    internal ThisRibbonCollection(global::Microsoft.Office.Tools.Ribbon.RibbonFactory factory) : 
            base(factory) {
    }
}

在编译时,部分类被合并。这意味着一个分部类可以使用在另一个分部类中定义的方法/字段。在我们的例子ThisRibbonCollection中 fromMyCustomRibbon.Designer.cs使用在fromGetRibbon的基类中定义的方法。ThisRibbonCollectionThisAddIn.Designer.cs

但是只有当所有部分类定义都在同一个命名空间中时,部分类才会被合并。

当功能区移动到单独的文件夹时,命名空间会自动更新。这就是为什么类ThisRibbonCollection找不到' GetRibbon'方法。因为它不再与其他部分类合并。

解决方案:

  1. 在最后MyCustomRibbon.Designer.cs创建一个命名空间部分,其中包含加载项的根命名空间(与内部使用的命名空间相同ThisAddIn.Designer.cs

  2. 搬到那里ThisRibbonCollection

代码应如下所示:

namespace root-namespace
{
    partial class ThisRibbonCollection
    {
        internal forms.ELRibbon Ribbon1
        {
            get { return this.GetRibbon<forms.ELRibbon>(); }
        }
    }
}
于 2018-07-11T19:01:23.637 回答