1

ワークフローデザイナーを再ホストするアプリケーションを作成しています。私がしたことは、ApressのProWF4本のチュートリアルに従うことです。

チュートリアルの原則は次のとおり
です。1。WorkflowDesignerクラスを使用してワークフローxamlファイルを読み取り、UIにバインドWorkflowDesigner.ViewしてPropertyViewプロパティを設定します。 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、ビューにインスタンスが表示されます。

この機能を実現するためのアイデアや手がかりはありますか?

この機能が必要な理由:
デザイナーに「インスタンス」を追加するときに、ユーザーが簡単に使用できるようにしたいのです。ツールボックスに「タイプ」がある場合、ドラッグアンドドロップした後、パラメータを設定する必要があります。ツールボックスに「インスタンス」がある場合、ユーザーが行う必要があるのはドラッグアンドドロップだけで、それだけです。'タイプ'を設定するためにパラメータを入力する必要はありません。ワークフローを作成する際のユーザーの手順が少なくなります。

もう1つの制約は、ツールボックス内のアクティビティのリストが特定のモジュールに依存することです。この特定のモジュールは、インスタンスのリストを生成します。次に、これらの生成されたインスタンスをツールボックスのエントリに変換します。質問にこの情報を追加します

4

2 に答える 2

0

調査を行った後、ReflectionとIActivityTemplateは、インスタンスの制約を克服するのに役立ちます。

サンプルコードは以下のとおりです。MSDNフォーラムのAndersLiuの功績によるものです。

  • IActivityTemplateFactoryを実装するDynamicActivityTemplateというクラスを記述します。その含意は次のようになります。

        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 に答える
    0

    IActivityTemplateFactoryインターフェイスを使用する必要があるようです。その場合、アクティビティがデザイナにドラッグされたときにCreate()メソッドが呼び出され、返されるアクティビティインスタンスでプロパティなどを設定できます。これは、ReceiveAndSendReplyアクティビティペアをデザインサーフェスにドラッグするときに使用されます。

    于 2010-10-25T15:20:01.787 に答える