WPF FrameworkElement父级和移动UIElement

Ada*_*oll 6 .net c# wpf frameworkelement uielement

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

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

当我点击最后一个语句时,抛出ArgumentException,指出"指定的Visual已经是另一个Visual的子项或CompositionTarget的根".奇怪的是,Parent返回null.如何找到父母?这甚至会起作用吗?

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

这被证明是一个黑客,我意识到我需要同一控件的多个实例,所以我认为一个更复杂的解决方案(而不是一个黑客)存储.

ito*_*son 7

Parent属性引用逻辑树,并且文档注意"在实例化元素但未附加到最终连接到页面级根元素或应用程序对象的任何逻辑树的情况下,父可以为null".例如,a中DataTemplate实例化的根元素ListBox具有null Parent.

请尝试使用VisualTreeHelper.GetParent.可视化树是WPF元素组织方式的低级表示,并允许您访问所有额外的"位",其中包含模板化的内容.例如,调用实例化VisualTreeHelper.GetParent的根元素返回a .DataTemplateListBoxContentPresenter

请注意,仅仅因为您可以获得父视觉效果并不一定意味着您将能够删除它.某些元素(如Panel)为此提供了方法.但是,如果你找到的元素是a的一部分CheckBox,我认为你不能删除它.

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