与它的DataContext保存FrameworkElement的图像文件并没有成功(Saving

2019-08-04 20:17发布

我有一个叫做简单的UserControl1用户控件包含一个TextBlock:

  <UserControl x:Class="WpfApplication2.UserControl1"
         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" 
         d:DesignHeight="300" d:DesignWidth="300">
     <Grid>
         <TextBlock Text="{Binding}"/>
     </Grid>
</UserControl>

我初始化它的一个新的实例,并把它在代码中的DataContext。 当窗口被关闭我不得不得出这样的控制图像文件。 该用户控件不渲染创建的文件中的文本约束。

这是一个使用用户控件我的代码:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();

        Closing += MainWindow_Closing;
    }

    void MainWindow_Closing(object sender, CancelEventArgs e)
    {
        UserControl1 uc = new UserControl1();
        uc.DataContext = "hello";
        uc.Height = 100;
        uc.Width = 100;
        uc.Background = Brushes.LightBlue;
        DrawToImage(uc);
    }

    private void DrawToImage(FrameworkElement element)
    {
        element.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity));
        element.Arrange(new Rect(element.DesiredSize));

        RenderTargetBitmap bitmap = new RenderTargetBitmap((int)element.Width, (int)element.Height,
                                                           120.0, 120.0, PixelFormats.Pbgra32);
        bitmap.Render(element);

        BitmapEncoder encoder = new PngBitmapEncoder();
        encoder.Frames.Add(BitmapFrame.Create(bitmap));

        using (Stream s = File.OpenWrite(@"C:\555.png"))
        {
            encoder.Save(s);
        }
    }
}

我希望这是很清楚,任何帮助将是非常赞赏。

Answer 1:

你只是忘了后手动测量/ Arrangeing它(这是不够给力的结合解决),迫使你的控制布局更新。

以一个简单的调用UpdateLayout请使得它的工作:

private void DrawToImage(FrameworkElement element)
{
    element.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity));
    element.Arrange(new Rect(element.DesiredSize));
    element.UpdateLayout();

    RenderTargetBitmap bitmap = new RenderTargetBitmap((int)element.Width, (int)element.Height,
                                                        120.0, 120.0, PixelFormats.Pbgra32);
    bitmap.Render(element);

    BitmapEncoder encoder = new PngBitmapEncoder();
    encoder.Frames.Add(BitmapFrame.Create(bitmap));

    using (Stream s = File.OpenWrite(@"C:\555.png"))
    {
        encoder.Save(s);
    }
}

编辑:更多的时候绑定解决: 链接



Answer 2:

尝试调用函数SaveImage()上userControl1.Loaded事件



Answer 3:

如果我这样做,它的工作原理,不知道这是你想要什么,虽然:

<Window x:Class="DrawImage.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:DrawImage="clr-namespace:DrawImage"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <DrawImage:UserControl1 x:Name="uc" Visibility="Hidden"/>
    </Grid>
</Window>

void MainWindow_Closing(object sender, CancelEventArgs e)
{
    uc.DataContext = "hello";
    uc.Height = 100;
    uc.Width = 100;
    uc.Background = Brushes.LightBlue;
    uc.Visibility = Visibility.Visible;
    DrawToImage(uc);
}


Answer 4:

编辑

我现在能够重现该问题。 如果我在窗口contstructor设置DataContext的,然后它工作。 如果我将它设置在Winndow_Closed事件中,我得到你得到完全相同的结果。

我想有可能因为WPF没有解决方法需要一些时间来实际呈现在UI线程上的文字。 如果您呈现PNG的WPF已使之前对UI文本线程它不会出现在PNG。 一种解决方法似乎并不存在,因为该窗口时被破坏Closed的事件处理程序已经运行。 有没有办法阻止,一方面UI线程从beeing detroyed当你在另一方面希望UI线程渲染控制prvevent到窗口。

我建议尽快控制已经呈现呈现图像并保存图像文件时关闭该窗口。



Answer 5:

我贴在我的博客某条(该帐户将巴布亚新几内亚Transparancy(使黑色背景)): 保存FrameworkElement的图片排列

FrameworkElement element = myControl.Content;
// you can set the size as you need.
Size theTargetSize = new Size(1500,2000)
element.Measure(new System.Windows.Size(double.PositiveInfinity, double.PositiveInfinity));
element.Arrange(new Rect(theTargetSize ));
// to affect the changes in the UI, you must call this method at the end to apply the new changes
element.UpdateLayout();

你可以找到在博文中充分鳕鱼。



文章来源: Saving FrameworkElement with its DataContext to image file does no succeed