Integration von WPF und Windows Workflow Foundation in XAML

Das WPFWFIntegration-Beispiel veranschaulicht, wie eine Anwendung erstellt wird, die Features von Windows Presentation Foundation (WPF) und Windows Workflow Foundation (WF) in einem einzelnen XAML-Dokument verwendet. Hierfür werden in dem Beispiel Windows Workflow Foundation und XAML-Erweiterbarkeit verwendet.

Beispieldetails

Die Datei „ShowWindow.xaml“ führt eine Deserialisierung in eine Sequence-Aktivität mit zwei Zeichenfolgenvariablen durch, die von den Aktivitäten der Sequenz bearbeitet werden: ShowWindow und WriteLine. Die WriteLine-Aktivität gibt im Konsolenfenster den Ausdruck aus, den sie der Text-Eigenschaft zuweist. Die ShowWindow-Aktivität zeigt ein WPF-Fenster als Teil seiner Ausführungslogik an. Der DataContext des Fensters schließt die in der Sequenz deklarierten Variablen ein. Die Steuerelemente des Fensters, die in der ShowWindow-Aktivität deklariert wurden, bearbeiten diese Variablen mithilfe der Datenbindung. Das Fenster enthält außerdem ein Schaltflächensteuerelement. Das Click-Ereignis für die Schaltfläche wird durch einen ActivityDelegate behandelt, der als MarkupExtension bezeichnet wird und eine CloseWindow-Aktivität enthält. MarkUpExtension ruft die enthaltene Aktivität auf, die als Kontext alle durch x:Name gekennzeichneten Objekte sowie DataContext des enthaltenden Fensters bereitstellt. Das CloseWindow.InArgument<Window> kann daher mit einem Ausdruck gebunden werden, der einen Verweis auf den Namen des Fensters enthält.

Die ShowWindow-Aktivität wird von der AsyncCodeActivity<TResult>-Klasse abgeleitet, um ein WPF-Fenster anzuzeigen. Sie wird abgeschlossen, wenn das Fenster geschlossen wird. Die Window-Eigenschaft weist den Typ Func<Window> auf, durch den das Fenster bei jeder Ausführung der Aktivität bei Bedarf erstellt werden kann. Die Window-Eigenschaft verwendet einen XamlDeferringLoader zum Aktivieren dieses verzögerten Auswertungsmodells. Der FuncFactoryDeferringLoader ermöglicht, dass ein XamlReader während der Serialisierung erfasst und während der Ausführung der Aktivität gelesen wird.

Eine gut geschriebene Aktivität blockiert nie den Planerthread. Die ShowWindow-Aktivität kann jedoch erst dann abgeschlossen werden, wenn das Fenster, das sie anzeigt, geschlossen wird. Die ShowWindow-Aktivität erzielt dieses Verhalten, indem sie von AsyncCodeActivity ableitet, die BeginInvoke-Methode in der BeginExecute-Methode aufruft und das Fenster modal anzeigt. Der Delegat wird durch den SynchronizationContext von WPF aufgerufen. Die ShowWindow-Aktivität weist der DataContext-Eigenschaft die Window.DataContext-Eigenschaft zu, um datengebundenen Steuerelementezugriff auf die im Gültigkeitsbereich befindlichen Variablen zu gewähren.

Der letzte relevante Punkt in diesem Beispiel ist eine MarkupExtension mit dem Namen DelegateActivityExtension. Die ProvideValue-Methode dieser Markuperweiterung gibt einen Delegaten zurück, der eine eingebettete Aktivität aufruft. Diese Aktivität wird in einer Umgebung ausgeführt, die den WPF-Datenkontext und alle x:Name-Werte im Bereich einschließt. In der GenericInvoke-Methode wird diese Umgebung der Aktivität durch eine SymbolResolver-Erweiterung bereitgestellt. Diese Erweiterung wird einem WorkflowInvoker hinzugefügt, mit dem die eingebettete Aktivität immer dann aufgerufen wird, wenn der Delegat der Markuperweiterung aufgerufen wird.

Hinweis

Der Standarddesigner unterstützt die ShowWindow-Aktivität nicht. Die Datei ShowWindow.Xaml wird daher nicht ordnungsgemäß im Designer angezeigt.

Ausführen des Beispiels

  1. Öffnen Sie die Projektmappendatei „WPFWFIntegration.sln“ in Visual Studio.

  2. Drücken Sie STRG+UMSCHALT+B, um die Projektmappe zu erstellen.

  3. Drücken Sie F5, um die Projektmappe auszuführen.

  4. Geben Sie im Dialogfeld Ihren Vor- und Nachnamen ein.

  5. Schließen Sie das Dialogfeld, und die Konsole wiederholt den Namen.