c# - 如何使用 OnRender 事件但仅呈现到 WPF 中的控制区域?

标签 c# wpf canvas render

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

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

Render example

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

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

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

问题:

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

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

最佳答案

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

yourCanvas.ClipToBounds = true;

关于c# - 如何使用 OnRender 事件但仅呈现到 WPF 中的控制区域?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26047640/

相关文章:

c# - 添加更多我的用户控件容器或用户控件集合显示

c# - 转换器应该抛出任何类型的异常吗?

javascript - 如何使用 paperjs 滚动 Canvas ?

javascript - 触发从 canvas.toDataURL 客户端下载?

javascript - 调整 Canvas 大小

c# - C# 可以存储比 double 更精确的数据吗?

c# - 在 Sharpdevelop 3.x 中使用 AvalonEdit

c# - c# 用 Excel 打开的正确 CSV 编码是什么?

c# - 是否可以编写一个 IIS URL 重写规则来检查 HTTP Post 的内容?

c# - 如何访问代码隐藏文件(xaml.cs)之外的样式?