将内容附加到Window的根元素

时间:2018-08-03 21:57:18

标签: wpf

我知道几年来已经晚了,但是这里对WPF还是陌生的。

我试图将一个新元素附加到另一个Windows内容而不覆盖它。

例如,假设我要添加一个适合Window1的ActualWidth / ActualHeight的边框,我可以使用Window1.Content = new Border Content

但是我想添加到Window1内容而不覆盖它

让我们说Window1:

....
 <Grid>
  This is Window1 content root that possesses many children
 </Grid>
...

在Window2构造函数中:

public Window2(Window owner) {
    this.Owner = owner;

    //add element to root of Window1 (owner) fixed position 
}

因此,我对VisualTree遍历进行了一些研究,但是似乎没有记录的方法可以将元素添加到所有者根元素,除非您知道它的类型。

那里的问题是,将子级添加到那些元素是依赖方法。例如,向StackPanel添加子项与向Grid添加新行,然后向该行添加子项的方法不同。

是否有一种方法可以附加到内容上并模拟“固定”定位的元素(例如边框)。

1 个答案:

答案 0 :(得分:1)

总而言之,“否”。这不是WPF的工作方式。大多数WPF控件最终都是ContentControl的子类,后者仅支持单个Content对象:

    public object Content { get; set; }

这就是为什么如果您尝试执行以下操作会出现错误:

<Window x:Class="MyWpApp.MainWindow" ... etc...>

    <TextBlock Text="Hello World!" />
    <TextBlock Text="Goodbye World!" />

</Window>

ContentControl确实包含一个AddChild函数,但是如果在它已经有一个子对象(即System.InvalidOperationException: 'Content of a ContentControl must be a single element.')时调用它,则会再次出现错误。

解决此问题的方法是将子级设置为抽象类Panel的子类,该类确实支持多个子级:

public UIElementCollection Children { get; }

这是Grid,StackPanel等子类之类的基类。因此,如果您知道一个窗口已经设置为唯一子窗口,则可以执行以下操作:

(this.Content as Panel).AddChild(newChildControl);

这可能是您最接近所要查找的内容,但是显然您需要确保已将“面板”设置为开始的内容。