你如何获取UIElement的父级?

10

好的,我知道FrameworkElementUIElement的直接子类,具有Parent属性,但Panel对象的子元素为UIElement类型,而不是FrameworkElement类型(Children属性是UIElementCollection类型),这意味着您可以直接向Panel添加UIElement

话虽如此,如果您有一个UIElement并希望查看其是否具有面板父级,则我所知道的唯一方法是使用VisualTreeHelper,但那是可视树,而不是逻辑树。(至少我们知道面板没有模板,所以也许这就是方法,但仍然...)

除了VisualTreeHelper之外,还有什么方法可以确定哪个面板(如果有)是UIElement的父级?(...您有任何想法吗?为什么他们没有在FrameworkElement上定义一个父级属性呢?)

谢谢!

1个回答

7

如果您需要找到逻辑父级,可以像使用VisualTreeHelper一样使用LogicalTreeHelper

至于“...并且您是否认为他们为什么不在FrameworkElement上定义一个Parent属性?”基本上,“逻辑树”的概念是在FrameworkElement级别引入的。请参见http://msdn.microsoft.com/en-us/library/system.windows.frameworkelement.aspx(请参见Remarks)以了解FrameworkElement添加到UIElement的详细信息。下面是有关逻辑树的说明:

逻辑树:通常将WPF编程模型表示为元素树。支持将元素树表示为逻辑树,并伴随着在标记中定义该树的支持是在FrameworkElement级别实现的。但是请注意,FrameworkElement故意不定义内容模型,并将该责任留给派生类。有关更多信息,请参见WPF中的树


我知道物理树和逻辑树之间的区别,但这不是我的问题。在这里我也不能使用LogicalTreeHelper,因为画布很可能是可视树的一部分。不过,我确实理解你提到的父级的观点。我的论点是为什么不创建一个单独的VisualParent呢?我想最终只能使用VisualTreeHelper(或者附加方法)来获取父面板。虽然从技术上讲这不是答案,但我还是将其标记为答案,因为看起来没有其他更好的选择了。 - Mark A. Donohoe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接