6

我正在尝试将控件从一个父级移动到另一个父级(如果这可行,我不太确定)。我可以抓住我想要移动的控件。这是我的代码:

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

当我点击最后一条语句时,会引发 ArgumentException,说明“指定的视觉对象已经是另一个视觉对象的子对象或 CompositionTarget 的根”。奇怪的是,Parent 正在返回 null。如何找到父级?这甚至会起作用吗?

编辑:我不认为实际移动元素是我问题的答案。我正在使用 Visual Studio SDK,并且能够掌握UIElement构成编辑器窗格(扩展DockPanel)的内容。我试图将控件从标准编​​辑器移动到我正在开发的自定义工具窗口中。

这被证明是一个 hack,我意识到我需要同一个控件的多个实例,所以我认为一个更复杂的解决方案(和更少的 hack)正在存储中。

4

1 回答 1

7

Parent属性指的是逻辑树,文档指出“在元素被实例化但未附加到最终连接到页面级根元素或应用程序对象的任何逻辑树的情况下,父级可能为空。” 例如,在 a中DataTemplate实例化的根元素的ListBoxParent 为空。

尝试VisualTreeHelper.GetParent改用。可视化树是 WPF 元素如何组织的较低级别的表示,它使您可以访问诸如模板之类的所有额外“位”。例如,调用a中实例化VisualTreeHelper.GetParent的根元素会返回 a 。DataTemplateListBoxContentPresenter

请注意,仅仅因为您可以获得父视觉对象并不一定意味着您可以将其删除。一些元素,例如面板,为此提供了方法。但是,如果您找到的元素是 a 的一部分CheckBox,我认为您将无法删除它。

如果您可以通过在可视化树中移动控件来为您尝试实现的目标提供更多上下文,那么人们可能能够提供更具体的建议或替代方法。

于 2010-04-06T04:41:06.313 回答