Panel.Children 与 Panel.InternalChildren - 有啥区别?

Posted

技术标签:

【中文标题】Panel.Children 与 Panel.InternalChildren - 有啥区别?【英文标题】:Panel.Children vs Panel.InternalChildren -- What's the difference?Panel.Children 与 Panel.InternalChildren - 有什么区别? 【发布时间】:2011-07-31 20:03:19 【问题描述】:

根据MSDN - Panel.InternalChildren Property:

派生自Panel 的类 应该使用这个属性,而不是 Children 属性,用于内部覆盖,例如 作为MeasureCore 和ArrangeCore。


所以,这实际上是一个两部分的问题:

    如果我创建自己的面板FooPanel,它派生自Panel,我似乎无法覆盖MeasureCoreArrangeCore。我不确定为什么会出现这种说法。但是,我可以覆盖 MeasureOverrideArrangeOverride。所以,我想知道我是否还需要为这两种方法使用InternalChildren 属性。

    Children 属性和InternalChildren 属性之间的真正区别是什么?

【问题讨论】:

【参考方案1】:

    您将覆盖 MeasureOverride 和 ArrangeOverride,这肯定是文档中的错误,或者是针对 Microsoft 内部员工的。 MeasureCore 和 ArrangeCore 由 FrameworkElement 密封,因此您无法覆盖它们。

    Children 属性是公共的,只调用受保护的 InternalChildren。所以任何一个都可能是安全的,因为孩子会被内联。

MSDN 另有说明 (http://msdn.microsoft.com/en-us/library/ms754152.aspx) 但文档有误。 (使用反射器可以看到Children的实现只是调用了InternalChildren)

【讨论】:

children 和 internalchildren 不等价 或者我们看源码:referencesource.microsoft.com/#PresentationFramework/src/… 这仅适用于默认实现,正如代码所证明的那样,它只返回 InternalChildren。但是,如果您要对面板进行子类化,您的面板可能会在属于 Children 集合的部分之外添加额外的项目(例如标题或支持视图等)。在这种情况下,它们应该添加到 InternalChildren 集合中,但是您还应该维护自己的 Children 集合,该集合仅代表绑定的孩子。默认情况下,框架提供的面板除了Children外不添加任何东西,因此它只是直接返回InternalChildren。 嗯...好点!我的理解是,如果您自己将一个孩子添加到“儿童”集合中,您可以在内部,比如说,添加另一个孩子来“标记”第一个孩子,等等。在这种情况下,孩子将只包含您添加的那个,但InternalChildren 将包含两者。但是,正如您所说,您不能覆盖 Children,所以现在我和 OP 一样困惑!【参考方案2】:

编辑: 正如 CodeNaked 更正的那样 - MSDN 文档实际上是不正确的。 InternalChildren 和 Children 是一样的。

使用反射器,你可以看到Children的实现是public UIElementCollection Children get return this.InternalChildren; 。所以除非有一些巫术,否则它们是一样的。


子项只是定期添加的子项,而 InternalChildren 包括通过数据绑定添加的子项(当面板为 ItemsPanelTemplate 时)

"Children 表示 Panel 所在的元素的子集合 包含。 InternalChildren 代表 Children 的内容 集合加上数据绑定生成的那些成员。两者都包含 托管在父元素中的子元素的 UIElementCollection 面板。”

见http://msdn.microsoft.com/en-us/library/ms754152.aspx

【讨论】:

以上是关于Panel.Children 与 Panel.InternalChildren - 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

为带有线条的条形图设置相应的颜色

LDAP 与 MYSQL .. JA-SIG CAS 与 LDAP 与 CAS 与 MySQL

python网络编程基础(线程与进程并行与并发同步与异步)

=与==&与&&| 与 || 的区别

与 0 进行比较与与某个值进行比较是不是更快?

三.工具与市场-债券与债务股票与公司