我想创建一个WPF元素,在运行时完全控制其子元素——当其属性更改时添加和删除子UI。这有点像修改ItemsControl的ItemsSource属性时所做的操作,不过在我的情况下只会有一个子元素。
这将是MVVM的视图容器——当您提供一个模型或视图模型时,它将自动创建正确的视图并连接一切。我的视图容器不需要可模板化(因为它创建用户定义的视图,这些视图是UserControls并具有自己的模板),我希望尽可能地封装它。我可能可以通过从类似Grid的东西中下降,并在自己的属性更改时添加子控件来轻松完成此操作;但是Grid公开了其子元素的集合,并允许任何人添加和删除内容。
哪个WPF类应该从最大的封装下降,并如何在运行时向其中添加子元素?
基于我对文档的理解,我尝试使用FrameworkElement和AddVisualChild,只是为了看看是否能够在运行时创建子控件。我不确定是否需要AddLogicalChild,但我还是加上了:
当我把一个ViewContainer放入一个Window中,运行程序时,我期望看到一个TextBlock显示"ViewContainer"。但是实际上,我只看到了一个空白窗口。显然,我遗漏了一些东西。
如何修复上述代码,让"child"控件在运行时出现,但其他人无法乱搞它(除非完全避免不了)?
这将是MVVM的视图容器——当您提供一个模型或视图模型时,它将自动创建正确的视图并连接一切。我的视图容器不需要可模板化(因为它创建用户定义的视图,这些视图是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"。但是实际上,我只看到了一个空白窗口。显然,我遗漏了一些东西。
如何修复上述代码,让"child"控件在运行时出现,但其他人无法乱搞它(除非完全避免不了)?