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

时间:2012-01-18 07:44:11

标签: c# workflow-foundation workflow-foundation-4 workflow-activity

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

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

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

当用户在设计器上拖放新活动时,此方法有效。

但是,如果用户要复制现有活动并将其粘贴(以创建新活动),则不会触发此接口的Create方法。

现在我最终得到了具有相同GUID属性的该活动的2个实例。

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

1 个答案:

答案 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());