Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用Winform和WPF元素从面板创建BitmapSource_C#_Wpf_Winforms - Fatal编程技术网

C# 使用Winform和WPF元素从面板创建BitmapSource

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

我有一个WPF面板(在WPF应用程序中),其中包含Winform和WPF元素的集合。Winform元素通过
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窗体托管控件,这是我发现的唯一一个没有留下黑色或白色矩形的控件。遗憾的是,输出质量很差,但乞丐不能选择。)