将XAML窗口转换为位图

时间:2019-01-10 09:13:25

标签: c# xaml bitmap

我有一个像这样的简单XAML:

<UserControl x:Class="blabla.MyView"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         mc:Ignorable="d" 
         Name="myUserControl">
 <Grid Name="myGrid" Background="White">
    <TextBlock Name="myTextBlock"/>
 </Grid>
</UserControl>

现在,我想使用此xaml在后台创建一个新视图。之后,我想更改控件(或自己添加一些控件),将其保存到位图,然后将其分配给剪贴板(仅查看输出)。我会这样尝试的:

MyView view = new MyView();
view.myTextBlock.Text = "TEST";

Rect bounds = VisualTreeHelper.GetDescendantBounds(view);
DrawingVisual dv = new DrawingVisual();
using (DrawingContext ctx = dv.RenderOpen())
{
    VisualBrush vb = new VisualBrush(view);
    ctx.DrawRectangle(vb, null, new Rect(new System.Windows.Point(), bounds.Size));
}
RenderTargetBitmap bmp = new RenderTargetBitmap((int)view.ActualWidth, (int)view.ActualHeight, 96, 96, PixelFormats.Pbgra32);

bmp.Render(dv);

PngBitmapEncoder pngImage = new PngBitmapEncoder();
pngImage.Frames.Add(BitmapFrame.Create(bmp));
System.Windows.Clipboard.SetImage(pngImage.Frames[0]);

很遗憾,view的大小未更改。尝试通过设置硬编码的宽度/高度来生成黑色图像/位图。

如何从XAML创建简单的位图?

1 个答案:

答案 0 :(得分:1)

对官方回答发表评论。但是,我看到这种解决方案不是最优雅的解决方案。一般的事情是,窗户,分别。视图,则渲染时会产生黑色区域,而无论如何也无法显示/本身变黑。

工作环境将是显示此视图(如您所写,但在Window中)。 做这个小主意,请将窗口移出可见屏幕,以避免闪烁。 例如:

        var v = new MainWindow();
        v.Top = -10000; // far away
        v.Left = -10000; // far away
        v.Show();
        // .. do rendering
        v.Close();