2012-04-17 110 views
0

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

我已经尝试了很多不同的方式来做到这一点,使用WorkflowInspectionServices对象来导航ModelItemTree,获取父Sequence功能并从它的Activities集合中删除自定义属性,但我似乎无法使其工作。

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

要清楚...这不是在执行工作流程时,而是在重新主办设计人员设计时。

+0

我敢打赌,您不要从ModelItem中移除子项,而是将ModelItem包装的Activity树移除。也就是说,你做了一个“GetCurrentValue”,将返回值转换为你的Activity类型,然后以这种方式去除这些孩子。这是行不通的,因为活动树的ModelItem表示将不同步。您必须通过获取包含子项的属性的ModelItem来移除子项,然后将其清除。 – Will 2012-04-17 13:12:08

+0

你好。感谢那。你是对的,那正是我正在做的。我确切知道你来自哪里,但只是不知道该怎么做。这是否意味着我可以从我需要清除的父活动(序列?)中获取ModelItem?对不起,这是所有这些新东西... – 2012-04-17 15:36:55

+0

让我看看我是否可以处理一段代码,然后我会回答。 – Will 2012-04-17 15:38:20

回答

1

我打赌你不要从ModelItem中移除子类,而是从ModelItem中取出活动树。也就是说,你做了一个“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); 
    } 
}