c# - WPF FrameworkElement 父级和移动 UIElement

标签 c# .net wpf uielement frameworkelement

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

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/

相关文章:

c# - 在 VS SETUP 项目中更改目标文件名

c# - 支持重复的多维键的字典?

c# - 如何创建全局变量,ASP.NET,全局asax

c# - 当模型中的列表更改时,ViewModel 中的 ObservableCollection 不会更新

c# - Fody NuGet 包如何在编译过程结束时合并程序集?

c# - 在 ASP.NET MVC 中,如何在整个页面中维护有关用户是否为 "logged in"的信息?

c# - 如何在 WPF C# 中绑定(bind)到类本身

c# - 使用System.Windows;不是名字空间

c# - jquery 主题生成器问题

C# 创建管理员快捷方式