如何使用OnRender事件但仅渲染到WPF中的控件区域?

时间:2014-09-25 20:35:56

标签: c# wpf canvas render

背景:
我正在将控件从WinForms转换为WPF。在WinForms中,我覆盖了PictureBox并使用OnPaint事件来绘制我需要的控件。该控件将处理所有双缓冲和裁剪。

我将控件转换为WPF,现在继承自Canvas。我正在覆盖OnRender事件并将所有内容绘制到DrawingContext,但看起来DrawingContext允许我将控件绘制到视图的其余部分:

Render example

在上图中,实心深粉色框为控件,浅粉色框和绿色线条绘制在(0,0),但蓝色框绘制在(0,-100)。

在WinForms中,PictureBox会剪切不在控件区域内的任何内容。

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

的问题:

  1. DrawingContext到底在做什么,为什么我可以画过我的 控制?
  2. 如何正确实现相同的功能 在WPF剪辑?我是否需要覆盖不同的功能,绘制不同的方式,或者是否存在 某种方式我可以限制我的OnRender方法中的绘图 控制到特定区域?
  3. 有没有更好的方法来实现我想要做的事情(任意绘制到具有正确剪辑和双缓冲的控件)?
  4. 我尝试向Canvas孩子添加形状,但这非常慢。

1 个答案:

答案 0 :(得分:2)

问题与Canvas如何呈现内容有关。这意味着它的孩子可以在其实际区域之外呈现。但是,您可以通过设置属性来避免该默认行为  ClipToBoundstrue

yourCanvas.ClipToBounds = true;