我目前正在保存我的.NET FX 4.0.1 StateMachine活动,如下所示:
var sb = new StringBuilder();
var xamlWriter = ActivityXamlServices.CreateBuilderWriter(
new XamlXmlWriter(new StringWriter(sb),
new XamlSchemaContext()));
XamlServices.Save(xamlWriter, activityBuilder);
return sb.ToString();
这很好用,生成的XAML看起来不错。不幸的是,它无效。我可以在使用ActivityXamlServices.Load
时阅读它,但是当我执行它时,它表示它不知道工作流中定义的属性。在Visual Studio设计器中打开它会产生相同的错误:
编译器错误遇到处理表达式“ActiveCall”。 “ActiveCall”未声明。由于其保护级别,它可能无法访问。
通过比较原始XAML和我的代码生成的XAML,我发现了如何解决这个问题。我必须在StateMachine
标记前加上此标记:
<mva:VisualBasic.Settings>
Assembly references and imported namespaces for internal implementation
</mva:VisualBasic.Settings>
顺便说一下:
标签内的文字必须与此完全相同,否则在VS中打开WF时会出错:
无法从文本'FooBar'
创建'设置'
问题:
我需要在代码中更改以在生成的XAML中包含此标记吗?
答案 0 :(得分:1)
我想我找到了答案。
在调用Save
之前,我必须使用以下代码:
VisualBasic.SetSettings(activityBuilder, new VisualBasicSettings());
如果activityBuilder
是从DynamicActivity
创建的,则最好使用以下代码:
VisualBasic.SetSettings(activityBuilder,
VisualBasic.GetSettings(dynamicActivity));
如果未使用此选项,则只有扩展方法所需的名称空间不会写入XAML,并且在加载和执行XAML时会导致错误。
我在code project上总结了我的发现。