0

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

我已经尝试了很多不同的方法来做到这一点,使用 WorkflowInspectionServices 对象来导航 ModelItemTree,获取父序列活动并从它的活动集合中删除自定义活动,但我似乎无法让它工作。

有没有人实际上成功地从代码中重新托管的设计器表面中删除了一个活动(不仅仅是右键单击它并选择删除!!)。

需要明确的是……这不是在执行工作流时,而是在重新托管的设计器中设计时。

4

1 回答 1

1

我敢打赌,您不会从 ModelItem 中删除子项,而是从 ModelItem 包装的 Activity 树中删除。即,您执行“GetCurrentValue”,将返回值转换为您的 Activity 类型,然后以这种方式删除子项。那是行不通的,因为 Activity 树的 ModelItem 表示将不同步。您必须通过获取包含子项的属性的 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);
    }
}
于 2012-04-17T16:51:49.657 回答