WPFWFIntegration サンプルでは、単一の XAML ドキュメントで Windows Presentation Foundation (WPF) および Windows Workflow Foundation (WF) 機能を使用するアプリケーションを作成する方法を示します。 これを実現するために、このサンプルでは 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 ファイルがデザイナーに正しく表示されません。
サンプルを実行する
Visual Studio を使用して、WPFWFIntegration.sln ソリューション ファイルを開きます。
ソリューションをビルドするには、Ctrl++キーを押します。
ソリューションを実行するには、 F5 キーを押します。
ダイアログに姓と名を入力します。
ダイアログを閉じると、コンソールによって名前がエコーされます。
.NET