Integração do WPF e do Windows Workflow Foundation em XAML
O exemplo WPFWFIntegration demonstra como criar um aplicativo que usa os recursos Windows Presentation Foundation (WPF) e Windows Workflow Foundation (WF) em um único documento XAML. Para fazer isso, o exemplo usa o Windows Workflow Foundation e a extensibilidade XAML.
Detalhes da amostra
O arquivo ShowWindow.xaml desserializa em uma Sequence atividade com duas variáveis de cadeia de caracteres que são manipuladas pelas atividades da sequência: ShowWindow
e WriteLine
. A WriteLine atividade produz para a janela do console a expressão que ela atribui à Text propriedade. A ShowWindow
atividade exibe uma janela WPF como parte de sua lógica de execução. O DataContext da janela inclui as variáveis declaradas na sequência. Os controles da janela declarada na ShowWindow
atividade usam a vinculação de dados para manipular essas variáveis. Finalmente, a janela contém um controle de botão. O Click
evento para o botão é manipulado por um ActivityDelegate nome MarkupExtension
que contém uma CloseWindow
atividade. MarkUpExtension
invoca a atividade contida que fornece, como contexto, quaisquer objetos identificados por um x:Name
, bem como o DataContext da janela que contém. Assim, o pode ser encadernado CloseWindow.InArgument<Window>
usando uma expressão que faz referência ao nome da janela.
A ShowWindow
atividade deriva da AsyncCodeActivity<TResult> classe para exibir uma janela WPF e é concluída quando a janela é fechada. A Window
propriedade é do tipo Func<Window>
que permite que a janela seja criada sob demanda para cada execução da atividade. A Window
propriedade usa a XamlDeferringLoader para habilitar esse modelo de avaliação adiada. O FuncFactoryDeferringLoader
permite que a XamlReader
seja capturado durante a serialização e, em seguida, lido durante a execução da atividade.
Uma atividade bem escrita nunca bloqueia o thread do agendador. No entanto, a ShowWindow
atividade não pode ser concluída até que a janela que está exibindo seja fechada. A ShowWindow
atividade alcança esse comportamento derivando de AsyncCodeActivity, chamando o BeginInvoke método no BeginExecute método e mostrando a janela modalmente. O delegado é invocado através do WPF SynchronizationContext. A ShowWindow
atividade atribui a DataContext propriedade à Window.DataContext
propriedade para fornecer qualquer acesso de controles ligados a dados às variáveis no escopo.
O último ponto de interesse nesta amostra é chamado MarkupExtensionDelegateActivityExtension
. O ProvideValue
método dessa extensão de marcação retorna um delegado que invoca uma atividade incorporada. Essa atividade é executada em um ambiente que inclui o contexto de dados do WPF e quaisquer x:Name
valores no escopo. GenericInvoke
No método, este ambiente é fornecido à atividade através de uma SymbolResolver extensão. Essa extensão é adicionada a um WorkflowInvoker que é usado para invocar a atividade incorporada sempre que o delegado da extensão de marcação é invocado.
Nota
O designer padrão não suporta a atividade ShowWindow; como tal, o arquivo ShowWindow.Xaml não é exibido corretamente no designer.
Executar o exemplo
Usando o Visual Studio, abra o arquivo de solução WPFWFIntegration.sln.
Para criar a solução, pressione Ctrl+Shift+B.
Para executar a solução, pressione F5.
Digite seu nome e sobrenome na caixa de diálogo.
Feche a caixa de diálogo e o console ecoará seu nome.