繁体   English   中英

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

[英]How do I detect a copy/cut paste event in the re-hosted WF 4.0 designer?

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

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

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

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

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

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

有办法解决这个问题吗? 是否存在另一个我可以重载/覆盖以检测复制/剪切粘贴操作的接口或事件?

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

从设计角度来看,这是一个艰难的过程。 您的活动应该以这样的方式进行设计,以使它们不“了解”设计图面,并且不依赖设计器中的复制/粘贴事件。

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(对象(EventHandler)))。

ModelItem包装它们表示的活动。 必须使用ModelItem更改包装的Activity的属性,即使您可以从中获取Activity。 否则,设计图面将与“活动”不同步。 因此,您必须像这样设置Guid属性:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM