将WPF控件打印到Image控件

时间:2012-07-17 18:17:14

标签: c# wpf image pixelsense scatterview

我正在编写需要在表格中显示数据的表面应用程序(即DataGrid)。这很好,除了表捕获ScatterViewItem控件的触摸交互(基本上是一个可以被用户旋转,收缩和移动的面板)。这可以防止用户轻松操作ScatterViewItem。

为了解决这个问题,我认为将控件绘制到图像并将其放入是很容易的。看来我错了。以下是我的所有尝试:

http://pastie.org/private/gfkkv9f6apgrqi1ucspwpa(无需阅读此内容,除非您认为它有用。这就是为什么它在牧场而不是在这里)

我将DataGrid放在另一个Grid中,否则它将无法正确测量:

Grid g = new Grid();
g.Children.Add(dataTable);

SurfaceScrollViewer viewer = new SurfaceScrollViewer();
viewer.Content = Utility.SaveWPFControlAsImage(g);

如果我们将最后一行改为

viewer.Content = g;

我们得到了一张好桌子:

enter image description here

如果我们不这样做,我们得到:

enter image description here

SaveWPFControlAsImage如下:

    public static System.Windows.Controls.Image SaveWPFControlAsImage(FrameworkElement e)
    {
        e.Measure(new System.Windows.Size(double.PositiveInfinity, double.PositiveInfinity));

        RenderTargetBitmap targetBitmap =
            new RenderTargetBitmap((int)e.DesiredSize.Width,
                                   (int)e.DesiredSize.Height,
                                   96d, 96d,
                                   PixelFormats.Default);
        targetBitmap.Render(e);

        BmpBitmapEncoder encoder = new BmpBitmapEncoder();
        encoder.Frames.Add(BitmapFrame.Create(targetBitmap));

        MemoryStream stream = new MemoryStream();
        encoder.Save(stream);
        BitmapImage bmp = new BitmapImage();
        bmp.BeginInit();
        bmp.StreamSource = new MemoryStream(stream.ToArray());
        bmp.EndInit();

        return new System.Windows.Controls.Image()
        {
            Source = bmp,
        };
    }

所以也许我只是没有把它渲染得正确,或者,也许,我只是以错误的角度来看待这个......

1 个答案:

答案 0 :(得分:1)

在WPF中,您有一个VisualBrush,可以捕获给定控件的实时预览。此外,如果您不想要任何给定控件的输入,您可以随时设置IsHitTestVisible="False"