Integrazione di WPF e Windows Workflow Foundation in XAML

L'esempio WPFWFIntegration dimostra come creare un'applicazione che usa le funzionalità di Windows Presentation Foundation (WPF) e Windows Workflow Foundation (WF) in un singolo documento XAML. A questo scopo, l'esempio usa Windows Workflow Foundation e l'estendibilità XAML.

Dettagli dell'esempio

Il file ShowWindow.xaml viene deserializzato in un'attività Sequence con due variabili stringa modificate dalle attività della sequenza: ShowWindow e WriteLine. L'attività WriteLine invia come output alla finestra della console l'espressione che assegna alla proprietà Text. L'attività ShowWindow visualizza una finestra WPF come parte della relativa logica di esecuzione. La proprietà DataContext della finestra include le variabili dichiarate nella sequenza. I controlli della finestra dichiarati nell'attività ShowWindow usano l'associazione dati per modificare tali variabili. Infine, nella finestra è contenuto un controllo pulsante. L'evento Click per il pulsante viene gestito da un oggetto ActivityDelegate denominato MarkupExtension che contiene un'attività CloseWindow. MarkUpExtension richiama l'attività esterna che fornisce come contesto tutti gli oggetti identificati da un oggetto x:Name nonché l'oggetto DataContext della finestra contenitore. Pertanto, l'oggetto CloseWindow.InArgument<Window> può essere associato usando un'espressione che fa riferimento al nome della finestra.

L'attività ShowWindow deriva dalla classe AsyncCodeActivity<TResult> per visualizzare una finestra WPF e viene completata quando la finestra viene chiusa. La proprietà Window è di tipo Func<Window>, il quale consente la creazione della finestra su richiesta per ogni esecuzione dell'attività. La proprietà Window usa un oggetto XamlDeferringLoader per abilitare questo modello di valutazione posticipato. L'oggetto FuncFactoryDeferringLoader consente di acquisire un oggetto XamlReader durante la serializzazione e di leggerlo durante l'esecuzione di attività.

Un'attività scritta in modo corretto non blocca mai il thread dell'utilità di pianificazione. Tuttavia, l'attività ShowWindow non può essere completata finché non viene chiusa la finestra in corso di visualizzazione. L'attività ShowWindow realizza questo comportamento derivando dall'oggetto AsyncCodeActivity, chiamando il metodo BeginInvoke nel metodo BeginExecute e visualizzando come modale la finestra. Il delegato viene richiamato tramite la proprietà SynchronizationContext di WPF. L'attività ShowWindow assegna la proprietà DataContext alla proprietà Window.DataContext per fornire qualsiasi accesso ai controlli associati a dati alle variabili dell'ambito.

L'ultimo punto di interesse di questo esempio è un oggetto MarkupExtension denominato DelegateActivityExtension. Il metodo ProvideValue di questa estensione di markup restituisce un delegato che richiama un'attività incorporata. Questa attività viene eseguita in un ambiente che include il contesto dei dati WPF e qualsiasi valore x:Name nell'ambito. Nel metodo GenericInvoke, questo ambiente viene fornito all'attività tramite un'estensione SymbolResolver. Questa estensione viene aggiunta a un oggetto WorkflowInvoker che viene quindi usato per richiamare l'attività incorporata ogni volta che viene richiamato il delegato dell'estensione di markup.

Nota

La finestra di progettazione predefinita non supporta l'attività ShowWindow; pertanto, il file ShowWindow.Xaml non viene visualizzato correttamente nella finestra di progettazione.

Eseguire l'esempio

  1. In Visual Studio aprire il file di soluzione WPFWFIntegration.sln.

  2. Per compilare la soluzione, premere CTRL+MAIUSC+B.

  3. Per eseguire la soluzione, premere F5.

  4. Digitare il proprio nome e cognome nella finestra di dialogo.

  5. Chiudere la finestra di dialogo; la console restituirà il nome.