Workflow WF在同一活动上有4个不同的ID

Workflow WF在同一活动上有4个不同的ID,workflow,workflow-foundation-4,workflow-foundation,workflow-activity,Workflow,Workflow Foundation 4,Workflow Foundation,Workflow Activity,由于我的应用程序中有一个奇怪的行为,我不得不在调用WorkflowInvoker.Invoke之前重新加载设计器 wd.Flush(); SaveXamlFile(currentXamlPath, wd.Text); 我只是刷新内容,然后将wd.Text写入一个文件 //cleanup the previous designer if (wd != null) { wd.ModelChanged -= new EventHandler(Designer_ModelChanged); }

由于我的应用程序中有一个奇怪的行为,我不得不在调用WorkflowInvoker.Invoke之前重新加载设计器

wd.Flush();
SaveXamlFile(currentXamlPath, wd.Text);
我只是刷新内容,然后将wd.Text写入一个文件

//cleanup the previous designer
if (wd != null)
{
    wd.ModelChanged -= new EventHandler(Designer_ModelChanged);
}

//designer
wd = new WorkflowDesigner();
designerArea.Child = wd.View;
this.DebuggerService = this.wd.DebugManagerView;

//property grid
propertiesArea.Child = wd.PropertyInspectorView;

//event handler
wd.ModelChanged += new EventHandler(Designer_ModelChanged);

//error service
wd.Context.Services.Publish<IValidationErrorService>(errorService);


wd.Context.Items.Subscribe<Selection>(OnItemSelected);
我调用WorkflowInvoker.Invoke,并在我的自定义活动(从CodeActivity派生)中使用它的名称: 好吧,到现在为止,我还有一个1.2的身份证

我想通过ModelItem更新此活动的一些字段,以便立即在GUI中显示它们

IEnumerable<ModelItem> activityCollection = currentWorkflow.Find(currentWorkflow.Root, typeof(Activity));

我肯定我在这里遗漏了什么,但我不知道是什么

我找到了一个解决方法:

在我的自定义活动中,我正在添加Guid属性并覆盖CacheMatadata:

public Guid unique { get; set; }

protected override void CacheMetadata(CodeActivityMetadata metadata)
{
    if (unique.ToString() == "00000000-0000-0000-0000-000000000000")
        unique = Guid.NewGuid();
}
在设计器上拖动活动时,将生成唯一id。我确保这部分代码只被调用一次。 为什么呢

因为打了这样的电话之后

IEnumerable<ModelItem> activityCollection = currentWorkflow.Find(currentWorkflow.Root, typeof(Activity));
因此,Guid发生了变化,其实用程序也消失了

通过这种方式,我可以获取自定义活动的ModelItem,并更新它的一些属性,这些属性会立即显示在GUI中

public Guid unique { get; set; }

protected override void CacheMetadata(CodeActivityMetadata metadata)
{
    if (unique.ToString() == "00000000-0000-0000-0000-000000000000")
        unique = Guid.NewGuid();
}
IEnumerable<ModelItem> activityCollection = currentWorkflow.Find(currentWorkflow.Root, typeof(Activity));
Activity root = ActivityXamlServices.Load(currentXamlPath);
WorkflowInspectionServices.CacheMetadata(root);