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
,我似乎无法覆盖MeasureCore
或ArrangeCore
。我不确定为什么会出现这种说法。但是,我可以覆盖 MeasureOverride
和 ArrangeOverride
。所以,我想知道我是否还需要为这两种方法使用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 - 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章