WF 4 个不同的 ID 用于相同的活动
WF 4 different IDs on the same activities
由于我的应用程序中出现奇怪的行为,我不得不在调用 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);
然后我重新创建一个新的 WorkflowDesigner 实例并加载以前保存的文件。
wd.Load(currentXamlPath);
我调用 WorkflowInvoker.Invoke,在我的自定义 activity 中,它源自代码 Activity 我正在使用它的名称:
好的,很好,到现在为止,我有一个 1.2 的 ID。
我想通过其 ModelItem 更新此 Activity 的某些字段,以便立即在 GUI 中显示它们。
IEnumerable<ModelItem> activityCollection = currentWorkflow.Find(currentWorkflow.Root, typeof(Activity));
但是问题来了:
我在那里找不到我的 Activity ID。现在从 1.2 转换为 2。为什么会这样?
我试图从我的 Activity Execute 方法发送一个 this 引用,并通过 ref 搜索它,但我得到的只是空值。
ModelItem temp = activityCollection.FirstOrDefault((m) => (m.GetCurrentValue() == a));
我确定我在这里遗漏了什么,但我不知道是什么。
我找到了解决方法:
在我的自定义活动中,我添加了一个 Guid 属性 并且覆盖了 CacheMetadata:
public Guid unique { get; set; }
protected override void CacheMetadata(CodeActivityMetadata metadata)
{
if (unique.ToString() == "00000000-0000-0000-0000-000000000000")
unique = Guid.NewGuid();
}
当我将 activity 拖动到设计器上时,将生成唯一 ID。我确保这部分代码只被调用一次。
这是为什么?
因为在这样的通话之后,
IEnumerable<ModelItem> activityCollection = currentWorkflow.Find(currentWorkflow.Root, typeof(Activity));
activity 集合中的每个模型都包含 属性(唯一的 Guid 类型),其值是在 CacheMetadata 中进行的第一个赋值。我无法解释这种行为,我只是考虑到了它。
谁又调用了 CacheMetadata ?像这样:
Activity root = ActivityXamlServices.Load(currentXamlPath);
WorkflowInspectionServices.CacheMetadata(root);
因此,Guid 已更改且其实用程序已消失。
这样,我可以为我的自定义 activity 获取 ModelItem 并更新它的一些属性,这些属性会立即显示在 GUI 中。
由于我的应用程序中出现奇怪的行为,我不得不在调用 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);
然后我重新创建一个新的 WorkflowDesigner 实例并加载以前保存的文件。
wd.Load(currentXamlPath);
我调用 WorkflowInvoker.Invoke,在我的自定义 activity 中,它源自代码 Activity 我正在使用它的名称:
我想通过其 ModelItem 更新此 Activity 的某些字段,以便立即在 GUI 中显示它们。
IEnumerable<ModelItem> activityCollection = currentWorkflow.Find(currentWorkflow.Root, typeof(Activity));
但是问题来了:
我在那里找不到我的 Activity ID。现在从 1.2 转换为 2。为什么会这样?
我试图从我的 Activity Execute 方法发送一个 this 引用,并通过 ref 搜索它,但我得到的只是空值。
ModelItem temp = activityCollection.FirstOrDefault((m) => (m.GetCurrentValue() == a));
我确定我在这里遗漏了什么,但我不知道是什么。
我找到了解决方法:
在我的自定义活动中,我添加了一个 Guid 属性 并且覆盖了 CacheMetadata:
public Guid unique { get; set; }
protected override void CacheMetadata(CodeActivityMetadata metadata)
{
if (unique.ToString() == "00000000-0000-0000-0000-000000000000")
unique = Guid.NewGuid();
}
当我将 activity 拖动到设计器上时,将生成唯一 ID。我确保这部分代码只被调用一次。 这是为什么?
因为在这样的通话之后,
IEnumerable<ModelItem> activityCollection = currentWorkflow.Find(currentWorkflow.Root, typeof(Activity));
activity 集合中的每个模型都包含 属性(唯一的 Guid 类型),其值是在 CacheMetadata 中进行的第一个赋值。我无法解释这种行为,我只是考虑到了它。
谁又调用了 CacheMetadata ?像这样:
Activity root = ActivityXamlServices.Load(currentXamlPath);
WorkflowInspectionServices.CacheMetadata(root);
因此,Guid 已更改且其实用程序已消失。
这样,我可以为我的自定义 activity 获取 ModelItem 并更新它的一些属性,这些属性会立即显示在 GUI 中。