我希望在DLL中以编程方式实例化用户控件,然后将其保存为PNG文件。对于PngBitmapEncoder和RenderTargetBitmap来说,这通常没有问题。
以下是我的问题:
这是我的代码,用于实例化用户控件并将其保存为PNG-file (LetterFrequency是用户控件):
[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文件。
希望它没有问题!
谢谢!
发布于 2009-09-23 21:56:16
图表中的数据不会在PNG文件中呈现,因为有一个动画应用于数据点的显示。看看窗口中的LetterFrequency控件,就会看到这些点逐渐显露出来。
您的代码在控件创建后立即对其进行快照,因此您不会看到任何数据。
你可以:
下面是解决方案1,它可以工作:
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();
}
}https://stackoverflow.com/questions/1461382
复制相似问题