C# 使用Winform和WPF元素从面板创建BitmapSource
我有一个WPF面板(在WPF应用程序中),其中包含Winform和WPF元素的集合。Winform元素通过C# 使用Winform和WPF元素从面板创建BitmapSource,c#,wpf,winforms,C#,Wpf,Winforms,我有一个WPF面板(在WPF应用程序中),其中包含Winform和WPF元素的集合。Winform元素通过WindowsFormsHost托管 我需要创建整个面板的BitmapSource(完全按照原样),以便可以对其进行操作/保存/打印 创建WPF元素的BitmapSource不是问题,但是Winform元素不会被渲染(它们应该在的地方只有一个空白) 其中一个例子是: void GetBitmapSource(FrameworkElement element) { var matrix
WindowsFormsHost
托管
我需要创建整个面板的BitmapSource(完全按照原样),以便可以对其进行操作/保存/打印
创建WPF元素的BitmapSource不是问题,但是Winform元素不会被渲染(它们应该在的地方只有一个空白)
其中一个例子是:
void GetBitmapSource(FrameworkElement element)
{
var matrix = PresentationSource.FromVisual(element).CompositionTarget.TransformToDevice;
double dpiX = 96.0 * matrix.M11;
double dpiY = 96.0 * matrix.M22;
var bitmapSource = new RenderTargetBitmap((int)element.ActualWidth + 1, (int)element.ActualHeight + 1, dpiX, dpiY, PixelFormats.Pbgra32);
bitmapSource.Render(element);
return bitmapSource;
}
这将很好地打印WPF元素,但忽略Winform内容。我如何包括这些
下图显示了左侧的选项卡面板和右侧的BitmapSource。请注意Winform矩形的内容是如何为空的。
拍摄一个完整的屏幕截图,然后将其剪切成元素,怎么样
BitmapSource ScreenShot(int x, int y, int width, int height)
{
using (var screenBitmap = new Bitmap(width,height,System.Drawing.Imaging.PixelFormat.Format32bppArgb))
{
using (var g = Graphics.FromImage(screenBitmap))
{
g.CopyFromScreen(x, y, 0, 0, screenBitmap.Size);
var result = Imaging.CreateBitmapSourceFromHBitmap(
screenBitmap.GetHbitmap(),
IntPtr.Zero,
Int32Rect.Empty,
BitmapSizeOptions.FromEmptyOptions());
return result;
}
}
}
也许有帮助:我在托马斯·列夫斯克的回答中找到了一个解决方案。这太脏了,应该放在顶部有一个大“NSFW”警告的扰流盒中。。。但它是有效的!(我必须打印一个模板WPF控件,该控件在其可视化树中的某个位置有一个Windows窗体托管控件,这是我发现的唯一一个没有留下黑色或白色矩形的控件。遗憾的是,输出质量很差,但乞丐不能选择。)