如何使用OnRender事件,但只呈现给WPF中的控制区域?

如何使用OnRender事件,但只呈现给WPF中的控制区域?

问题描述:

背景:
我将一个控件从WinForms转换为WPF。在WinForms中,我覆盖了一个PictureBox并使用OnPaint事件来绘制我需要的控件。该控件将处理所有的双缓冲​​和裁剪。如何使用OnRender事件,但只呈现给WPF中的控制区域?

我将控件转换为WPF,并且现在从Canvas继承。我重写OnRender事件和绘图一切交给的DrawingContext,但它看起来像的DrawingContext让我过去控制绘制到视图的其余部分:

Render example

在上图中固体暗粉色框是控件,浅粉红色框和绿色线绘制在(0,0)处,但蓝色框绘制在(0,-100)处。

在WinForms中,PictureBox会剪裁任何不在控件区域中的东西。

此外,我发现如果盒子落在控件下方,蓝色盒子会被裁剪。我认为这是因为它确实夹在封闭网格下面,但我不确定。

问题:

  1. 究竟什么是做的DrawingContext,我为什么可以借鉴过去的我 控制?
  2. 如何在WPF中使用正确的 裁剪来实现相同的功能?我是否需要重写不同的功能,绘制不同的方式,或者是否有某种方法可以将我的 控件的OnRender方法中的图形限制到特定区域?
  3. 有没有更好的方法来实现我正在尝试做的事情(使用正确的剪裁和双缓冲对控件进行任意绘制)?

我尝试向Canvas子项添加形状,但是这非常缓慢。

+0

刚一说明:为了通过覆盖的OnRender你不需要从画布派生来实现自定义的渲染。 FrameworkElement甚至UIElement应该足够了。但是,您需要将ClipToBounds设置为true。 – Clemens 2014-09-25 21:00:18

+0

@Clemens,如果我重写其中的任何一个,它会处理双缓冲吗?在WinForms中,如果我覆盖Panel控件,则没有双缓冲,但PictureBox在控件中有双缓冲处理。我将使用像CAD视图这样的控件,允许用户通过缩放和平移等来移动和更改其内部的东西。 – 2014-09-25 21:17:35

+0

WPF中没有(内置)双缓冲。请参阅[这里](http://stackoverflow.com/a/1672595/1136211)。 – Clemens 2014-09-25 21:21:10

该问题与Canvas如何呈现内容有关。这意味着它的孩子可以在其实际区域之外渲染。然而,你可以通过属性 ClipToBounds设置为true避免默认行为:

yourCanvas.ClipToBounds = true;