从reshosted设计器表面删除活动

时间:2012-04-17 12:33:53

标签: workflow-foundation-4 workflow-rehosting

我的应用程序中有一个重新设计的设计器,它可以正常运行我的自定义活动。当用户设计他们的工作流程时,他们会像平常一样将某些活动拖到设计者表面上。但是,在用户从下拉框中选择某些值(而不是在设计器中)之后,我想从设计图面中删除某些活动,以便它们无法保存和执行。

我尝试了很多不同的方法,使用WorkflowInspectionServices对象导航ModelItemTree,抓取父Sequence活动并从其活动集合中删除自定义的活动,但我似乎无法使其工作。 / p>

有没有人真的设法在代码中成功地从重新托管的设计器表面删除活动(不只是右键单击它并选择删除!!)。

要清楚......这不是在执行工作流时,而是在重新设计的设计器中进行设计时。

1 个答案:

答案 0 :(得分:1)

我打赌你不会从ModelItem中删除子项,而是从ModelItem包装的Activity树中删除子项。即,您执行“GetCurrentValue”,将返回值转换为您的Activity类型,然后以这种方式删除子节点。这将无效,as the ModelItem representation of the Activity tree will get out of sync.您必须通过获取包含子项的属性的ModelItem来移除子项,然后将其清除。

例如,给定以下活动

[Designer(typeof(NativeActivity1Designer))]
public sealed class NativeActivity1 : NativeActivity, IActivityTemplateFactory
{
    public Activity Child { get; set; }

    protected override void Execute(NativeActivityContext context) { }

    Activity IActivityTemplateFactory.Create(System.Windows.DependencyObject target)
    {
        return new NativeActivity1
        {
            Child = new Sequence()
        };
    }
}

和以下设计器(为简洁起见,删除了ActivityDesigner节点)

<StackPanel>
    <sap:WorkflowItemPresenter
        MinHeight="100"
        HintText="Drop it here"
        Item="{Binding ModelItem.Child}" />
    <Button
        Content="Remove"
        Click="Button_Click" />
</StackPanel>

您可以使用Button_Click中的代码从设计器中的工作流程中删除子项。

public partial class NativeActivity1Designer
{
    public NativeActivity1Designer()
    {
        InitializeComponent();
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {

        ModelProperty child = ModelItem.Properties["Child"];
        child.SetValue(null);
    }
}