C# 如何在重新托管的WF 4.0设计器中检测复制/剪切粘贴事件?

C# 如何在重新托管的WF 4.0设计器中检测复制/剪切粘贴事件?,c#,workflow-foundation,workflow-foundation-4,workflow-activity,C#,Workflow Foundation,Workflow Foundation 4,Workflow Activity,我正在使用WF 4.0重新托管设计器 当我拖放通过继承CodeActivity类创建的自定义活动时,我希望生成一个新的GUID并将其分配给自定义活动中的a属性 为此,我必须实现IActivityTemplateFactory接口,并在其Create方法中,每次实例化一个新的GUID 当用户在设计器上拖放一个新活动时,此操作有效 但是,如果用户要复制现有活动并粘贴它(以创建新活动),则此界面的create方法不会触发 现在,我得到了具有相同GUID属性的该活动的两个实例 有没有办法绕过这个问题?是

我正在使用WF 4.0重新托管设计器

当我拖放通过继承
CodeActivity
类创建的自定义活动时,我希望生成一个新的GUID并将其分配给自定义活动中的a属性

为此,我必须实现
IActivityTemplateFactory
接口,并在其
Create
方法中,每次实例化一个新的GUID

当用户在设计器上拖放一个新活动时,此操作有效

但是,如果用户要复制现有活动并粘贴它(以创建新活动),则此界面的
create
方法不会触发

现在,我得到了具有相同GUID属性的该活动的两个实例


有没有办法绕过这个问题?是否还有其他接口或事件可以重载/重写以检测复制/剪切粘贴操作?

IActivityTemplateFactory.Create仅在创建活动时调用,而不是在设计图面上从一个位置移动到另一个位置时调用

从设计的角度来看,这是一个艰难的过程。您的活动的设计应确保它们不“知道”设计图面,也不依赖于设计器中的复制/粘贴事件

活动设计师是另一回事。让ActivityDesigner使用其ModelItem属性注册观察者可能是一个简单的解决方案,然后每当此属性更改时,它都会自动设置该ModelItem上的Guid。不幸的是,这有点复杂。您必须能够理解ModelItems如何工作以及如何执行DependencyProperty

以下是如何将手表添加到DP:

DependencyPropertyDescriptor
    .FromProperty(
        ActivityDesigner.ModelItemProperty, 
        typeof(ActivityDesigner))
    .AddValueChanged(this, OnModelItemChanged);
这里没有什么注释。首先,这应该在设计器的构造函数中调用
DependencyPropertyDescriptor.FromProperty
返回一个DPD。如果事件处理程序停止触发,则必须保留对该DPD的引用。工作流设计器和DPD不能很好地发挥作用;我已经就此向微软提交了一份错误报告。第三,
OnModelItemChanged
是一个简单的事件处理程序(void(object,EventHandler))

ModelItems包装它们所表示的活动。您必须使用ModelItem来更改已包装活动的属性,即使您可以从中获取活动。否则,设计图面将与活动不同步。因此,必须按如下方式设置Guid属性:

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