有没有一种简单的方法来确定控件的可见边界以优化渲染?

时间:2012-12-19 15:44:03

标签: wpf rendering clipping

我们有一个非常大的子控件,它会进行大量渲染以显示其细节,但由于该控件的一部分实际上是可见的(它被层次结构中的某些部分剪切,不一定是它的直接父级)我们只想要在OnRender呼叫期间渲染可见部分。

考虑以下图片。孩子是100x50但是可见区域是一个矩形,在子坐标中的角为(10,5)和(100,50)。那是我们正在寻找的领域。

Clipped Child

注意:您不能简单地从子项到父项进行坐标转换并测试剪辑,因为它可能不是正在进行剪辑的父项。

考虑ScrollViewer中嵌套的Canvas控件。内部Canvas可以完全位于外部Canvas的边界内,但外部Canvas可能会被ScrollViewer剪切掉,因此内部Canvas也会被它视觉剪切。

走视觉树并测试每个父母会破坏性能。

WPF内置了什么内容可以获取控件可见区域的边界?

1 个答案:

答案 0 :(得分:0)

我建议,一般来说,在你的OnRender方法中,你应该仔细关注他们的Z顺序来构图或渲染你的可见项目,但不一定花时间担心可见的东西。这不是C ++。 WPF设计背后的部分原因是系统应该能够为您决定,哪些是可见的,哪些是不可见的。它旨在成为一种更高级别的抽象。如果您发现您正在编写代码来测试可见内容以及该可见部分的界限 - 您可能没有正确使用它。要......有点懒散。这(你上面描述的)应该很简单。

当您的可见对象滑动或以垂直顺序(即Z顺序)移动时 - 它们将变得可见或不可见。如果你希望某些内容不可见,尽管它在Z顺序中的位置,那么你使它不可见(理想情况下,通过将它绑定到一个评估为Visibility.Visible,Visibility.Hidden或Visibility.Collapsed的属性)。

另请注意:在查看各种图形实现时 - 特别是对于从其他平台访问WPF的开发人员,我经常发现实际上没有必要覆盖OnRender。除非您有大量必须实时渲染的图形,否则您通常可以让WPF为您完成工作,并定义您希望在XAML中显示的内容。