首页 文章

WPF - 不用于绘图的可视树?

提问于
浏览
2

在调用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 isn 't drawn when it'仅仅添加到视觉树中 . 将它添加到属性 Children 的重要性是什么?更一般地说,OnRender如何称呼?通过可视树,或 Children 属性,还是?

1 回答

  • 3

    AddVisualChild没有做你可能想到的事情 .

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

    AddLogicalChild只是创建了LogicalTree . LogicalTree通常比VisualTree更小更短,这意味着它更快 .

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

    单独调用AddVisualChild和InvalidateVisual没有做任何事情 .

    另一方面,儿童收藏是一个UIElementCollection,可以自动完成我提到的所有上述事情 . 这就是为什么它与Children.Add(...)合作 .

    此外,您应该始终使用儿童系列而不是编写自己的东西 .

    像HighCore提到的那样,只需拥有一个合适的MVVM就可以解决许多问题 .

    也许你不需要自定义控件 .

相关问题