C# 重新定位画布控件

C# 重新定位画布控件,c#,wpf,xaml,C#,Wpf,Xaml,我有三列网格,布局如下 单选按钮|画布控件|单选按钮 对于我的应用程序的某些功能,我需要截取画布功能当前视图的屏幕快照并保存到文件中 我使用以下方法将画布保存到bmp,在bmp中测量和排列画布。我的问题是,在保存图像后,原始网格中的画布位置向左移动,如何将画布重新定位到网格中,与之前一样 private void SaveCanvasContentToImage(string path, Canvas canvasControl) { if (path == null

我有三列网格,布局如下

单选按钮|画布控件|单选按钮

对于我的应用程序的某些功能,我需要截取画布功能当前视图的屏幕快照并保存到文件中

我使用以下方法将画布保存到bmp,在bmp中测量和排列画布。我的问题是,在保存图像后,原始网格中的画布位置向左移动,如何将画布重新定位到网格中,与之前一样

 private void SaveCanvasContentToImage(string path, Canvas canvasControl)
    {
        if (path == null && canvasControl != null) return;

        // Save current canvas transform
        Transform transform = canvasControl.LayoutTransform;
        // reset current transform (in case it is scaled or rotated)
        canvasControl.LayoutTransform = null;

        // Get the size of canvas
        Size size = new Size(canvasControl.Width, canvasControl.Height);
        // Measure and arrange the canvas

        canvasControl.Measure(size);
        canvasControl.Arrange(new Rect(size));

        // Create a render bitmap and push the canvas to it
        RenderTargetBitmap renderBitmap =
          new RenderTargetBitmap(
            (int)size.Width,
            (int)size.Height,
            96d,
            96d,
            PixelFormats.Pbgra32);


        renderBitmap.Render(canvasControl);


        // Create a file stream for saving image
        using (FileStream outStream = new FileStream(path, FileMode.CreateNew,FileAccess.ReadWrite))
        {
            // Use bitmap encoder for our data
            BitmapEncoder encoder = new BmpBitmapEncoder();

            // push the rendered bitmap to it
            encoder.Frames.Add(BitmapFrame.Create(renderBitmap));
            // save the data to the stream
            encoder.Save(outStream);

            outStream.Close();
            outStream.Dispose();

        }

        // Restore previously saved layout
        canvasControl.LayoutTransform = transform;
    }

您可以通过使用中间
DrawingVisual
,避免布局问题:

var renderTargetBitmap = new RenderTargetBitmap(
    (int)canvasControl.ActualWidth, (int)canvasControl.ActualHeight,
    96, 96, PixelFormats.Default);

var visual = new DrawingVisual();

using (var dc = visual.RenderOpen())
{
    dc.DrawRectangle(
        new VisualBrush(canvasControl),
        null,
        new Rect(0, 0, canvasControl.ActualWidth, canvasControl.ActualHeight));
}

renderTargetBitmap.Render(visual);

您是否在没有度量和安排的情况下尝试了代码?这似乎是多余的。@Clemens,如果我试图不加测量地保存图像,并将保存的图像从右侧裁剪。