我很难相信这里没有答案,但它看起来确实不存在。
我正在尝试迭代表单上的所有内容,并根据标记值设置可见和启用的属性。我发现在例程迭代控件和例程迭代菜单之间有一个绝对重复的例程 - 虽然这两个类都有可见,启用和标记属性,但它们看起来是单独的项目。
据我所知,树只会收集到Component - 但这缺乏视觉属性。
答案 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