我正在创建一个重新托管工作流设计器的应用程序。我所做的是遵循Apress的Pro WF 4书籍的教程。
本教程的原则是:
1.使用WorkflowDesigner
类读取工作流xaml文件,并将WorkflowDesigner.View
和PropertyView
属性绑定到UI中的ContentControl
。
2.使用System.Activities.Presentation.Toolbox.ToolboxControl
类创建类似VS的工具箱,以便用户可以拖放添加到此工具箱中的任何活动
3. ToolboxControl
使用ToolboxCategory
和ToolboxItemWrapper
来构建其内容。
好的,我的问题与ToolboxItemWrapper
课有关。根据文档,构造函数使用的是类类型,而不是实例。所以当我们拖放时,它会将类实例化为一个实例
这是文件:
http://msdn.microsoft.com/en-us/library/system.activities.presentation.toolbox.toolboxitemwrapper.aspx
但是,我想破解ToolboxItemWrapper
以便它可以接受一个实例,然后当我们将其拖放到WorkflowDesigner.View
时,View将显示该实例。
有任何想法或线索如何实现此功能?
我需要此功能的原因:
我们希望在将“实例”添加到设计器时使用户更容易。当你在工具箱中有一个'type'时,拖放后你需要设置参数。当我们在工具箱中有'实例'时,用户需要做的只是拖放而这就是全部。无需输入参数来设置'类型'。用户在创建工作流程时的步骤较少。
另一个约束是工具箱中的活动列表取决于特定模块。此特定模块将生成实例列表。然后我想将这些生成的实例转换为工具箱中的条目。我将在问题上添加此信息
答案 0 :(得分:0)
听起来您需要使用IActivityTemplateFactory接口。在这种情况下,将活动拖动到设计器上时会调用Create()方法,您可以在返回的活动实例中设置属性等。这是将ReceiveAndSendReply活动对拖到设计图面上时使用的。
答案 1 :(得分:0)
经过一些调查后,Reflection和IActivityTemplate可以帮助克服实例约束。
示例代码如下,来自MSDN论坛的Anders Liu
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;
}
}
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