C# 如何使RenderTargetBitmap和VisualBrush一起很好地发挥作用?

C# 如何使RenderTargetBitmap和VisualBrush一起很好地发挥作用?,c#,.net,wpf,visualbrush,rendertargetbitmap,C#,.net,Wpf,Visualbrush,Rendertargetbitmap,我的要求: 一种持久的UserControl,用于处理自定义图像(如地图或图形)的逻辑 一组容器,用于在缩放或平移移动期间对图像进行缓存 VisualBrush我可以添加到容器中用于特效的UserControl副本 我目前使用RenderTargetBitmap实现图像缓存,但我使用的VisualBrush-覆盖的矩形对象似乎有问题 我的问题:在RenderTargetBitmap使用VisualBrush对象后,我可以在该代码中添加/更改哪些内容以使其正确渲染?RenderTargetBi

我的要求:

  • 一种持久的
    UserControl
    ,用于处理自定义图像(如地图或图形)的逻辑
  • 一组容器,用于在缩放或平移移动期间对图像进行缓存
  • VisualBrush
    我可以添加到容器中用于特效的
    UserControl
    副本
我目前使用RenderTargetBitmap实现图像缓存,但我使用的
VisualBrush
-覆盖的
矩形
对象似乎有问题

我的问题:在
RenderTargetBitmap
使用
VisualBrush
对象后,我可以在该代码中添加/更改哪些内容以使其正确渲染?
RenderTargetBitmap
做了什么奇怪的事情使得
VisualBrush
不可见

如果没有足够的代码,我无法重现这个问题

在我的xaml文件中,我有:

<Window x:Class="ElementRender.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Height="350" Width="525">
  <Grid>
    <Grid Name="_contentContainer">
      <Rectangle Fill="White"/>
      <Grid Name="_content">
        <Grid Name="_back"/>
        <Grid Name="_body"/>
      </Grid>
    </Grid>
    <StackPanel VerticalAlignment="Bottom" Orientation="Horizontal">
      <Button Content="New" Name="New"/>
      <Button Content="Move" Name="Move"/>
      <Button Content="Update" Name="Update"/>
    </StackPanel>
  </Grid>
</Window>
关于代码的一些帮助说明:

  • xaml的
    \u contentContainer
    硬拷贝()
    一起工作,将当前图像复制到图像缓存中,
    \u back
  • SoftCopy
    返回一个框架元素,该元素与中的过去元素完全相同,但没有任何变换、效果或视觉父元素。这是非常重要的
  • BuildImage
    模拟在初始图像经过某种方式的转换后,构建一个新图像以粘贴到缓存上
如果您构建并运行应用程序,从
\u body.Children.Add(SoftCopy(Control))中删除
SoftCopy()
,您可以看到我想要得到的效果:新元素粘贴在旧元素的上方,而旧元素似乎保留了它的转换

或者,如果剪切线
var rtb=new RenderTargetBitmap(宽度、高度、96、96、PixelFormats.Pbgra32)
硬拷贝
,缓存功能已中断,但软拷贝显示正确


但是,如果您按原样运行应用程序,您会注意到新的Blue矩形(通过VisualBrush渲染)根本不会显示,直到您再次点击“新建”按钮,将图像推到缓存中,仍然不会显示新创建的图像。

我不太理解这篇文章,但有几件重要的事情:

若将RenderTransform/Margins应用于元素并对其拍照(RenderTargetBItmap),那个么您就要倒霉了。它将被抵消,你将得到唯一的子图片


我们的想法是在不使用任何rendertransforms的情况下拍摄照片,然后将RenderTransform复制到旧照片上。如果需要的话

我不太理解这篇文章,但有几点很重要:

若将RenderTransform/Margins应用于元素并对其拍照(RenderTargetBItmap),那个么您就要倒霉了。它将被抵消,你将得到唯一的子图片


我们的想法是在不使用任何rendertransforms的情况下拍摄照片,然后将RenderTransform复制到旧照片上。如果需要的话

我会夸大其词地称之为WPF中的bug。我最终发现了如何解决我所遇到的奇怪行为:

var visual = visualBrush.Visual;
visualBrush.Visual = null;
visualBrush.Visual = visual;

这本质上应该是一个空操作:到最后,视觉画笔的视觉效果与启动时相同。但是,在将
VisualBrush
渲染到
RenderTargetBitmap
中之后添加此代码段修复了我遇到的问题。

我会夸大其词地将其称为WPF中的错误。我最终发现了如何解决我所遇到的奇怪行为:

var visual = visualBrush.Visual;
visualBrush.Visual = null;
visualBrush.Visual = visual;

这本质上应该是一个空操作:到最后,视觉画笔的视觉效果与启动时相同。但是,在将
VisualBrush
渲染到
RenderTargetBitmap
后添加此代码段修复了我遇到的问题。

我知道这是一篇旧文章,但您能解释一下RenderTransform/Margins是什么意思吗?我也得到了偏移量问题(在左边)。这个WPF错误在哪里被记录了吗?我知道这是一篇老文章,但是你能解释一下你所说的RenderTransform/Margins是什么意思吗?我也得到了偏移量问题(在左边)。是否在任何地方记录了此WPF错误?问题已在此处完全解决:问题已在此处完全解决: