我想创建一个 WPF元素,在运行时,它完全控制其子元素 – 在属性更改时添加和删除子UI.有点像ItemsControl在修改其ItemsSource属性时所做的事情,尽管在我的情况下只有一个孩子. 这将是MVVM的
这将是MVVM的视图容器 – 当你给它一个Model或ViewModel时,它会神奇地创建正确的View并连接所有东西.我的视图容器不需要是可模板化的(因为它创建了用户定义的视图,它们是UserControls并拥有自己的模板),我更希望它尽可能地封装.我可以通过降低Grid之类的内容,以及在我自己的属性发生变化时添加子控件来轻松地做到这一点.但Grid公开公开其子元素集合,并允许任何人添加和删除东西.
我应该从哪个WPF类中进行最大化封装,以及如何在运行时向其添加子元素?
基于我对文档的理解,我尝试使用FrameworkElement和AddVisualChild,只是为了看看我是否可以在运行时创建子控件.我不清楚AddLogicalChild是否是必要的,但我把它放在以防万一:
public class ViewContainer : FrameworkElement { private TextBlock _child; public ViewContainer() { _child = new TextBlock { Text = "ViewContainer" }; AddLogicalChild(_child); AddVisualChild(_child); InvalidateMeasure(); } public object Content { get; set; } protected override Size ArrangeOverride(Size finalSize) { _child.Arrange(new Rect(finalSize)); return finalSize; } protected override Size MeasureOverride(Size availableSize) { _child.Measure(availableSize); return _child.DesiredSize; } }
当我将ViewContainer放入一个Window并运行它时,我希望看到一个TextBlock说“ViewContainer”.但相反,我只看到一个空白的窗口.显然我错过了一些东西.
我如何修复上面的代码,以便“子”控件确实在运行时出现,但是没有暴露给别人搞乱(可以避免)?
要回答您的具体问题,您还需要覆盖 GetVisualChild和 VisualChildrenCount属性以启用子元素.