Freigeben über


WPF- und Windows Workflow Foundation-Integration in XAML

Im WPFWFIntegration-Beispiel wird veranschaulicht, wie Sie eine Anwendung erstellen, die Windows Presentation Foundation (WPF) und Windows Workflow Foundation (WF)-Features in einem einzelnen XAML-Dokument verwendet. Dazu verwendet das Beispiel die Erweiterbarkeit von Windows Workflow Foundation und XAML.

Beispieldetails

Die Datei ShowWindow.xaml wird in eine Sequence Aktivität mit zwei Zeichenfolgenvariablen deserialisiert, die von den Aktivitäten der Sequenz verändert 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 der Ausführungslogik an. Das DataContext Fenster enthält die variablen, die in der Sequenz deklariert sind. Die Steuerelemente des fensters, das in der ShowWindow Aktivität deklariert ist, verwenden die Datenbindung, um diese Variablen zu bearbeiten. Schließlich enthält das Fenster 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 Objekte bereitstellt, die von einem x:Name identifiziert werden, sowie das DataContext des enthaltenden Fensters. Daher kann die CloseWindow.InArgument<Window> Bindung mithilfe eines Ausdrucks erfolgen, der auf den Namen des Fensters verweist.

Die ShowWindow Aktivität wird von der AsyncCodeActivity<TResult> Klasse abgeleitet, um ein WPF-Fenster anzuzeigen und abzuschließen, wenn das Fenster geschlossen wird. Die Window Eigenschaft ist vom Typ Func<Window> , mit dem das Fenster bei Bedarf für jede Ausführung der Aktivität erstellt werden kann. Die Window-Eigenschaft verwendet ein XamlDeferringLoader, um dieses Modell der verzögerten Auswertung zu ermöglichen. Das FuncFactoryDeferringLoader ermöglicht es, ein XamlReader während der Serialisierung zu erfassen und dann während der Aktivitätsausführung zu lesen.

Eine gut geschriebene Aktivität blockiert niemals den Scheduler-Thread. Die ShowWindow Aktivität kann jedoch erst abgeschlossen werden, wenn das angezeigte Fenster geschlossen ist. Die ShowWindow-Aktivität erreicht dieses Verhalten, indem sie von AsyncCodeActivity abgeleitet wird, 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 interessante Punkt in diesem Beispiel ist ein MarkupExtension, genannt 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 enthält. In der GenericInvoke Methode wird diese Umgebung der Aktivität über 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 Standard-Designer unterstützt die ShowWindow-Aktivität nicht; die Datei "ShowWindow.Xaml" wird im Designer nicht ordnungsgemäß angezeigt.

Beispiel ausführen

  1. Öffnen Sie mit Visual Studio die WPFWFIntegration.sln Projektmappendatei.

  2. Um die Lösung zu erstellen, drücken Sie Strg+Umschalt+B.

  3. Drücken Sie F5, um die Lösung auszuführen.

  4. Geben Sie ihren Vor- und Nachnamen in das Dialogfeld ein.

  5. Schließen Sie das Dialogfeld, und die Konsole gibt Ihren Namen wieder.