WPF: Startup, StartupUri, Application_Startup, MainWindow, ShutdownMode
Esta dica de WPF, daria quase um artigo completo, pois ela ficou muito extensa. Contudo, o conteúdo abordado é formado por tópicos relacionados aos processos de inicialização e finalização de uma aplicação WPF que precisam ser compreendidos pelos desenvolvedores. Nas aplicações WindowsForms, tínhamos o método Main() da classe Program onde inseríamos nosso código para inicialização da nossa aplicação. As aplicações WPF possuem o arquivo App.xaml, que contém a propriedade StartupUri que pode ser utilizada para indicarmos o objeto que será carregado quando a aplicação for executada. Esta propriedade é definida automaticamente quando você cria um novo projeto WPF Application, nela o nome do objeto Window1.xaml é colocado (veja a Figura 1).

Podemos atribuir o nome de qualquer objeto da aplicação à propriedade StartupUri. Você pode defini-la através da linguagem declarativa XAML como mostrado na Figura 1, ou programaticamente, como mostra a Figura 2 logo abaixo.

A propriedade StartupUri atende é prática em alguns cenários, mas quando consideramos o desenvolvimento de uma aplicação comercial, os processos de inicialização, em geral, implementam outras instruções, instanciam objetos, verificam configurações entre outras ações. Neste caso, o evento Startup é a solução mais adequada, através deste evento podemos implementar nosso código de inicialização. Para utilizar este evento, no arquivo App.xaml, o desenvolvedor deve remover a propriedade StartupUri e substituí-la pelo evento Startup, o próprio IntelliSense auxilia o desenvolvedor criando a estrutura do novo procedimento de evento. Veja a Figura 3.


O nome padrão “Application_Startup” dado a este procedimento de evento pode ser alterado de acordo com o gosto do desenvolvedor. Você pode criar um procedimento com um nome qualquer, por exemplo, MinhaAplicacao_Startup e atribuir este nome ao evento Startup no arquivo App.xaml. Abaixo a Figura 4 mostra o código deste procedimento de evento.

Observe a Linha 18 em destaque na Figura 4. A propriedade MainWindow foi carregada com a instância do objeto Window1. Esta propriedade trabalha em conjunto com outra propriedade das aplicações WPF, a propriedade ShutdownMode. Juntas, essas duas propriedades definem o modo de finalização da sua aplicação WPF. A propriedade MainWindow, como padrão, sempre é carregada com o primeiro objeto Window instanciado pela aplicação, mas o desenvolvedor pode atribuir uma nova janela para esta propriedade a qualquer momento, usando o mesmo código apresentado na Linha 18 da Figura 4.
A definição do modo de finalização (ShutdownMode) é importante pois as aplicações WPF, diferentemente das aplicações WindowsForms, não possuem formulários do tipo MDI (Multiple Document Interface), e o desenvolvedor precisa tratar o processo de encerramento da sua aplicação, o que pode ser feito explicitamente, definindo o ShutdownMode como OnExplicitShutdown, neste caso seria necessário implementar um procedimento para finalizar a aplicação, ou ainda, o desenvolvedor poderia optar pelos dois outros modos disponíveis: OnLastWindowClose que faria com que a aplicação fosse finalizada no momento em que o usuário fechasse todas as janelas abertas, e o modo OnMainWindowClose, mais adequado para implementação do modelo MDI, neste caso, quando a janela definida como MainWindow for fechada, a aplicação será finalizada. Veja a Figura 5 que mostra a enumeração da propriedade ShutdownMode.

O fato das aplicações WPF não possuírem um formulário do tipo MDI, não significa que as novas aplicações não utilizarão este modelo, passaremos a utilizar novos conceitos de aplicações MDI, como por exemplo, a interface dos aplicativos do Microsoft Office ou mesmo o Visual Studio que organizam diversos documentos utilizando guias ou controles do tipo container. A Figura 6 apresenta a interface de uma aplicação comercial, criada com WPF, e que utiliza o conceito de MDI implementado com o auxilio de um controle TabControl e OutlookBar.
