0

我在序列化到WorkflowService包含ActivityBuilderBody参数的 xaml a 时遇到问题。ActivityBuilder包含 C# 表达式并且序列化不会WorkflowService激活,因为某些 C# 表达式引用自定义类型。实际错误是“未定义类型'SomeTypeIPassToAnArgument'”。

MyActivityBuilder是从包含一个TextExpression.NamespacesForImplementation元素的 xaml 文件创建的。序列化时缺少此内容WorkflowService,这似乎是问题的原因。

我发现如果我序列化ActivityBuilder自身,则包含命名空间,但使用ActivityBuilder.Implementation失败。不幸的是,当我构建WorkflowService要序列化时,我必须使用ActivityBuilder.Implementation它作为它的Body参数。我尝试使用该TextExpression.SetNamespacesForImplementation方法来确保将这些附加到实现中,但这并没有帮助。

以下代码段显示了我正在尝试做的事情以及失败的地方。

var loadedXaml = File.ReadAllText(@"C:\workflow.xaml");
Assert.IsTrue(loadedXaml.Contains("NamespacesForImplementation"));

var xamlReader = new XamlXmlReader(new StringReader(loadedXaml));
var builderReader = ActivityXamlServices.CreateBuilderReader(xamlReader);
var builder = XamlServices.Load(builderReader) as ActivityBuilder;

// namespaces are available in the builder itself
Assert.AreNotEqual(0, TextExpression.GetNamespacesForImplementation(builder).Count);

// when saving, the assert fails because the namespaces aren't serialized
var savedXaml = XamlServices.Save(builder.Implementation);
Assert.IsTrue(savedXaml.Contains("NamespacesForImplementation"));

知道为什么这不起作用,或者我可以使用另一种方法吗?最终我的目标是能够从 xaml 加载工作流并将它们合并到一个序列化WorkflowService中,我可以使用VirtualPathProvider.

谢谢!

4

1 回答 1

0

您不能将 ActivityBuilder 用作 WorkflowService 的主体,ActivityBuilder 仅用于在设计时操作 Activity。要将 ActivityBuilder 转换为 Activity,请使用 ActivityXamlServices.CreateBuilderWriter。

您可以利用 XamlServices.Transform 通过 ActivityBuilder 将 XamlReader 通过管道传输到您在 ActivityXamlServices.CreateBuilderWriter 中创建的编写器。

于 2013-01-04T22:37:18.947 回答