我知道几年来已经晚了,但是这里对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添加新行,然后向该行添加子项的方法不同。
是否有一种方法可以附加到内容上并模拟“固定”定位的元素(例如边框)。
答案 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);
这可能是您最接近所要查找的内容,但是显然您需要确保已将“面板”设置为开始的内容。