gpt4 book ai didi

在运行时动态创建(封装)子项的 WPF 元素

转载 作者:行者123 更新时间:2023-12-05 00:41:17 25 4
gpt4 key购买 nike

我想创建一个 WPF 元素,该元素在运行时完全控制其子元素 - 在其属性更改时添加和删除子 UI。有点像 ItemsControl 在您修改其 ItemsSource 属性时所做的事情,尽管在我的情况下只有一个 child 。

这将是 MVVM 的 View 容器——当你给它一个模型或 View 模型时,它会神奇地创建正确的 View 并将所有东西连接起来。我的 View 容器不需要是模板化的(因为它创建了用户定义的 View ,这些 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”。但相反,我只看到一个空白窗口。所以显然我错过了一些东西。

如何修复上面的代码,以便“子”控件确实在运行时出现,但不会暴露给其他人弄乱(除了可以避免的以外)?

最佳答案

要回答您的具体问题,您还需要覆盖 GetVisualChildVisualChildrenCount属性以使您的子元素能够显示。

关于在运行时动态创建(封装)子项的 WPF 元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3101868/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com