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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#中视觉元素的共同祖先是什么?相关的知识,希望对你有一定的参考价值。

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

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

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

答案

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

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

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

另一答案

没有共同的祖先,但是你可以通过使用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

以上是关于C#中视觉元素的共同祖先是什么?的主要内容,如果未能解决你的问题,请参考以下文章

echarts中视觉映射器(visualMap)与时间轴(timeline)混用的实现方法

智能车竞赛中视觉AI组别的打把问题

使用 jQuery 和 CSS 选择器选择嵌套元素的共同父/祖先

定向运动员识图过程中视觉搜索特征研究 Study on Visual Search Characteristics of Orienteers in the Process of Map Readin

C++ 常见祖先问题。它是啥?

Selenium 中视口中元素的验证