将(带有数据的网格控件)放在原始图像上,并将整个内容输出为SIlverlight中的图像:

时间:2010-06-18 07:01:13

标签: c# silverlight

我有一个图像,我想在该图像上渲染控件(datgrid或其内容的任何ui元素),并将整个事物输出为图像。 请帮助。

我发现了一些类似的链接,只是看看他的回答但没有帮助.. Silverlight: Create image from silverlight controls

提前致谢。 :)

1 个答案:

答案 0 :(得分:1)

我使用以下方法在某处创建了一个来自frameworkelement的图像(基本上是网格,画布,按钮,文本框......)

它接受控件范围内的任何内容并将其作为ImageSource类型返回,从那里我认为将其保存到文件或将其输出到屏幕的道路是一小步。

请注意:我删除了一些应该解决边距问题的代码,因此请务必考虑到这一点,或者不要为要转换为图像的控件设置边距。

你现在基本上想要做的是使用GridCombiner并将其提供给下面的方法,因此它将通过ImageBackground上的DataGridMyData创建一个图像作为ImageSource。

希望这就是您所寻找的,如果没有,请告诉我。

public ImageSource ToImageSource(FrameworkElement obj) // FOR WPF
    {
        // Save current canvas transform
        Transform transform = obj.LayoutTransform;
        obj.LayoutTransform = null;

        // Get the size of canvas
        Size size = new Size(obj.Width, obj.Height);

        // force control to Update
        obj.Measure(size);
        obj.Arrange(new Rect(size));

        RenderTargetBitmap bmp = new RenderTargetBitmap(
            (int)obj.Width, (int)obj.Height, 96, 96, PixelFormats.Pbgra32);

        bmp.Render(obj);

        // return values as they were before
        obj.LayoutTransform = transform;
        return bmp;
    }


public ImageSource ToImageSource(FrameworkElement obj) // FOR SILVERLIGHT
    {
        // Save current canvas transform
        Transform transform = obj.RenderTransform;
        obj.RenderTransform = null;

        // Get the size of canvas
        Size size = new Size(obj.Width, obj.Height);

        // force control to Update
        obj.Measure(size);
        obj.Arrange(new Rect(new Point(), size));

        WriteableBitmap bmp = new WriteableBitmap(obj, transform);

        bmp.Render(obj, transform);

        // return values as they were before
        obj.RenderTransform = transform;
        return bmp;
    }

你的xaml就像是:

<Grid x:Name="GridCombiner" Width="300" Height="150">
<Image x:Name="ImageBackground" Source="c:/myimg.jpg" Width="300" Height="150" />
<DataGrid x:Name="DataGridMyData" ItemsSource="{Binding}" Width="300" Height="150" />
</Grid>