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

时间:2016-11-07 16:55:43

标签: c# wpf winforms

我有一个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内容。我该如何加入?

下图显示左侧的Tabpanel和右侧的BitmapSource。注意Winform Rectangle的内容是如何为空。 Tabpanel on the left and BitmapSource on the right.

1 个答案:

答案 0 :(得分:1)

如何拍摄完整的屏幕截图,然后将其剪切为元素?

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;
        }
    }
}