0

Windowsワークフローファンデーションでは、外部ファイルからワークフローをロードすることは可能ですか?その目的は、ファイルからステートマシンのワークフローを取り出してロードする一般的なワークフローコントローラを作成することです。もし私が行って、VSで利用可能なデザイナを使用すると、ワークフロー図は固定され、特定のユースケースに対してのみ使用できますが、一般的なものを作成する必要があります。ビジュアルスタジオ

答えて

1

はい、XamlActivityServicesActivityBuilderタイプを使用して、XAMLワークフローを保存してファイルから読み込むことができます。ワークフローをコードで動的に構築し、そのサービスをXMLにシリアル化して後で使用することができます。

ユーザーがワークフローを作成および編集できるようにする場合は、必要に応じてアプリケーションでデザイナーを直接再ホストすることもできます。

保存ファイルへのワークフロー

はここでファイルにワークフローを保存するのに非常に速いサンプルです:

:上記

var activityBuilder = new ActivityBuilder(); 
activityBuilder.Name = "HelloWorldApp"; 
activityBuilder.Properties.Add(new DynamicActivityProperty { Name = "UserName", Type = typeof(InArgument<string>) }); 
activityBuilder.Implementation = new Sequence 
{ 
    Activities = 
    { 
     new WriteLine 
     { 
      Text = new CSharpValue<string>("\"Hello, \" + UserName + \", how are you?\"") 
     } 
    } 
}; 

using (var streamWriter = File.CreateText(@"C:\Temp\MyWorkflow.xaml")) 
{ 
    using (var xamlWriter = new XamlXmlWriter(streamWriter, new XamlSchemaContext())) 
    { 
     using (var builderWriter = ActivityXamlServices.CreateBuilderWriter(xamlWriter)) 
     { 
      XamlServices.Save(builderWriter, activityBuilder); 
     } 
    } 
} 

は次のようなXMLファイルを生成する必要があります

<?xml version="1.0" encoding="utf-8"?> 
<Activity x:Class="HelloWorld" 
      xmlns="http://schemas.microsoft.com/netfx/2009/xaml/activities" 
      xmlns:mca="clr-namespace:Microsoft.CSharp.Activities;assembly=System.Activities" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <x:Members> 
    <x:Property Name="UserName" Type="InArgument(x:String)" /> 
    </x:Members> 
    <Sequence> 
    <WriteLine> 
     <InArgument x:TypeArguments="x:String"> 
     <mca:CSharpValue x:TypeArguments="x:String"> 
      "Hello, " + UserName + ", how are you?" 
     </mca:CSharpValue> 
     </InArgument> 
    </WriteLine> 
    </Sequence> 
</Activity> 

Loading A XA MLからのワークフロー

次のスニペットは、ファイルからワークフローをロードしてから、水和ワークフローを実行する方法を示しています。

var activityXamlServicesSettings = new ActivityXamlServicesSettings 
{ 
    CompileExpressions = true 
}; 
var dynamicActivity = ActivityXamlServices.Load(File.OpenRead(@"C:\Temp\MyWorkflow.xaml"), activityXamlServicesSettings) as DynamicActivity; 

var workflowInputs = new Dictionary<string, object> 
{ 
    { "UserName", "Me" } 
}; 
var workflowInvoker = new WorkflowInvoker(dynamicActivity); 
workflowInvoker.Invoke(workflowInputs); 
+0

XAMLファイルからクラスメソッドが呼び出されている場所の例を示してください。答えにたくさん感謝して、本当に助けてくれました。 –

+0

ここであなたの他の質問に基づいて、これを行う方法をすでに理解しているようです:http://stackoverflow.com/questions/37390601/how-to-conditionally-use-invokemethod-in-an-xaml-windows-workflow -財団 – ajawad987

関連する問題