Использование экземпляра как на элементе в ToolboxControl в интерфейсе отладки WF - PullRequest
1 голос
/ 22 октября 2010

Я создаю приложение, которое переименовывает дизайнера рабочих процессов.То, что я сделал, это следование учебнику из книг Apress 'Pro WF 4.

Принцип обучения:
1. Используйте класс WorkflowDesigner для чтения файла xaml рабочего процесса и привяжите свойство WorkflowDesigner.View и PropertyView к ContentControl в пользовательском интерфейсе.
2. Используйте класс System.Activities.Presentation.Toolbox.ToolboxControl для создания VS-подобного Toolbox, чтобы пользователь мог перетаскивать любые действия, добавленные в этот набор инструментов
3. ToolboxControl использует ToolboxCategory и ToolboxItemWrapper для создания его содержимого.

Хорошо, мой вопрос здесь относится к ToolboxItemWrapper классу.Основываясь на документации, конструктор использует тип класса, а не экземпляр.Поэтому, когда мы перетаскиваем, он создает экземпляр класса в экземпляре.
Вот документация:
http://msdn.microsoft.com/en-us/library/system.activities.presentation.toolbox.toolboxitemwrapper.aspx

Однако, что я хочу взломать ToolboxItemWrapper, такчто он может принять экземпляр, затем, когда мы перетащим его в WorkflowDesigner.View, представление покажет экземпляр.

Есть идеи или подсказки, как реализовать эту функцию?

Причина, по которой мне нужна эта функция:
Мы хотим упростить пользователю добавление «экземпляра» в конструктор.когда у вас есть «тип» в наборе инструментов, после перетаскивания вам нужно настроить параметр.Когда у нас есть «экземпляр» в наборе инструментов, пользователь должен просто перетаскивать его и все.Нет необходимости вводить параметр, чтобы установить тип.Меньше шагов для пользователя при создании их рабочего процесса.

Другим ограничением является список действий на панели инструментов, зависящий от конкретного модуля.Этот конкретный модуль будет генерировать список экземпляров.Затем я хочу преобразовать эти сгенерированные экземпляры в записи в наборе инструментов.Я добавлю эту информацию на вопросы

Ответы [ 2 ]

0 голосов
/ 27 октября 2010

После некоторых исследований 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

0 голосов
/ 25 октября 2010

Похоже, вам нужно использовать интерфейс IActivityTemplateFactory. В этом случае метод Create () вызывается, когда действие перетаскивается в конструктор, и вы можете установить свойства и т. Д. В возвращаемом экземпляре действия. Это то, что используется при перетаскивании пары действий ReceiveAndSendReply на поверхность конструктора.

...