C#中视觉元素的共同祖先是什么?

时间:2010-08-31 23:00:28

标签: c# controls

我很难相信这里没有答案,但它看起来确实不存在。

我正在尝试迭代表单上的所有内容,并根据标记值设置可见和启用的属性。我发现在例程迭代控件和例程迭代菜单之间有一个绝对重复的例程 - 虽然这两个类都有可见,启用和标记属性,但它们看起来是单独的项目。

据我所知,树只会收集到Component - 但这缺乏视觉属性。

2 个答案:

答案 0 :(得分:2)

这是正确的,没有共同的祖先。 ToolStripMenuItem类派生自ToolStripItem,它是许多派生类的基类,这些派生类是MenuStrip或ToolStrip的一部分。它们很特殊,因为它们不是来自Control。它们是无窗口控件,它们没有Handle属性。哪个是Control基类的关键属性。

这是一个优化,Control派生类很昂贵。他们需要一个原生的Windows窗口,一个繁重的操作系统对象,有很多开销。当你把一个表格上的50个按钮放在上面时,真的很明显。你可以看到它画画。

因此,复制此逻辑是正常的。使用Tag属性来控制状态不是。

答案 1 :(得分:0)

没有共同的祖先,但是您可以使用dynamic类型来绕开它。例如:

object control = new Button() { Tag = "Whatever" };
object menuItem = new ToolStripMenuItem { Tag = "Something else" };
object tag1 = (control as dynamic).Tag;
object tag2 = (menuItem as dynamic).Tag;
// Do something with tag1 and tag2