Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用OnRender事件,但仅渲染到WPF中的控制区域?_C#_Wpf_Canvas_Render - Fatal编程技术网

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

C# 如何使用OnRender事件,但仅渲染到WPF中的控制区域?,c#,wpf,canvas,render,C#,Wpf,Canvas,Render,背景: 我正在将控件从WinForms转换为WPF。在WinForms中,我重写了PictureBox,并使用OnPaint事件来绘制该控件所需的内容。该控件将处理所有的双缓冲和剪裁 我将控件转换为WPF,现在从画布继承。我正在重写OnRender事件并将所有内容绘制到DrawingContext,但DrawingContext似乎允许我通过控件绘制到视图的其余部分: 在上图中,实心深粉色框是控件,浅粉色框和绿色线在(0,0)处绘制,而蓝色框在(0,-100)处绘制 在WinForms中,Pi

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

我将控件转换为WPF,现在从画布继承。我正在重写
OnRender
事件并将所有内容绘制到DrawingContext,但DrawingContext似乎允许我通过控件绘制到视图的其余部分:

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

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

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

问题:

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

  • 我尝试向画布子对象添加形状,但速度非常慢。

    问题与画布如何渲染内容有关。这意味着可以在其实际区域之外渲染其子对象。但是,可以通过设置属性来避免这种默认行为
    cliptobunds
    true

    yourCanvas.ClipToBounds = true;
    

    请注意:为了通过覆盖OnRender实现自定义渲染,您不需要从画布派生。FrameworkElement甚至UIElement应该足够了。但是,您需要将ClipToBounds设置为true。@克莱门斯,如果我覆盖其中任何一个,它会处理双缓冲吗?在WinForms中,如果我重写面板控件,则没有双缓冲,但PictureBox在控件中有双缓冲。我将像CAD视图一样使用此控件,允许用户通过缩放和平移等方式移动和更改其中的内容。WPF中没有(内置)双缓冲。看见