【问题标题】:Save WF 4 workflow as Image将 WF 4 工作流程另存为图像
【发布时间】:2014-10-15 12:58:42
【问题描述】:

问题是我正在从一个 shell 应用程序动态打开工作流设计器,并且我没有对 Canvas 的引用。我可以将 WF4 保存为图像,但图像未正确保存并且包含左和上边距。我关注了许多文章以使其正常工作,但没有成功。我也参考了下面的文章。

Saving a canvas to 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);       
  }

请帮忙。

【问题讨论】:

    标签: image save rendertargetbitmap


    【解决方案1】:

    我可以通过再次参考以下链接来解决问题

    Saving a canvas to png C# wpf

    我通过使用以下代码获得了对画布的引用

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

    这解决了边框/边距问题。

    【讨论】:

      【解决方案2】:

      请看这里: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();
          }
      }
      

      最后,让我们尝试在 OnInitialized() 方法中调用上述 2 个方法,将其挂起,然后关闭应用程序。

      protected override void OnInitialized(EventArgs e)
      {
          // ...
          this.SaveImageToFile("test.jpg", this.CreateWorkflowDefinitionImage());
          Application.Current.Shutdown();
      }
      

      【讨论】:

      • 感谢您的意见。我的要求是我能够将工作流保存为图像,但图像包含左边框和上边框。请告诉我如何保存带有这些边框的图像。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多