Сохранить рабочий процесс WF 4 как изображение
Проблема в том, что я открываю конструктор рабочих процессов динамически из одного приложения оболочки, и у меня нет ссылки на Canvas. Я могу сохранить WF4 как изображение, но изображение не сохраняется должным образом и содержит левый и верхний поля. Я следовал за многими статьями, чтобы заставить это работать, но безуспешно. Я также сослался на следующую статью.
Сохранение холста в png C# wpf
Я использую функцию ниже. Я не имею никакого отношения к холсту.
private BitmapFrame CreateWorkflowImage()
{
const double DPI = 96.0;
Visual areaToSave = ((DesignerView)VisualTreeHelper.GetChild(this.wd.View,
0)).RootDesigner;
Rect bounds = VisualTreeHelper.GetDescendantBounds(areaToSave);
RenderTargetBitmap bitmap = new RenderTargetBitmap((int)bounds.Width,
(int)bounds.Height, DPI, DPI, PixelFormats.Default);
bitmap.Render(areaToSave);
return BitmapFrame.Create(bitmap);
}
Пожалуйста, помогите в этом.
2 ответа
Я могу решить эту проблему, снова сославшись на следующую ссылку
Сохранение холста в png C# wpf
Я получил ссылку на холст, используя следующий код
Visual canvas= ((DesignerView)VisualTreeHelper.GetChild(this.WorkflowDesigner1.View, 0)).RootDesigner;
Это решило проблему границы / маржи.
Пожалуйста, посмотрите здесь: http://blogs.msdn.com/b/flow/archive/2011/08/16/how-to-save-wf4-workflow-definition-to-image-using-code.aspx
давайте посмотрим, как сгенерировать образ определения рабочего процесса, используя стандартный механизм WPF. В конце концов, рабочий стол конструктора canvas - это элемент управления WPF.
BitmapFrame CreateWorkflowDefinitionImage()
{
const double DPI = 96.0;
// this is the designer area we want to save
Visual areaToSave = ((DesignerView)VisualTreeHelper.GetChild(
this.workflowDesigner.View, 0)).RootDesigner;
// get the size of the targeting area
Rect size = VisualTreeHelper.GetDescendantBounds(areaToSave);
RenderTargetBitmap bitmap = new RenderTargetBitmap((int)size.Width, (int)size.Height,
DPI, DPI, PixelFormats.Pbgra32);
bitmap.Render(areaToSave);
return BitmapFrame.Create(bitmap);
}
Вышеупомянутый метод C# очень прост. Просто возьмите часть диаграммы рабочего процесса в конструкторе рабочих процессов и создайте ее образ в памяти с помощью некоторого API WPF. Следующая вещь проста: создать файл и сохранить изображение.
void SaveImageToFile(string fileName, BitmapFrame image)
{
using (FileStream fs = new FileStream(fileName, FileMode.Create))
{
BitmapEncoder encoder = new JpegBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create(image));
encoder.Save(fs);
fs.Close();
}
}
Наконец, давайте попробуем вызвать вышеупомянутые 2 метода в методе OnInitialized(), чтобы подключить его и затем закрыть приложение.
protected override void OnInitialized(EventArgs e)
{
// ...
this.SaveImageToFile("test.jpg", this.CreateWorkflowDefinitionImage());
Application.Current.Shutdown();
}