我正在使用WF 4.0重新托管的设计器。
当我拖放我通过继承CodeActivity
类创建的自定义活动时,我想生成一个新的GUID并将其分配给我的自定义活动中的a属性。
为了实现这一点,我必须实现IActivityTemplateFactory
接口,并在其Create
方法中,每次都实例化一个新的GUID。
当用户在设计器上拖放新活动时,此方法有效。
但是,如果用户要复制现有活动并将其粘贴(以创建新活动),则不会触发此接口的Create
方法。
现在我最终得到了具有相同GUID属性的该活动的2个实例。
有没有办法解决这个问题?是否有其他接口或事件可以重载/覆盖以检测复制/剪切粘贴操作?
答案 0 :(得分:1)
IActivityTemplateFactory.Create
只应在创建活动时调用,而不是在设计图面上从一个地方移动到另一个地方时调用。
从设计角度来看,这是一个艰难的过程。您的活动应该以这样的方式设计,以便他们不“了解”设计图面,并且对设计器中的复制/粘贴事件没有任何依赖性。
ActivityDesigner是另一回事。让ActivityDesigner注册一个具有ModelItem属性的观察者可能是一个简单的修复,然后每当此属性更改时,它会自动在该ModelItem上设置Guid。遗憾的是,这有点复杂。您必须能够理解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());