我正在尝试将控件从一个父级移动到另一个父级(如果这样可行,我不太确定)。我可以掌握我想要移动的控件。这是我的代码:
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,并且能够获得构成编辑器窗格的UIElement
(扩展DockPanel
)。我试图将控件从标准编辑器移动到我正在开发的自定义工具窗口中。
这被证明是一个黑客,我意识到我需要同一控件的多个实例,所以我认为存储更复杂的解决方案(而不是一个黑客)。
答案 0 :(得分:7)
Parent
属性引用逻辑树,文档注意“在实例化元素但未附加到最终连接到页面级别根的任何逻辑树的情况下,Parent可能为null元素或应用程序对象。“例如,在DataTemplate
中实例化的ListBox
的根元素具有空Parent。
请尝试使用VisualTreeHelper.GetParent
。可视化树是WPF元素组织方式的低级表示,并允许您访问所有额外的“位”,其中包含模板化的内容。例如,在VisualTreeHelper.GetParent
中实例化的DataTemplate
的根元素上调用ListBox
会返回ContentPresenter
。
请注意,仅仅因为您可以获得父视觉效果并不一定意味着您将能够删除它。某些元素(如Panel)为此提供了方法。但是,如果您找到的元素是CheckBox
的一部分,我认为您无法删除它。
如果您可以通过围绕可视化树移动控件来为您尝试实现的目标提供更多上下文,那么人们可能能够提供更具体的建议或替代方法。