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

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

当我击中最后一个陈述时,就会抛出参数证明,指出“指定的视觉已经是另一个视觉的孩子或组成图的根。”奇怪的是,父母正在返回零。如何找到家长?这还能用吗?

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

事实证明这是一种黑客攻击,我意识到我需要同一控件的多个实例,因此我认为一个更复杂的解决方案(而不是黑客攻击)已经存在。

有帮助吗?

解决方案

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

尝试使用 VisualTreeHelper.GetParent 反而。可视化树是 WPF 元素组织方式的较低级别表示,并让您可以访问模板等内容所添加的所有额外“位”。例如,调用 VisualTreeHelper.GetParent 在 a 的根元素上 DataTemplate 实例化在一个 ListBox 返回一个 ContentPresenter.

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top