我正在尝试重新托管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
);
现在我的工作流已经导入了所有理想的命名空间。
答案 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;
}
}