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. Итак, вы должны установить свойство Guid следующим образом:
this.ModelItem.Properties["Guid"].SetValue(Guid.NewGuid());