Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么';C#中视觉元素的共同祖先是什么?_C#_Controls - Fatal编程技术网

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

什么';C#中视觉元素的共同祖先是什么?,c#,controls,C#,Controls,我很难相信这里没有答案,但它看起来确实不存在 我试图迭代表单上的所有内容,并根据标记值设置可见和启用的属性。我发现在迭代控件的例程和迭代菜单的例程之间有一个完全重复的例程的味道——虽然这两个类都有可见、启用和标记属性,但它们似乎是独立的项 据我所知,树只在组件处聚合——但这缺乏视觉特性。没错,没有共同的祖先。ToolStripMenuItem类派生自ToolStripItem,ToolStripItem是MenuStrip或ToolStrip中许多派生类的基类。它们是特殊的,因为它们不是从控件派

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

我试图迭代表单上的所有内容,并根据标记值设置可见和启用的属性。我发现在迭代控件的例程和迭代菜单的例程之间有一个完全重复的例程的味道——虽然这两个类都有可见、启用和标记属性,但它们似乎是独立的项


据我所知,树只在组件处聚合——但这缺乏视觉特性。

没错,没有共同的祖先。ToolStripMenuItem类派生自ToolStripItem,ToolStripItem是MenuStrip或ToolStrip中许多派生类的基类。它们是特殊的,因为它们不是从控件派生的。它们是无窗口控件,没有句柄属性。这是控件基类的关键属性

这是一个优化,控件派生类很昂贵。他们需要一个本机Windows窗口,这是一个沉重的操作系统对象,开销很大。当你在一个表单上放置,比如说,50个按钮时,这是非常明显的。你可以看到它在画画


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

没有共同的祖先,但是您可以通过使用
动态
类型来避免这种情况。例如:

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

你指的是WinForms、WebForms还是WPF?@傻瓜:猜测WinForms,因为他引用了
标记
,该标记只存在于WinForms控件结构中。@是的,我确实认为是Windows窗体,但因为组件是共同的祖先。WPF控件确实有标记属性。标记位检查当前用户是否应该能够使用该项。这不是启用/可见的目的吗?如果用户无法使用该项,则禁用它(窗口将以相当明确的方式呈现),或者将其完全隐藏。在大多数终端用户应用程序中,用户不想看到一大堆他们不能做的事情,他们的主管也不想看到(因为主管最终总是会按照“为什么我没有权限这么做?”)的思路处理请求/投诉@Keith:他使用Tag属性的意思是“只有特权用户才能看到”.确切地说--标记标识附加到函数的安全性。如果他们有该标签的授权,它就会出现,如果他们没有,它就不会出现。可见/禁用基本上仅用于诊断。