Сохранить рабочий процесс 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);       
  }

Пожалуйста, помогите в этом.


person Parveen Kumar    schedule 18.09.2014    source источник


Ответы (2)


Я могу решить проблему, снова обратившись к следующей ссылке

Сохранение холста в png C# wpf

Я получил ссылку на холст, используя следующий код

Visual canvas= ((DesignerView)VisualTreeHelper.GetChild(this.WorkflowDesigner1.View, 0)).RootDesigner;

Это решило проблему границы/маржи.

person Parveen Kumar    schedule 15.10.2014

Пожалуйста, посмотрите здесь: http://blogs.msdn.com/b/flow/archive/2011/08/16/how-to-save-wf4-workflow-definition-to-image-using-code.aspx

давайте посмотрим, как сгенерировать образ определения рабочего процесса, используя стандартный механизм WPF. В конце концов, холст конструктора рабочих процессов — это элемент управления 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# очень прост. Просто получите часть диаграммы рабочего процесса в дизайнере рабочего процесса и создайте ее образ в памяти, используя некоторый WPF API. Дальше все просто: создайте файл и сохраните изображение.

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();
}
person Bill Daugherty    schedule 06.10.2014
comment
Спасибо за информацию. Мое требование состоит в том, что я могу сохранить рабочий процесс как изображение, но изображение содержит левую и верхнюю границы. Пожалуйста, дайте мне знать, как сохранить изображение с этими границами. - person Parveen Kumar; 14.10.2014