【问题标题】:WPF - Visual tree not used for drawing?WPF - 不用于绘图的视觉树?
【发布时间】:2014-01-08 17:02:39
【问题描述】:

我无法理解何时调用 OnRender 方法。 考虑我的例子: 我有一个派生自 FrameworkElement 的类 SomeElement ,它覆盖了 OnRender 方法。 假设我有一个Grid 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 属性,还是?

【问题讨论】:

  • 你想做什么?覆盖 OnRender() 不是您在 WPF 中经常要做的事情。
  • 尽管很难在 Grid 实例上调用受保护的 AddVisualChild 方法。
  • @HighCore:我正在尝试在网格顶部画几条线。我想我会把它们放在一个专门绘制这些线条的元素中。顺便说一句,我是 WPF 新手,您可能会注意到...
  • @JBSnorro 您可能希望使用适当的 WPF 模式和实践在 WPF 中查看 My Example 这样的事情。

标签: c# wpf onrender


【解决方案1】:

AddVisualChild 并没有像你想的那样做。

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

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

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

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

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

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

就像 HighCore 提到的,很多问题都可以通过简单的 MVVM 来解决。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-19
    相关资源
    最近更新 更多