次の方法で共有


XAML での WPF と Windows Workflow Foundation の統合

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

サンプルの詳細

ShowWindow.xaml ファイルは、シーケンスのアクティビティによって操作される 2 つの文字列変数 (SequenceShowWindow) を使用して、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++キーを押します。

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

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

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