Я хочу программно создать пользовательский элемент управления в DLL, чтобы впоследствии сохранить его как файл PNG. Обычно это не проблема с PngBitmapEncoder и RenderTargetBitmap.
Это мои вопросы:
- Как создать экземпляр элемента управления? Просто с new-оператором?
- Должен ли я создавать его в отдельном потоке?
- Как заставить элемент управления обновить всех своих дочерних элементов и снова отобразить себя?
Это мой код для создания экземпляра пользовательского элемента управления и сохранения его как PNG-файла (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 Studio, оно содержит проект консоли, который отображает пользовательский элемент управления в файл PNG и два других проекта набора инструментов WPF для диаграммы.
Посмотрите на него, он сгенерирует файл PNG в bin / Debug соответственно в exe-папке: http://www.file-upload.net/download-1904406/ChartRenderBitmap.zip.html
Надеюсь, все заработает без проблем!
Спасибо!