【问题标题】:Having my userControl have its own icon on the toolbox让我的 userControl 在工具箱上有自己的图标
【发布时间】:2010-11-12 21:34:31
【问题描述】:

我制作了一个直接从 ErrorProvider 继承的控件。我认为应用 ToolboxBitmap 属性足以让我的控件在工具箱上具有与原始控件相同的图标,但事实并非如此。很奇怪,好像我将控件添加到表单中一样,它会按原样显示,但不会更改工具箱的图标。我在这里想念什么?我已经重新启动了 Visual Studio,它仍然保持这种行为。

[ToolboxBitmap(typeof(ErrorProvider))]
public class ErrorProviderEx : ErrorProvider {
...
}

【问题讨论】:

  • 仅供参考:这些类型的控件是 Web 自定义控件 (WCC),而不是 Web 用户控件 (WUC)。 WUC 是在 Web 项目范围内使用的 ascx 文件,WCC 在机器范围内使用......所以在你的情况下,你应该在你的问题中写 WCC - 只是为了不混淆其他人。
  • 我不知道你在说什么。这是 System.Windows.Forms.ErrorProvider。
  • 如果您提供位图的“硬编码”路径 (ToolboxBitmap("c:\\my.bmp") 是否仍显示默认位图?
  • 是的,完全相同的行为。它适用于实际表单上的控件,但不适用于工具箱。

标签: c# .net vb.net winforms controls


【解决方案1】:

确保工具栏图标出现的最简单方法是创建一个 16x16 bmp 文件,将其放在控件的项目文件夹中,然后将其设置为嵌入式资源。

让我们看一个相对简单的例子:假设您有一个名为 MyCompany.Components.MyControl 的组件。创建一个 16x16 位图并将其作为 MyControl.bmp 保存到 MyCompany.Components.MyControl 项目文件夹的根目录中。然后右键单击 MyControl.bmp 文件并选择 Properties > Build Action > Embedded Resource。此时,您还有一个步骤:在您的类定义上方添加 ToolboxBitmap 属性(如果使用部分类,我将该属性放在控件的主 .cs 文件中,而不是在 Designer.cs 文件中)。为此,请使用以下语法:

[ToolboxBitmap(typeof(MyControl), "MyControl.bmp")]

绝对确定:

  • 您的 MyControl 项目类的命名空间与您的项目在解决方案中出现的文件夹结构相匹配。
  • 可能看起来很明显,但请确保您为 bmp 文件引用了正确的名称。

无论何时将控件添加到工具箱中,无论是手动添加还是以编程方式添加,您的位图都应该出现。

【讨论】:

    【解决方案2】:

    所以有一个解决方法。假设您的 UserControl 在“MyControl”项目中,请添加对自身的引用。即:在 MyControl 项目中引用 MyControl 项目,就像在另一个项目中所做的那样。然后该图标也将显示在该 MyControl 项目的工具箱中。

    【讨论】:

      【解决方案3】:

      在 Visual Studio 2008 中,出于性能原因,ToolBoxBitmap 指定的图标不会添加到当前解决方案中任何组件的工具箱中。使用标准的“齿轮”图标。如果您通过 Toolbox...Add Items...对话框手动添加您的程序集,自定义图标将显示您遇到的行为。此外,当您将 ErrorProviderEx 拖动到表单时,将使用您指定的图标,这也是您在评论中提到的行为。

      注意,在您的情况下,您使用的是typeof(ErrorProvider),因此您不会遇到使用自定义位图的正常问题。

      (对于 Visual Studio 2005,这种行为也可能是正确的。Visual Studio 2003 通过显示图标宠坏了我们。)(我个人不喜欢这种新行为。我愿意多等一两秒钟让 IDE检索解决方案中所有控件和组件的图标。我想知道是否存在注册表黑客来显示图标。)

      【讨论】:

      • 这仍然是 VS 2010 的当前行为。据我所知,没有出现任何注册表黑客行为。
      • 在 VS 2013 中还是一样。
      【解决方案4】:

      是否在同一个项目中?还是你引用的dll?

      您只有在引用固定的 dll 时才能获得正确的图标。尝试构建一个控制 dll 并引用它。

      【讨论】:

      • 啊。它在另一个项目中,在同一个解决方案中。所以没有变通办法?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-02-15
      • 1970-01-01
      • 1970-01-01
      • 2010-10-19
      • 1970-01-01
      • 1970-01-01
      • 2013-07-11
      相关资源
      最近更新 更多