После некоторых исследований Reflection и IActivityTemplate могут помочь преодолеть ограничение экземпляра.
Пример кода ниже, спасибо Андерсу Лиу из MSDN Forum
Напишите класс с именем 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"));</p>
<p>toolbox.Categories[0].Add(new ToolboxItemWrapper(t));
Добавить эти динамические сгенерированные типы в панель инструментов.
В этом случае вы создаете фабричные типы длякаждый из этих экземпляров, а затем использовать эти фабрики в наборе инструментов.Эти факторы будут создавать действия, когда они будут переданы в дизайнер.Я думаю, что это будет работать для вашего случая, надеюсь, это поможет.
Оригинальный пост с форума MSDN: http://social.msdn.microsoft.com/Forums/en-US/wfprerelease/thread/1b756014-72a0-483f-99ef-4f9e6e2e2324