1

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

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

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

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

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

我需要此功能的原因:
我们希望在向设计器中添加“实例”时让用户更容易。当您在工具箱中有“类型”时,拖放后您需要设置参数。当我们在工具箱中有“实例”时,用户需要做的只是拖放,仅此而已。无需输入参数来设置“类型”。用户创建工作流程时的步骤更少。

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

4

2 回答 2

0

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

于 2010-10-25T15:20:01.787 回答
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 的类型。每种类型都会覆盖 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

    于 2010-10-27T06:11:51.177 回答