如何将UserControl添加到Visual Studio工具箱中

102

在我的项目中,我创建了一个用户控件。在构建项目后,我需要将它放入工具箱,并将其用作普通控件,但我无法这样做。 UserControl 在我的项目命名空间中,我尝试在右键菜单中选择 选择项目,但我没有找到添加它的方法。

11个回答

131

我曾经无法使它们自动添加到工具箱中,就像在VS2008/2005中一样。

实际上,有一个选项可以阻止工具箱自动填充!

转到“工具”>“选项”>“Windows表单设计器”>“常规”

在列表底部,你会找到“工具箱”>“AutoToolboxPopulate”,在新安装中默认为False。将其设置为True,然后重新构建解决方案。

嘿,你的解决方案中的用户控件应该会自动添加到工具箱中。

你可能还需要重新加载解决方案。


37
这里对我而言关键词是“重建”……我之前没有尝试过,真是太蠢了!只需这样做就能解决我的问题。 - Danny Beckett
2
而且,在重建之后,我不得不重新打开解决方案。 - Jim Lahman
1
在VS2012中,他们现在已经在选项对话框中添加了提示“必须重新打开当前解决方案才能生效”。 - Carlos P
2
@AnatoliiGumennyi 如果“UserControl”位于当前项目之外,您将不得不遵循@Arseny的指示。 - Attacktive
2
注意:在VS2013中,工具箱> AutoToolboxPopulate设置现在在新安装上默认为True。 - Curmudgeon
显示剩余5条评论

37

在工具栏上右键单击,然后在上下文菜单中点击“选择项”。将弹出一个带有已注册组件的对话框。在此对话框中,单击“浏览”以选择包含您想要使用的用户控件的程序集。

提示:在此之前应该先注册该程序集。


18
你能否解释一下“registered before”的意思?我不认为这是必需的。 - H H
他可能是指你需要将用户控件放在一个单独的DLL中,然后在构建后将该DLL添加到工具箱中。 - Anes Hamdani

29

我发现用户控件必须有一个无参构造函数,否则它将不会显示在列表中。至少在vs2005中是这样的。


6
在 VS2015 中也是这样吗? - serdar
6
是的,也适用于VS2015。 - JRB
5
将VS2017加入列表。 - Ryan
1
如果这是基于创建自定义控件实例的方式,就像.NET序列化工作的方式一样,那么它可能会“始终”成立。如果没有无参数构造函数,则无法执行此操作。 - Jonas
谢谢!我花了半个小时把控件添加到工具箱中,这就是答案。 - Tommy

15

使用 VS 2010:

假设您有一个 Windows.Forms 项目。 您添加了一个用户控件(称为 MyControl)到该项目中,并对其进行了设计。 现在您想将其添加到工具箱中。

只要项目成功构建一次,它就会出现在您的 Framework 组件中。右键单击工具箱以获取上下文菜单,选择“选择项目...”,并浏览到您控件的名称(MyControl)位于“.NET Framework 组件”选项卡下。

与使用 dll 的优势:您可以在与窗体相同的项目中编辑控件,并且窗体将与新控件一起构建。但是,该控件仅对此项目可用。

注意:如果控件存在构建错误,请在继续处理包含的窗体之前解决这些错误,否则设计器可能会崩溃。


1
如果您将.exe文件导入到工具箱中,它也可以用于其他项目。 - Sebastian
1
任何回答中包含“或设计师心脏病发作”都会得到我的投票! - Joel
我做了同样的事情,一切都很好,但是当我将代码移动到另一个项目中,创建一个dll并引用该dll文件时,自定义控件就不会显示出来。 - Fandi Susanto

7

我有许多用户控件,但其中一个拒绝在工具箱中显示,即使我重建了解决方案并在选择项目...对话框中进行了勾选。

解决方案:

  1. 解决方案资源管理器中,右键单击出错的用户控件文件,选择从项目中排除
  2. 重建解决方案
  3. 右键单击用户控件,选择包括在项目中(假设您已在解决方案资源管理器中启用了显示所有文件

注意这还需要您启用AutoToolboxPopulate选项。如@DaveF答案所建议的。

备选解决方案:我不确定这是否有效,因为我已经解决了我的问题,但是如果您取消选中选择项目...对话框中的用户控件,然后点击确定,再打开它并选中用户控件。那也可能行得通。


3
有几种方法:
  1. 在您的原始项目中,选择文件|导出模板
    然后选择ItemTemplate并按照向导进行操作。

  2. 将您的用户控件移动到单独的ClassLibrary中(并修复命名空间等)。
    从需要它的项目中添加对类库的引用。别费心安装GAC或其他东西,只需使用DLL文件即可。

我不建议将用户控件放在普通的工具箱中,但可以这样做。请参见@Arseny的答案。


这似乎是更好的方法。唯一的缺点是您无法在视觉上编辑控件(或者至少我没有找到如何编辑)。 - Sebastian
没事了,我把模板作为元素添加了,设计师正在显示。 - Sebastian
我完全同意,并且强烈建议,如果包含UserControl的项目与DLL在同一个解决方案中,则不要链接到DLL。而且它也可以使用DLL,即库项目中的UserControl将出现在引用库的任何WinForms项目中(当然,在重新构建后)。;-) - Xan-Kun Clark-Davis

2
在我的情况下,我无法看到项目中的任何控件。只有右键单击工具箱并选择“显示所有”后,我才看到它们,但它们仍然被禁用...将项目类型从Windows应用程序更改为ClassLibrary即可解决问题。

1
基本问题是,如果您在基础控件中使用泛型,那么是这样的:
假设我们有一个控件:
public class MyComboDropDown : ComboDropDownComon<MyType>
{
    public MyComboDropDown() { }
}

MyComboDropDown将不允许在其上打开设计器,并且不会显示在工具箱中。 为什么?因为基础控件在编译MyComboDropDown时尚未编译。 您可以进行修改:

public class MyComboDropDown : MyComboDropDownBase
{
    public MyComboDropDown() { }
}

public class MyComboDropDownBase : ComboDropDownComon<MyType>
{

}

重建后,重置工具箱,就应该能在设计器和工具箱中看到MyComboDropDown。

0

重新编译对我有用!


0

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