C# 渲染目标位图问题

C# 渲染目标位图问题,c#,wpf,C#,Wpf,我正在尝试将usercontrol的图像添加到viewbox。 我正在动态创建usercontrol。我正在使用下面的代码 private static RenderTargetBitmap CaptureScreen(Visual target, double dpiX, double dpiY) { if (target == null) { return null; } Rect bounds = VisualTreeHelper.GetDe

我正在尝试将usercontrol的图像添加到viewbox。 我正在动态创建usercontrol。我正在使用下面的代码

private static RenderTargetBitmap CaptureScreen(Visual target, double dpiX, double dpiY)
{
    if (target == null)
    {
        return null;
    }
    Rect bounds = VisualTreeHelper.GetDescendantBounds(target);
    //RenderTargetBitmap rtb = new RenderTargetBitmap((int)(bounds.Width * dpiX / 96.0),
    //                                                (int)(bounds.Height * dpiY / 96.0),
    //                                                dpiX,
    //                                                dpiY,
    //                                                PixelFormats.Pbgra32);
    RenderTargetBitmap rtb = new RenderTargetBitmap(596,596,dpiX,
                                                    dpiY,
                                                    PixelFormats.Pbgra32);
    DrawingVisual dv = new DrawingVisual();
    using (DrawingContext ctx = dv.RenderOpen())
    {
        VisualBrush vb = new VisualBrush(target);
        ctx.DrawRectangle(vb, null, new Rect(new Point(), bounds.Size));
    }
    rtb.Render(dv);
    return rtb;
}
我正在动态创建用户控件,并将其传递给capture screen方法

UserControls.UserControl1 uc1 = new UserControls.UserControl1();
                        visualList.Add(uc1);
 for(int i = 0;i<=6;i++)
        {
            Image img = new Image();
            img.Source = CaptureScreen(visualList[i], 96, 96);
            img.Margin = new Thickness { Top = 2 };                   
            usingWorkaround.Children.Add(img);
        }
UserControls.UserControl1 uc1=新的UserControls.UserControl1();
视觉列表添加(uc1);

对于(int i=0;i在尝试创建图像时,控件在视觉树中尚不存在,并且尚未计算大小


您需要首先在视觉上调用测量排列

在尝试创建图像时,视觉树中尚未存在控件,并且尚未计算大小


您需要首先在视觉上调用测量排列

您可以调用测量和排列,如下所示

  private void ForceUpdate(FrameworkElement element, double width, double height)
  {
     Size size = new Size(width, height);

     element.Measure(size);

     element.Arrange(new Rect(0, 0, width, height));

     element.UpdateLayout();
  }

您可以按如下方式调用度量和安排

  private void ForceUpdate(FrameworkElement element, double width, double height)
  {
     Size size = new Size(width, height);

     element.Measure(size);

     element.Arrange(new Rect(0, 0, width, height));

     element.UpdateLayout();
  }

请解释如何使用Measure和arrange请解释如何使用Measure和arrange我对上述说法有疑问,当我们调用Force Update方法时,我们是否需要显式调用element.Measure和element.arrange?。根据我对element.UpdateLayout()的理解我怀疑上面的说法,当我们调用Force Update method时,我们是否需要显式调用element.Measure和element.Arrage?根据我对element的理解,UpdateLayout()将自己调用核心方法