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

问题描述 投票:0回答:2

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

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

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

c# controls
2个回答
2
投票

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

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

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


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
© www.soinside.com 2019 - 2024. All rights reserved.