次の方法で共有


XAML での WPF と Windows Workflow Foundation の統合

WPFWFIntegration サンプルでは、Windows Presentation Foundation (WPF) と Windows Workflow Foundation (WF) の機能を使用するアプリケーションを 1 つの XAML ドキュメントで作成する方法を示します。 これを実現するために、サンプルでは Windows Workflow Foundation と XAML の機能拡張を使用します。

サンプルの詳細

ShowWindow.xaml ファイルは、シーケンスのアクティビティによって操作される 2 つの文字列変数 Sequence および ShowWindow を持つ WriteLine アクティビティに逆シリアル化します。 WriteLine アクティビティは、Text プロパティに割り当てる式をコンソール ウィンドウに出力します。 ShowWindow アクティビティは、実行ロジックの一部として WPF ウィンドウを表示します。 このウィンドウの DataContext には、シーケンスで宣言された変数が含まれます。 ShowWindow アクティビティで宣言されたウィンドウのコントロールは、データ バインドを使用してこれらの変数を操作します。 最後に、このウィンドウにはボタン コントロールが含まれます。 このボタンの Click イベントは、ActivityDelegate アクティビティを含む MarkupExtension という名前の CloseWindow によって処理されます。 MarkUpExtension は、x:Name によって識別されるオブジェクトおよび格納先ウィンドウの DataContext を、コンテキストとして提供する、含まれているアクティビティを呼び出します。 したがって、CloseWindow.InArgument<Window> は、ウィンドウの名前を参照する式を使用してバインドできます。

ShowWindow アクティビティは、WPF ウィンドウを表示するために AsyncCodeActivity<TResult> クラスから派生し、ウィンドウが閉じられるときに完了します。 Window プロパティは、アクティビティの実行ごとにウィンドウを必要に応じて作成できるようにする Func<Window> 型です。 Window プロパティは、XamlDeferringLoader を使用してこの遅延評価モデルを有効にします。 FuncFactoryDeferringLoader を使用すると、XamlReader をシリアル化中にキャプチャしてアクティビティの実行中に読み取ることができます。

アクティビティが適切に記述されていれば、スケジューラ スレッドはブロックされません。 ただし、ShowWindow アクティビティは、表示しているウィンドウが閉じられるまで完了できません。 ShowWindow アクティビティは、AsyncCodeActivity から派生して BeginInvoke メソッドを BeginExecute メソッドで呼び出し、ウィンドウをモーダルで表示することによってこの動作を実現します。 デリゲートは、WPF SynchronizationContext を介して呼び出されます。 ShowWindow アクティビティは、DataContext プロパティを Window.DataContext プロパティに割り当てて、データ バインド コントロールがスコープ内の変数にアクセスできるようにします。

このサンプルにおける最後の重要な点は、MarkupExtension という DelegateActivityExtension です。 このマークアップ拡張機能の ProvideValue メソッドは、埋め込みアクティビティを呼び出すデリゲートを返します。 このアクティビティは、WPF データ コンテキストおよびスコープ内の x:Name 値を含む環境で実行されます。 GenericInvoke メソッドで、この環境は SymbolResolver 拡張機能を介してアクティビティに提供されます。 この拡張機能は、マークアップ拡張機能のデリゲートが呼び出されるたびに埋め込みアクティビティを呼び出すために使用される WorkflowInvoker に追加されます。

注意

既定のデザイナーでは ShowWindow アクティビティはサポートされません。したがって、ShowWindow.Xaml ファイルはデザイナーでは正しく表示されません。

サンプルを実行する

  1. Visual Studio を使用して、WPFWFIntegration.sln ソリューション ファイルを開きます。

  2. ソリューションをビルドするには、Ctrl+Shift+B キーを押します。

  3. ソリューションを実行するには、F5 キーを押します。

  4. 姓と名をダイアログ ボックスに入力します。

  5. ダイアログ ボックスを閉じると、コンソールに名前がエコーされます。