我正在尝试将一个控件从一个父级移动到另一个父级(我不太确定这是否可行)。我可以捕获我想要移动的控件。这是我的代码:
public void MoveElement(UIElement uiElement)
{
var element = ((FrameworkElement)uiElement).Parent;
//TODO:Remove from parent
myControl.Children.Add(uiElement);
}
当我点击最后一条语句时,会抛出一个 ArgumentException,指出“指定的 Visual 已经是另一个 Visual 的子项或 CompositionTarget 的根”。奇怪的是 Parent 返回 null。如何找到 parent ?这会起作用吗?
编辑: 我不认为实际移动一个元素是我的问题的答案。我正在使用 Visual Studio SDK,并且能够获取构成编辑器 Pane (扩展 DockPanel
)的 UIElement
。我试图将控件从标准编辑器移动到我正在开发的自定义工具窗口中。
这被证明是一个 hack,我意识到我需要同一个控件的多个实例,所以我认为一个更复杂的解决方案(和更少的 hack)已经存在。
最佳答案
Parent
属性指的是逻辑树,文档指出“在实例化元素但未附加到最终连接到页面级根元素,或应用程序对象。”例如,在 ListBox
中实例化的 DataTemplate
的根元素有一个空父元素。
尝试改用 VisualTreeHelper.GetParent
。可视化树是 WPF 元素组织方式的较低级别表示,并使您可以访问模板等东西扔在那里的所有额外“位”。例如,在 ListBox
中实例化的 DataTemplate
的根元素上调用 VisualTreeHelper.GetParent
会返回一个 ContentPresenter
。
请注意,仅仅因为您可以获得父视觉对象并不一定意味着您可以将其移除。某些元素(例如面板)为此提供了方法。但是,如果您找到的元素是 CheckBox
的一部分,我认为您将无法删除它。
如果您可以通过围绕可视化树移动控件来为您尝试实现的目标提供更多背景信息,人们可能会提供更具体的建议或替代方法。
关于c# - WPF FrameworkElement 父级和移动 UIElement,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2582619/