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

Mar*_*eIV 5 wpf rendering clipping

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

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

修剪的孩子

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

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

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

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

Jam*_*rst 0

我建议,一般来说,在 OnRender 方法中,您应该组合或渲染可见项目,并仔细注意它们的 Z 顺序,但不一定要花时间担心可见的内容。这不是 C++。WPF 设计背后的部分原因是系统应该能够为您决定什么是可见的、什么是不可见的。它旨在成为更高层次的抽象。如果您发现正在编写代码来测试可见内容以及可见部分的边界,那么您可能没有正确使用它。懒一点。。这(你上面描述的)应该很简单。

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

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