1

Я использую реорганизованный дизайнер WF 4.0.Как определить событие вставки/вырезания в реорганизованном дизайнере WF 4.0?

Когда я перетаскиваю пользовательскую активность, которую я создал путем наследования класса CodeActivity, я хочу сгенерировать новый GUID и присвоить его свойству в моей пользовательской деятельности.

Для этого мне пришлось реализовать интерфейс IActivityTemplateFactory и в его методе Create каждый раз создавать новый GUID.

Это работает, когда пользователь перетаскивает и отбрасывает новое действие на дизайнера.

Однако, если пользователь должен был скопировать существующее действие и вставить его (для создания нового действия), метод Create этого интерфейса не срабатывает.

Теперь у меня есть 2 экземпляра этого действия с тем же свойством GUID.

Есть ли способ обойти это? Есть ли другой интерфейс или событие, которое я могу перегрузить/переопределить для обнаружения операции копирования/вырезания пасты?

ответ

1

IActivityTemplateFactory.Create следует называть только тогда, когда Деятельность создана, а не когда она перемещается из одного места в другое на поверхности дизайна.

Это непросто с точки зрения дизайна. Ваши действия должны быть сконструированы таким образом, чтобы они не «знали» о поверхности дизайна и не имели никаких зависимостей от событий копирования/вставки в дизайнере.

ActivityDesigner - это другое дело. Возможно, было простое исправление того, что ActivityDesigner регистрирует наблюдателя с его свойством ModelItem, тогда всякий раз, когда это свойство изменяется, он автоматически устанавливает Guid на этом ModelItem. К сожалению, это довольно сложно. Вы должны уметь понимать, как работают ModelItems и как выполнять DependencyProperty.

Вот как добавить часы к DP:

DependencyPropertyDescriptor 
    .FromProperty(
     ActivityDesigner.ModelItemProperty, 
     typeof(ActivityDesigner)) 
    .AddValueChanged(this, OnModelItemChanged); 

Несколько примечания здесь. Во-первых, это должно быть вызвано в конструкторе вашего конструктора. DependencyPropertyDescriptor.FromProperty возвращает DPD. Если ваш обработчик событий прекратит стрельбу, вам придется удерживать ссылку на этот DPD. Дизайнер рабочего процесса и DPD не играют хорошо; Я опубликовал отчет об ошибке с MS. В-третьих, OnModelItemChanged - простой обработчик событий (void (object, EventHandler)).

ModelItems завершает деятельность, которую они представляют. Вы ДОЛЖНЫ использовать ModelItem для изменения свойств завернутой операции, даже если вы можете получить из нее Activity. Если вы этого не сделаете, поверхность дизайна будет не синхронизирована с Activity. Таким образом, вы должны установить свойство Guid следующим образом:

this.ModelItem.Properties["Guid"].SetValue(Guid.NewGuid());