首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将WF 4工作流保存为映像

将WF 4工作流保存为映像
EN

Stack Overflow用户
提问于 2014-09-18 10:49:47
回答 2查看 220关注 0票数 1

问题是,我正在动态地从一个shell应用程序中打开工作流设计器,并且我没有对画布的引用。我可以将WF4保存为图像,但是图像没有被正确保存,并且包含左边和顶部的边距。我跟踪了许多文章,以使它发挥作用,但没有成功。我还提到了下面的文章。

Saving a canvas to png C# wpf

我正在使用以下功能。我没有任何关于画布的参考资料。

代码语言:javascript
复制
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);       
  }

请帮我一下。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-10-15 04:58:42

我能够通过再次引用以下链接来解决这个问题

Saving a canvas to png C# wpf

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

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

这解决了边界/保证金问题。

票数 1
EN

Stack Overflow用户

发布于 2014-10-06 21:02:10

请看这里:http://blogs.msdn.com/b/flow/archive/2011/08/16/how-to-save-wf4-workflow-definition-to-image-using-code.aspx

让我们看看如何使用WPF的标准机制生成工作流定义的映像。毕竟,工作流设计器画布是一个WPF控件。

代码语言:javascript
复制
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创建其内存中的映像。接下来的事情很简单:创建一个文件并保存图像。

代码语言:javascript
复制
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()方法中的上述两个方法来连接它,然后关闭应用程序。

代码语言:javascript
复制
protected override void OnInitialized(EventArgs e)
{
    // ...
    this.SaveImageToFile("test.jpg", this.CreateWorkflowDefinitionImage());
    Application.Current.Shutdown();
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25910636

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档