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