在WF重新托管的调试界面中使用ToolboxControl中的实例作为项目

时间:2010-10-22 09:07:37

标签: workflow workflow-foundation-4 toolbox

我正在创建一个重新托管工作流设计器的应用程序。我所做的是遵循Apress的Pro WF 4书籍的教程。

本教程的原则是:
1.使用WorkflowDesigner类读取工作流xaml文件,并将WorkflowDesigner.ViewPropertyView属性绑定到UI中的ContentControl
2.使用System.Activities.Presentation.Toolbox.ToolboxControl类创建类似VS的工具箱,以便用户可以拖放添加到此工具箱中的任何活动
3. ToolboxControl使用ToolboxCategoryToolboxItemWrapper来构建其内容。

好的,我的问题与ToolboxItemWrapper课有关。根据文档,构造函数使用的是类类型,而不是实例。所以当我们拖放时,它会将类实例化为一个实例 这是文件:
http://msdn.microsoft.com/en-us/library/system.activities.presentation.toolbox.toolboxitemwrapper.aspx

但是,我想破解ToolboxItemWrapper以便它可以接受一个实例,然后当我们将其拖放到WorkflowDesigner.View时,View将显示该实例。

有任何想法或线索如何实现此功能?

我需要此功能的原因:
我们希望在将“实例”添加到设计器时使用户更容易。当你在工具箱中有一个'type'时,拖放后你需要设置参数。当我们在工具箱中有'实例'时,用户需要做的只是拖放而这就是全部。无需输入参数来设置'类型'。用户在创建工作流程时的步骤较少。

另一个约束是工具箱中的活动列表取决于特定模块。此特定模块将生成实例列表。然后我想将这些生成的实例转换为工具箱中的条目。我将在问题上添加此信息

2 个答案:

答案 0 :(得分:0)

听起来您需要使用IActivityTemplateFactory接口。在这种情况下,将活动拖动到设计器上时会调用Create()方法,您可以在返回的活动实例中设置属性等。这是将ReceiveAndSendReply活动对拖到设计图面上时使用的。

答案 1 :(得分:0)

经过一些调查后,Reflection和IActivityTemplate可以帮助克服实例约束。

示例代码如下,来自MSDN论坛的Anders Liu

  • 编写一个名为DynamicActivityTemplate的类,实现IActivityTemplateFactory。其实施情况如下:

        public abstract class DynamicActivityTemplateFactory : IActivityTemplateFactory
         {
          public virtual string GetActivity()
          {
           return null;
          }
    
          public System.Activities.Activity Create(System.Windows.DependencyObject target)
          {
           return XamlServices.Load(new StringReader(GetActivity())) as Activity;
          }
         }

  • 当您获得生成的活动实例时,您需要动态创建一个继承自DynamicActivityTemplateFactory的Type。每个类型都重写方法GetActivity()并返回其实例的xaml。以下是如何创建此类动态类型的示例:

    
       AssemblyBuilder ab = AppDomain.CurrentDomain.DefineDynamicAssembly(new AssemblyName("GeneratedActivities"), AssemblyBuilderAccess.RunAndSave);
       ModuleBuilder mb = ab.DefineDynamicModule("GeneratedActivities", "GeneratedActivities.dll");
       TypeBuilder tb = mb.DefineType("ActivityTemplateFactory4Sequence", TypeAttributes.Public | TypeAttributes.Class, typeof(DynamicActivityTemplateFactory));
       MethodBuilder methodb = tb.DefineMethod("GetActivity", MethodAttributes.Public | MethodAttributes.Virtual, typeof(string), null);
       ILGenerator msil = methodb.GetILGenerator();
       msil.Emit(OpCodes.Ldstr, XamlServices.Save(new Sequence() { DisplayName = "Test" }));
       msil.Emit(OpCodes.Ret);
       Type t = tb.CreateType();
       ab.Save("GeneratedActivities.dll");
       Assembly.Load(new AssemblyName("GeneratedActivities"));

    toolbox.Categories[0].Add(new ToolboxItemWrapper(t));

  • 将这些动态生成的类型添加到工具箱。

    在这种情况下,您为每个实例创建工厂类型,然后在工具箱中使用这些工厂。当这些因素被推向设计师时,它们将创建活动。我认为这对你的情况有用,希望有所帮助。

  • 来自MSDN论坛的原帖: http://social.msdn.microsoft.com/Forums/en-US/wfprerelease/thread/1b756014-72a0-483f-99ef-4f9e6e2e2324