WPF框架元素的父级和移动UI元素

6

我想将一个控件从一个父级移动到另一个父级(我不确定这是否有效)。我可以获取要移动的控件。以下是我的代码:

public void MoveElement(UIElement uiElement)
{
    var element = ((FrameworkElement)uiElement).Parent;
    //TODO:Remove from parent
    myControl.Children.Add(uiElement);
}

当我执行最后一个语句时,会抛出一个ArgumentException,指出“指定的Visual已经是另一个Visual的子级或CompositionTarget的根。”奇怪的是,Parent返回null。如何找到父级?这样做有用吗?
编辑:我不认为实际移动元素是解决我的问题的答案。我正在使用Visual Studio SDK,并能够获得组成编辑器窗格(扩展DockPanel)的UIElement。我尝试将控件从标准编辑器移动到我正在开发的自定义工具窗口中。
这被证明是一种hack方法,我意识到需要多个相同控件的实例,因此我认为需要更复杂的解决方案(而不是hack)。
1个回答

7
Parent 属性是指逻辑树。文档指出,“在某些情况下,元素已被实例化,但未连接到任何最终连接到页面级根元素或应用程序对象的逻辑树中,此时 Parent 可能为 null。”例如,在 ListBox 中实例化的 DataTemplate 的根元素具有 null Parent。
尝试使用 VisualTreeHelper.GetParent。可视树是 WPF 元素组织方式的低级表示,提供了访问诸如模板等所有额外“位”的方法。例如,在 ListBox 中实例化的 DataTemplate 的根元素上调用 VisualTreeHelper.GetParent 将返回一个 ContentPresenter
请注意,仅因为您可以获取父可视元素并不一定意味着您将能够删除它。某些元素(例如面板)提供了相应的方法。但如果您定位的元素是 CheckBox 的一部分,则无法删除它。
如果您可以为移动控件的目的提供更多上下文信息,人们可能会提供更具体的建议或替代方法。

注意我的编辑,更新了信息。我不知道VisualTreeHelper的存在。这应该有助于我识别父级。我不太确定移动控件是否实际上是我需要实现的。 - Adam Driscoll

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