Rehosted Workflow Designer默认导入的命名空间

时间:2011-05-23 13:45:28

标签: workflow-foundation workflow-foundation-4 rehosting workflow-rehosting

我正在尝试重新托管WF4工作流设计器。在“导入”选项卡中,我希望默认导入一些名称空间。它看起来像这样:

Imported namespaces http://imageshack.us/m/850/5383/imports.png

经过大量研究,我发现如果你看看

workflowDesigner.Context.Items.GetValue<ImportedNamespaceContextItem>().ImportedNamespaces

你会看到已经导入的东西。但是,手动将命名空间添加到此集合似乎没有任何效果。因此,我的问题是:如何以正确的方式将导入的命名空间添加到此列表中?或者,如何使用我手动添加的命名空间导入来刷新上下文?


以下解决方案的其他信息

为了解决这个问题,我创建了我想要的“清理平板”活动XAML文件,将其添加到我的项目中,将 Build Action 设置为 Embedded Resource 及其自定义工具以清空字符串。

然后,在初始化WorkflowDesigner的代码中,我执行以下操作:

_Wd = new WorkflowDesigner();

_Wd.Load(
    XamlServices.Load(
        ActivityXamlServices.CreateBuilderReader(
            new XamlXmlReader(
                Assembly.GetEntryAssembly().GetManifestResourceStream( "WpfApplication1.New.xaml" )
            )
        )
    ) as ActivityBuilder
);

现在我的工作流已经导入了所有理想的命名空间。

2 个答案:

答案 0 :(得分:2)

我这样做的方法是不是从一个完全空的工作流开始,而是创建一个带有所需导入的空模板。添加如下内容:

 xmlns:si="clr-namespace:System.IO;assembly=mscorlib" 

到XAML文件中的根活动以导入System.IO

答案 1 :(得分:0)

您的解决方案也解决了重新托管基于流的活动的不同问题,并且没有我能找到的建议解决方案,所以我在此处发布。

症状是你在设计器主机中得到一个模态对话框,它在System.Activities.Presentation.View.ImportDesigner.OnContextChanged()中声明了一个空引用异常, 如果您使用

加载了活动
ActivityXamlServices.Load(aStream)  // wrong way!

原因:

OnContextChanged() // of class ImportDesigner

https://referencesource.microsoft.com/#System.Activities.Presentation/System.Activities.Presentation/System/Activities/Presentation/View/ImportDesigner.xaml.cs,1d24713ba95e69c5访问&#34; Imports&#34;的.Collection。 property引发空指针异常。可能是因为没有关于导入的命名空间的信息被加载。

解决方案:使用活动

ab.Implementation // of the ActivityBuilder ab 
来自Alex&#39; post和.Load()将它放入WorkflowDesigner实例中。

完整代码段

public static Activity LoadActivityFrom(FileInfo xaml)
{
  using (var rd = xaml.OpenRead())
  using (var xr = new System.Xaml.XamlXmlReader(rd))
  using (var br = System.Activities.XamlIntegration.ActivityXamlServices.CreateBuilderReader(xr))
  {
    var ab = System.Xaml.XamlServices.Load(br) as System.Activities.ActivityBuilder;
    return ab.Implementation;
  }
}