gpt4 book ai didi

c# - WPF - 视觉树不用于绘图?

转载 作者:行者123 更新时间:2023-11-30 22:10:13 24 4
gpt4 key购买 nike

我无法理解何时调用 OnRender 方法。考虑我的例子:我有一个派生自 FrameworkElement 的类 SomeElement,它覆盖了 OnRender 方法。假设我有一个 Grid 网格。我期望的是

var someElement = new SomeElement();
grid.AddVisualChild(someElement);
someElement.InvalidateVisual();

会触发 SomeElement.OnRender 方法。它不是我的情况,但以下情况:

var someElement = new SomeElement();
grid.Children.Add(new SomeElement());
someElement.InvalidateVisual();

所以我的问题是为什么 someElement 在单独添加到可视化树时没有被绘制。将它添加到属性 Children 中有什么重要性?更一般地说,OnRender 是如何调用的?通过可视化树或 Children 属性,或者?

最佳答案

AddVisualChild 并没有像您想象的那样做。

AddVisualChild 用于在 VisualTree 中的两个视觉对象之间创建父子关系。没有更多或更少。 VisualTree 不会呈现其中的所有内容。

AddLogicalChild 执行相同的操作,只是它创建了 LogicalTree。 LogicalTree 通常比 VisualTree 更小更短,这意味着它更快。

为了完全支持你的 child 的渲染,你需要调用他们的测量方法和安排方法。此外,您需要更改父项的 VisualChildrenCount 属性并将正确的大小传递给每个子项,并且您需要将它们放置在适当的位置以便用户能够看到它们。然后事情就会被渲染。

单独调用 AddVisualChild 而 InvalidateVisual 没有做任何事情。

另一方面,Children 集合是一个 UIElementCollection,它自动完成我提到的所有上述事情。这就是它与 Children.Add(...) 一起工作的原因。

此外,您应该始终使用 Children 集合而不是编写自己的东西。

就像 HighCore 提到的,许多问题都可以通过简单地拥有适当的 MVVM 来解决。

也许您不需要自定义控件。

关于c# - WPF - 视觉树不用于绘图?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21001959/

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