经过一番调查,Reflection 和 IActivityTemplate 可以帮助克服实例约束。
示例代码如下,感谢来自 MSDN 论坛的 Anders Liu
编写一个名为 DynamicActivityTemplate 的类来实现 IActivityTemplateFactory。它的实现看起来像:
public abstract class DynamicActivityTemplateFactory : IActivityTemplateFactory
{
public virtual string GetActivity()
{
return null;
}
public System.Activities.Activity Create(System.Windows.DependencyObject target)
{
return XamlServices.Load(new StringReader(GetActivity())) as Activity;
}
}
当您获得生成的活动实例时,您需要为每个实例动态创建一个继承自 DynamicActivityTemplateFactory 的类型。每种类型都会覆盖 GetActivity() 方法并返回其实例的 xaml。以下是如何创建此类动态类型的示例:
AssemblyBuilder ab = AppDomain.CurrentDomain.DefineDynamicAssembly(new AssemblyName("GeneratedActivities"), AssemblyBuilderAccess.RunAndSave);
ModuleBuilder mb = ab.DefineDynamicModule("GeneratedActivities", "GeneratedActivities.dll");
TypeBuilder tb = mb.DefineType("ActivityTemplateFactory4Sequence", TypeAttributes.Public | TypeAttributes.Class, typeof(DynamicActivityTemplateFactory));
MethodBuilder methodb = tb.DefineMethod("GetActivity", MethodAttributes.Public | MethodAttributes.Virtual, typeof(string), null);
ILGenerator msil = methodb.GetILGenerator();
msil.Emit(OpCodes.Ldstr, XamlServices.Save(new Sequence() { DisplayName = "Test" }));
msil.Emit(OpCodes.Ret);
Type t = tb.CreateType();
ab.Save("GeneratedActivities.dll");
Assembly.Load(new AssemblyName("GeneratedActivities"));
toolbox.Categories[0].Add(new ToolboxItemWrapper(t));
将这些动态生成的类型添加到工具箱。
在这种情况下,您为每个实例创建工厂类型,然后在工具箱中使用这些工厂。这些工厂在交给设计师时会创建活动。我认为这对您的情况有用,希望对您有所帮助。
来自 MSDN 论坛的原始帖子:http:
//social.msdn.microsoft.com/Forums/en-US/wfprerelease/thread/1b756014-72a0-483f-99ef-4f9e6e2e2324