首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WPF以编程方式实例化用户控件,将其呈现为PNG。

WPF以编程方式实例化用户控件,将其呈现为PNG。
EN

Stack Overflow用户
提问于 2009-09-22 17:15:16
回答 1查看 4.5K关注 0票数 5

我希望在DLL中以编程方式实例化用户控件,然后将其保存为PNG文件。对于PngBitmapEncoder和RenderTargetBitmap来说,这通常没有问题。

以下是我的问题:

  • 如何实例化控件?简单地使用new-operator?
  • Do,我必须在单独的线程中实例化它?
  • 如何强制控件更新其所有子控件并重新呈现自己?

这是我的代码,用于实例化用户控件并将其保存为PNG-file (LetterFrequency是用户控件):

代码语言:javascript
复制
    [STAThread]
    static void Main(string[] args)
    {
        LetterFrequency let = new LetterFrequency();
        let.Width = 600;
        let.Height = 400;
        let.Background = Brushes.White;

        let.Measure(new Size(let.Width, let.Height));
        let.Arrange(new Rect(new Size(let.Width, let.Height)));

        let.UpdateLayout();

        RenderTargetBitmap bitmap = new RenderTargetBitmap((int)let.Width, (int)let.Height, 96d, 96d, PixelFormats.Pbgra32);
        bitmap.Render(let);

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

        using (Stream stm = File.Create("test.png"))
        {
            png.Save(stm);
        }
    }

如果您以这种方式运行该应用程序,它将生成PNG文件,但是将添加到XAML中的数据是不可见的,如果您查看XAML设计器,您可以看到带有一些气泡的图表。png文件只包含图表区域,但不包含气泡?为什么要这样?我认为这是一个更新/呈现问题,但是如何解决这个问题呢?

这里是visual解决方案,它包含Console Project,它将用户控件呈现给一个PNG文件,以及WPF工具包的另外两个项目。

看看它,它将分别在exe-文件夹:http://www.file-upload.net/download-1904406/ChartRenderBitmap.zip.html中的bin/Debug中生成PNG文件。

希望它没有问题!

谢谢!

EN

回答 1

Stack Overflow用户

发布于 2009-09-23 21:56:16

图表中的数据不会在PNG文件中呈现,因为有一个动画应用于数据点的显示。看看窗口中的LetterFrequency控件,就会看到这些点逐渐显露出来。

您的代码在控件创建后立即对其进行快照,因此您不会看到任何数据。

你可以:

  1. 将所有这些都包装在一个窗口中,并告诉它在X秒之后
  2. 禁用所有控件中的所有动画--快照
  3. --也许有一种方法可以以编程方式“快速转发”动画,但我找不到一个

下面是解决方案1,它可以工作:

代码语言:javascript
复制
    public partial class Window1 : Window
{
    System.Windows.Threading.DispatcherTimer snapshotTimer;

    public Window1()
    {
        InitializeComponent();

        this.Width = 600;
        this.Height = 400;
        let.Width = 600;
        let.Height = 400;
        let.Background = Brushes.White;     

        this.Loaded += new RoutedEventHandler(Window1_Loaded);
    }

    void Window1_Loaded(object sender, RoutedEventArgs e)
    {
        this.snapshotTimer = new System.Windows.Threading.DispatcherTimer();
        this.snapshotTimer.Interval = TimeSpan.FromSeconds(2);
        this.snapshotTimer.Tick += new EventHandler(snapshotTimer_Tick);
        this.snapshotTimer.IsEnabled = true;
    }

    void snapshotTimer_Tick(object sender, EventArgs e)
    {
        this.snapshotTimer.IsEnabled = false;
        WritePng();
    }

    void WritePng()
    {
        RenderTargetBitmap bitmap = new RenderTargetBitmap((int)let.Width, (int)let.Height, 96d, 96d, PixelFormats.Pbgra32);
        bitmap.Render(let);

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

        using (Stream stm = File.Create("test.png"))
        {
            png.Save(stm);
        }

        this.Close();
    }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1461382

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档