【问题标题】:Converting an unknown class to its base class将未知类转换为其基类
【发布时间】:2015-05-13 07:32:31
【问题描述】:

我正在 Windows 窗体中创建一个自定义工具箱(就像您在 VS 窗体设计器中选择的控件一样)。要获取出现在控件文本一侧的图像,我正在使用这个:

ToolboxItem tbi = item as ToolboxItem;
var image = tbi.Bitmap;

其中 item 可以是任何类型的 Control。它正在正常工作。

当我尝试在工具箱中使用自定义控件时会出现问题。假设我创建了这个类:

public class PMLButton : Button
{
}

然后,当 PMLButton 被传递到“item”变量时,它会得到一个自定义控件的齿轮图标,就像它应该的那样。但在这种情况下,我想显示该项目的默认按钮图标。

我将在工具箱中使用的所有工具都派生自默认的 Windows 控件类(按钮、标签、复选框等)。

如果我将“item”变量转换为其基本类型,它将正常工作并显示正确的图像。有没有办法做到这一点?

【问题讨论】:

  • 我不确定我是否得到你想要的,但可能你可以使用 Convert.ChangeType (msdn.microsoft.com/de-de/library/…) 但你只会得到一个返回的对象,所以我不知道这是否有很大帮助。否则我想最好的解决方案是做简单的if (item is Button) x = (item as Button) 检查
  • @Staeff ChangeType 不起作用,因为我必须指定要转换的类型,这取决于对象。它始终是它的基本类型,但它可以是按钮、标签、复选框等。if 是我的第一个选项,但我必须为每种类型的控件添加一个 if。它有效,但我认为这不是一个优雅的解决方案。
  • 公平地说,标准 winforms 控件的数量有限。我想你也可以选择动态类型。

标签: c# winforms custom-controls


【解决方案1】:

ToolBoxItem 使用反射来获取类型,因此强制转换不会改变其行为。

最简单的解决方案是自己分配工具箱位图:

[ToolboxBitmap(typeof(Button))]
public class PMLButton : Button
{
}

或者,如果包含位图的控件始终位于继承树的上一级,您可以使用:

var image = new ToolboxItem(item.GetType().BaseType).Bitmap;

我肯定会选择属性解决方案,因为PMLButton 在设计器中也会有一个按钮位图。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多