【问题标题】:WPF FrameworkElement Parent and Moving a UIElementWPF FrameworkElement 父级和移动 UIElement
【发布时间】:2011-02-04 16:09:25
【问题描述】:

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

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)。

【问题讨论】:

    标签: c# .net wpf uielement frameworkelement


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 请注意我对更新信息的编辑。我不知道 VisualTreeHelper 存在。这应该有助于我识别父母。我不太确定移动控件实际上是我需要实现的目标。
    猜你喜欢
    • 2011-08-22
    • 2011-11-10
    • 1970-01-01
    • 2011-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多