Crie uma IU rica para seu aplicativo .NET com suporte a Windows Forms aprimorado
A Microsoft realmente deu uma tacada certa com o .NET Framework 1.0. Além de o .NET significar uma mudança fundamental na maneira como os desenvolvedores criam e distribuem aplicativos baseados em Windows®, ele criou uma plataforma de desenvolvimento ótima para escalonar recursos e ajustá-los para outros produtos. O Visual Studio® 2005 é um excelente exemplo, que funciona excepcionalmente bem com uma enorme variedade de novas e aprimoradas funcionalidades. O escopo dessas mudanças certamente abrange o subconjunto Windows Forms do Microsoft® .NET Framework, começando pelo System.Windows.Forms básico e se estendendo a uma ampla variedade de tecnologias de suporte, tanto novas como antigas, como implantação do ClickInce, ADO.NET e ObjectSpaces.
As melhorias na produtividade são encontradas em cada canto do Visual Studio 2005. Elas incluem aprimoramentos na IDE, nos data designers e controle e na geração de código. Os aficionados por códigos poderão ficar deprimidos com o tanto menos de código que precisará ser escrito para diferentes cenários, enquanto nós, comuns mortais, teremos mais tempo para rever filmes interessantes.
System.Windows.Forms
Foi feito um trabalho significativo no System.Windows.Forms, o coração pulsante de todas as tecnologias que compõem o Windows Forms. No momento em que escrevo este documento, as áreas de superfícies que podem ser usadas pelo namespace, que consistem em tipos e membros públicos, aumentaram em 67% e em 127%, respectivamente, indicando que o Visual Studio 2005 será definitivamente uma versão importante. Embora nós simplesmente não tenhamos espaço suficiente neste artigo para abordar todos os pontos, a Tabela 1 lhe dará uma visão geral das principais novas áreas de melhoria, bem como as inclusões e aprimoramentos feitos nelas, tais como melhor suporte a temas, data binding aprimorada e controle GridView.
Categoria | Descrição |
---|---|
Controles de layout | Controles de container SplitContainer, FlowLayout e TableLayout para gerenciamento de controles em tempo de design e em tempo de execução. |
Controles de layout | Controle GridView para processamento, navegação e apresentação aprimorada de dados tabulares. Controle DataContainer para simplificação do data binding, design de UI para vinculação de dados (data-bound), suporte a UI de estilo VCR nativo e suporte a UI master-detail. |
Blocos de construção de UI | O componente MainMenu agora suporta imagens de item de menu. O controle WinBar implementa uma faixa de ferramentas repleta de recursos, como a que você encontra no Microsoft Office. O controle WebBrowser é um wrapper de navegador Web gerenciado sobre a shdocvw.dll. |
Gerenciamento de controle e componente | O ControlArray retorna para fornecer uma única interface para o gerenciamento de vários controles, não necessariamente do mesmo tipo. ComponentArray é uma alternativa orientada a componentes ao ControlArray. |
Suporte a chamada assíncrona | O componente BackgroundWorker empacota a criação e gerenciamento de threads de trabalho (tecnicamente não no System.Windows.Forms, mas certamente uma necessidade no Windows Forms). Arquivo de som carregando no componente de som. Arquivo de imagem carregando no controle PictureBox. |
Melhorias gerais | Suporte ao recurso Autocompletion para os controles TextBox e ComboBox a partir de várias fontes/origens do sistema, incluindo histórico do Internet Explorer e Iniciar | Executar. Suporte à formatação da lista de itens usados mais recentemente para os controles ComboBox e ListBox. |
Suporte a temas Windows
Embora o processo de criação de um novo projeto Windows Forms não tenha sofrido modificações, o resultado dá origem a uma das primeiras modificações que você poderá notar: suporte padrão a temas do Windows (Windows themes). Um tema do Windows consiste em uma configuração de usuário no âmbito do shell que dita a aparência da interface de usuário (UI) do Windows. É possível especificá-lo clicando no botão direito na área de trabalho e, em seguida, clicando em Properties | Themes na caixa de diálogo Display Properties.
Como os temas do Windows são especificados pelo usuário, cabe aos aplicativos Windows Forms refleti-los. Os temas são suportados nas versões existentes do .NET, mas a versão 1.0 do .NET Framework requer que o desenvolvedor adicione um arquivo de manifesto nomeado especificamente a um local em particular no sistema de arquivos. O .NET Framework versão 1.1 simplifica o processo fornecendo o método Application.EnableVisualStyles para ativar o suporte e definindo a propriedade FlatStyle como "System" em cada controle que implementou o método. O Visual Studio 2005 aprimora ainda mais o processo, incluindo por padrão a chamada para EnableVisualStyles em um novo form padrão do projeto Windows Forms:
public class Form1 : System.Windows.Forms.Form {
•••
[STAThread]
static void Main() {
Application.EnableVisualStyles();
Application.Run(new Form1());
}
•••
}
Tradicionalmente, definir um FlatStyle do controle como System indica que o sistema operacional ditará como será a aparência do controle quando ele for processado. Agora, a maioria dos controles do Visual Studio 2005 será processada de acordo com o tema Windows em uso quando o FlatStyle for definido como o valor padrão de "Standard." Isso equivale semanticamente a uma configuração do System e, conseqüentemente, poupará o seu esforço de configurá-la no designer. Independentemente de FlatStyle ser Standard ou System, a vantagem para os desenvolvedores consiste na sensibilidade ao tema, incluindo suporte para responder dinamicamente a uma alteração de tema em tempo de execução sem que seja necessária uma única linha de código.
Configuração e layout de controle
O suporte a temas do Windows não exige nenhum esforço além de criar um projeto ou form e de arrastar os controles necessários até ele. No entanto, dispor os controles em um form e configurá-los pode ser um processo demorado, especialmente no caso de forms complexos. Para facilitar essa tarefa, o designer do Windows Forms oferece diversos novos recursos para abreviar o trabalho pesado em tempo de design, tais como Snap-To Alignment, Edit Properties Mode e smart tags, que podem ser acessadas no mesmo lugar do controle.
Embora ainda seja possível usar a barra de ferramentas Visual Studio Layout para alinhar os controles de forma horizontal e vertical, você só poderá fazer isso se eles estiverem dentro do form. Como alternativa, você pode usar Snap-To Alignment para conseguir os mesmos efeitos de arrastar e soltar os controles no form, evitando a barra de ferramentas Layout e o gasto de tempo de design associado a ela, incluindo seleção de controle e um clique no botão da barra de ferramentas. Snap-To Alignment consiste em uma ou mais linhas azuis “adesivas” que alinham os controles com outros controles mais próximos.
Outro novo recurso, Edit Properties Mode, permite que você navegue entre os controles e altere as propriedades deles diretamente na página. Para iniciar o Edit Properties Mode, selecione-o em qualquer menu de contexto do designer Windows Forms ou clique no item de menu correspondente. A próxima etapa é selecionar e percorrer cada propriedade, editando-as à medida que as acessa. O processo é ilustrado na Figura 1. Quando terminar, clique em "Return to Layout Mode" para retornar ao modo de edição normal. Definir uma propriedade consiste em uma maneira simples de alterar um controle. Substituir completamente um controle por outro mais relevante não é uma tarefa tão simples; você precisará excluir um controle existente, soltar o novo controle no form, e reconfigurá-lo. Tarefas de designer com várias etapas complexas como esta são perfeitas para o uso de smart tags, que consistem em tarefas de tempo de design empacotadas em uma única etapa e expostas na forma de um ícone de menu, ao lado do controle relacionado. As smart tags também expõem aquelas tarefas em tempo de design simples, mas que são executadas com freqüência, tais como definir uma propriedade Text de uma TextBox no momento em que ela é colocada no form.
Controles e data binding
Além das melhorias na IDE, o Windows Forms no Visual Studio 2005 oferece novos controles bem como aprimoramentos nos antigos, tais como TextBox e ComboBox. Como um exemplo de alguns dos novos e aprimorados controles em uso, a Figura 2 mostra o UberBrowser, criado com muito menos código do que teria sido necessário nas versões anteriores do Windows Forms.
Este exemplo simples demonstra como a toolbox aprimorada no Visual Studio 2005 permite que você crie mais com menos. Por exemplo, o UberBrowser amplamente funcional levou aproximadamente 10 minutos para ser criado e exigiu apenas 85 linhas de código para conectar a gama tradicional de eventos de navegação da Web e para implementar o histórico de navegação da URL. O verdadeiro trabalho de navegação Web e da renderização HTML é realizado pelo controle WebBrowser no painel direito. A barra de divisão e os painéis esquerdo e direito são fornecidos por um único SplitContainer.
A ComboBox, conforme mostrada na Figura 2, ostenta um novo suporte a autocompletion. O autocompletion é implementado através de três propriedades, começando pela AutoCompleteMode, que permite que você defina o estilo autocompletion a partir de uma enumeração do mesmo nome:
enum AutoCompleteMode {
None = 0x0, // Não há autocompletion
AutoSuggest = 0x1, // Correspondências possíveis escolhidas na lista drop-down
AutoAppend = 0x2, // Correspondências possíveis
// anexadas ao texto
// durante a digitação
AutoSuggestAppend = 0x3 // AutoSuggest e
// AutoAppend combinados
}
Uma opção diferente de "None" requer que você defina a propriedade AutoCompleteSource como uma das diversas origens (fontes) de autocompletion do sistema que foram especificadas pela enumeração AutoCompleteSource:
enum AutoCompleteSource {
FileSystem = 0x1, // Sistema de arquivos
HistoryList = 0x2, // Todas as URLs da lista de histórico
RecentlyUsedList = 0x4, // Todas as URLs da lista de URLs usadas recentemente
AllURL = 0x6, // HistoryList + RecentlyUsedList
AllSystemSources = 0x7, // FileSystem + AllURL
CustomSource = 0x40, // AutoCompleteCustomSource
None = 0x80 // Nenhuma origem (fonte)
}
CustomSource informa à ComboBox que você fornecerá opções de autocompletion a partir de uma coleção de itens armazenados na propriedade AutoCompleteCustomSource. Atualmente, a ComboBox e a TextBox são os únicos controles que oferecem autocompletion.
O GridView
A maioria dos controles na Toolbox oferece suporte a data binding para uma fonte de dados arbitrária através de uma infra-estrutura de data-binding nativa. Em diversos cenários, particularmente, prototipação e desenvolvimento RAD, o data binding é crítico. A equipe do Windows Forms melhorou dramaticamente o espaço de data-binding com aprimoramentos nos DataSets tipados, novos controles como o GridView e o DataContainer, e suporte em tempo de desenvolvimento mais completo para um desenvolvimento mais rápido. Esses recursos permitem que você crie, com a mesma facilidade, uma UI do estilo tabular ou de campos.
Às vezes uma UI em estilo tabular é mais apropriada para apresentar e processar dados vinculados e, por isso, a Microsoft incluiu o controle DataGrid nas versões anteriores do .NET Framework. No Visual Studio 2005, a equipe do Windows Forms respondeu aos feedbacks da comunidade sobre o DataGrid e decidiu construir um novo controle grid, o System.Windows.Forms.GridView (consulte a Figura 3).
A diferença mais gritante entre o DataGrid e o GridView é o modelo de objeto GridView, que foi resumido em uma estrutura de grade natural criada sobre colunas, linhas e células e que permite aos desenvolvedores pesquisar em milhares de funcionalidades localizadas de forma intuitiva, tais como:
- Suporte à personalização de Rich UI através de estilos, formatação, layout e seleção de item
- A capacidade de exibir nativamente uma variedade de dados mais ampla do que o permitido no DataGrid, através de um conjunto mais completo de tipos de coluna, incluindo imagens
- Recursos atraentes como colunas congeladas (frozen columns), como no Microsoft Excel, e reorganização de colunas em tempo de execução (como no Microsoft Outlook®)
- Mais de 100 eventos para controle granular sobre navegação, edição, validação, custom painting e tratamento de erros
Combinado a uma experiência em tempo de design abrangente, esse rico conjunto de recursos suporta personalização rápida com menos dependência de código — em alguns casos, devido à inclusão dos cenários de codificação de DataGrid comuns nos eventos, propriedades e métodos do GridView nativos. Um exemplo é a seleção de linha com um clique na célula, que é agora exposta pelo GridView como a propriedade SelectionMode. É claro, nenhum controle pode satisfazer totalmente a todos os usuários. Quando eles não forem suficientes, os desenvolvedores podem contar com a extensibilidade para incorporar os recursos personalizados. A infra-estrutura do GridView também não desaponta, e conta com uma variedade de implementações básicas de coluna, célula e linha, das quais você pode derivar ou se vincular a. O resultado geral do GridView é um controle mais tentador do que o DataGrid.
DataSets tipados
O controle GridView pertence a uma família de controles que podem ser vinculados a fonte de dados como arrays, coleções e DataSets tipados. A vantagem dos DataSets tipados é que o sistema interno do .NET Framework permite que os controles sejam vinculados dentro do designer para ajudar os desenvolvedores a visualizar a UI em tempo de design. O GridView oferece suporte a este recurso por meio da autogeração de uma coluna para cada campo na fonte de dados em tempo de design. O Visual Studio 2005 aprimora os DataSets tipados para tornar a sua vida mais simples. Você gastará menos tempo no designer, já que, agora, os DataSets tipados decifram totalmente os metadados da fonte e incluem restrições de chave estrangeira e valores iniciais e passos de incrementos automáticos, conforme mostrado na Figura 4.
O designer também gera uma consulta Fill, que encobre a linha da instrução SELECT da tabela e é implementada na forma de um método do mesmo nome no DataSet tipado. Às vezes, as instruções SELECT, INSERT, UPDATE e DELETE que você especifica inicialmente não são úteis em todas as situações. Por exemplo, o método Fill retornará todos os Employees (Funcionários), embora você às vezes deseje retornar apenas um funcionário. Neste tipo de situação, fará mais sentido você usar a mesma tabela e preenchê-la com uma consulta mais específica. O designer do DataSet tipado favorece ao permitir que você adicione suas próprias consultas a partir do menu de contexto da tabela apropriada, selecionando Add | Query no menu de contexto da tabela.
A caixa de diálogo "DbTable Query Wizard" se abre para ajudar você a construir sua consulta e, em seguida, ela é atualizada com os novos dados. Quando você completa a configuração de um DataSet tipado, você geralmente o vincula a um ou mais controles na interface do usuário. No Visual Studio 2005, os DataSets tipados podem ser vinculados diretamente aos controles que implementam as propriedades DataSource e DataMember, sem necessidade de adicionar um DataSet ao form.
DefaultInstance
Qualquer pessoa que tenha feito uso intenso dos DataSets tipados sabe que, em geral, cada nova classe DataSet tipada é usada no lugar de um aplicativo. Como a equipe do Windows Forms sabe disso e quer facilitar nossa vida, eles incluíram uma propriedade estática, denominada DefaultInstance, em cada classe DataSet tipada gerada a fim de alojar aquela única instância. Ela é implementada desta forma:
public static EmployeeTDS DefaultInstance {
get {
if (_defaultInstance == null) {
_defaultInstance = new Northwind();
}
return _defaultInstance;
}
}
Você usa a propriedade DefaultInstance desta maneira:
public class Form1 :
System.Windows.Forms.Form {
•••
private void Form1_Load(
object sender, System.EventArgs e) {
// Carregue os dados
EmployeeTDS.DefaultInstance.LoadData();
}
•••
}
Os controles databound definem suas propriedades DataSource com o nome do tipo da instância padrão, que é por padrão ProjectNamespace.TypedDataSetName, enquanto o processo subsequente de especificar um DataMember permanece inalterado.
Controle DataContainer
O controle GridView é um exemplo de um controle de vinculação complexo, o que significa que ele sabe como gerenciar o data binding para oferecer suporte a navegação, inserções, atualizações e exclusões. Por outro lado, os controles de vinculação simples não sabem disso e exigem que você implemente suporte equivalente por meio do gerenciador de vinculação da fonte de dados, geralmente com uma interface de usuário de estilo VCR. Você deve usar controles de vinculação simples quando preferir apresentar os dados de estilo de lista como um conjunto de campos, em vez de como uma grid. Essa abordagem requer que você adicione manualmente os campos ao form, como um conjunto de controles apropriados, tais como Labels e TextBoxes, resultando em algo semelhante ao que é mostrado na Figura 5.
Embora você possa implementar esses tipos de Details Forms à mão, no Visual Studio 2005 é possível implementá-los automaticamente com um DataContainer vinculado a um DataSet tipado. Simplesmente selecione o item de menu Details Form na smart tag do DataContainer.
Esse recurso gerará automaticamente todos os campos a partir da fonte de dados selecionada. Além disso, o DataContainer carregará e salvará os dados e adicionará uma navegação e edição de estilo VCR por padrão, sem escrever nenhum código. O resultado é mostrado na Figura 6.
Se os seus requisitos de UI mudarem e um estilo de UI tabular for mais apropriado, você poderá usar o DataContainer para fazer o trabalho pesado de alterar a UI, selecionando a opção apropriada na smart tag do DataContainer. O designer removerá todos os controles existentes e os substituirá por um único DataGrid (embora nas futuras versões do Visual Studio ele será muito provavelmente um GridView).
Vinculação Master-detail
O DataContainer multifuncional também consiste em uma excelente ferramenta para criar UIs master-details, que permitem uma visualização baseada em Forms das relações um-para-muitos usadas nos bancos de dados relacionais. Um exemplo é a relação Employees-Orders, que é corretamente configurada para você por meio da simples adição da tabela Orders aos dados tipados.
Como já temos a UI principal gerada (mostrada na Figura 6), tudo que precisamos agora é arrastar um GridView para o form, definir o DataSource como o DataContainer e a propriedade DataMember como a relação Orders-OrderDetails (neste caso, FK_Orders_Employees), o que resultará na Figura 7.
Implantação do ClickOnce
Quando finalmente tiver todos os controles de que necessita em seus forms e o código necessário para fazê-los trabalhar juntos, você terá um aplicativo pronto, mas ainda precisará implantá-lo. Implantar um aplicativo Windows Forms de âmbito corporativo em uma base de tamanho não-trivial pode representar um desafio tanto de controle de versão como de instalação, e os desenvolvedores de gerações mais antigas ficaram mais do que felizes por trocar UIs Windows ricas para aplicativos Web e ganhar os benefícios de implantação correspondentes.
Com o .NET, a Microsoft deu início ao processo de criação de uma infra-estrutura que permitisse que os aplicativos Windows Forms fossem implantados com a mesma facilidade dos aplicativos ASP.NET. Antes do Visual Studio 2005, o .NET Framework suportava implantação no-touch, que permitisse que os aplicativos Windows Forms fossem implantados a partir de um URL ou de um caminho de arquivo UNC (Universal Naming Convention) e executado dentro de uma sandbox controlada por CAS (code access security) na máquina cliente. A implantação no-touch evoluiu em uma implantação ClickOnce no Visual Studio 2005, incorporando vários novos recursos ao longo do caminho para oferecer aos desenvolvedores Windows Forms uma infra-estrutura de implantação tão ágil quando a dos aplicativos Web. Especificamente, o ClickOnce oferece suporte aprimorado para envio de aplicativo, controle de versão e roollback, maior controle sobre instalação de aplicativo no lado cliente, elevação de permissão e suporte à configuração em tempo de design, tudo incluído na estrutura do Visual Studio.
Configurando a Implantação do ClickOnce
Em tempo de design, é possível configurar a implantação do ClickOnce através do Visual Studio 2005 a partir da página de propriedades Publish de uma Configuration Properties do projeto. Dependendo de sua infra-estrutura e base de usuário, diferentes fontes de implantação (servidores de arquivo, servidores Web ou servidores FTP) farão sentido em diferentes cenários. A implantação do ClickOnce permite que você especifique em qual deles (e a partir de qual deles) seu aplicativo será publicado, bem como o mecanismo por meio do qual ele será instalado (por exemplo, através de uma página da Web). A instalação também poderá ser controlada configurando-se se o aplicativo está fisicamente instalado na máquina cliente. Caso ele esteja instalado no cliente, você poderá então estipular se o aplicativo deve procurar por atualizações antes de carregar ou à medida que for executado, com que freqüência ele deve fazê-lo e impor as atualizações exigidas — uma opção útil para implantar atualizações críticas. Também é possível especificar os pré-requisitos do aplicativo, sendo o mais provável o .NET Framework propriamente dito. Também é possível definir várias opções de segurança a partir da página Security property.
No que se refere à publicação, você poderá criar e publicar o aplicativo em uma única etapa apenas clicando em Project | Publish Project, que executará as duas ações. O processo de publicação é gerenciado pelo Publishing Wizard, que basicamente revisita as suas definições de segurança da publicação e permite que você as altere a cada publicação. O último form no processo de publicação apresenta uma lista que confirma suas escolhas e lhe oferece a opção de publicar o aplicativo ou retornar e alterar as definições. Em seguida, o Publishing Wizard decreta suas escolhas e publica o aplicativo conforme solicitado.
Implantação
A implantação começa quando o usuário navega até a página Web de implantação e clica no hyperlink apropriado para os pré-requisitos e/ou o aplicativo. O link do aplicativo leva a um arquivo .deploy, em vez do executável do aplicativo propriamente dito. O arquivo .deploy é um dos dois manifestos exigidos pela implantação do ClickOnce que especifica os requisitos da atualização e a implantação do aplicativo. O segundo arquivo, .manifest, especifica os arquivos exigidos pelo aplicativo para ser executado. Ele é o equivalente semântico de um manifesto de assembly. Ambos os arquivos (.deploy e .manifest) são processados na máquina cliente pelo serviço de implantação do ClickOnce, System.DeploymentFramework.Service.exe. Esse serviço é instalado com o .NET Framework e é iniciado na primeira vez que o arquivo .deploy é solicitado. Embora o usuário não veja nenhuma dessa atividade no background, ele recebe uma caixa de diálogo para que confirme o download. Uma vez concluído o download, o aplicativo real será carregado e começará a ser executado a partir do AppHost.exe. O aplicativo será armazenado em um cache local a não ser que você especifique uma instalação fora do lado cliente. Embora as chamadas de aplicativo subseqüentes irão precisar sempre do arquivo .deploy, o aplicativo será executado no cache local até que o arquivo .debug especifique que existe uma nova versão disponível no servidor.
Se os requisitos de segurança do aplicativo forem maiores do que os configurados para a zona a partir da qual ele estiver sendo executado (por exemplo, Internet ou intranet), o ClickOnce fornecerá ao usuário a oportunidade de elevar as permissões do aplicativo até o nível solicitado, de modo a assegurar uma execução correta. Caso contrário, o aplicativo jamais será iniciado.
Controle de versão e reversão do ClickOnce
Se necessário, será adicionado um ícone ao menu Iniciar e uma entrada ao Painel de Controle | Adicionar/Remover Programas. Em Adicionar/Remover Programas, você poderá desinstalar totalmente o aplicativo ou revertê-lo para a versão anterior (se houver uma). O controle de versão do ClickOnce depende dos números de versão que você especificar para seu aplicativo por meio do AssemblyVersionAttribute, que será automaticamente gerado para o arquivo AssemblyInfo.cs de cada projeto Windows Forms. Ele se parece com isto:
[assembly: AssemblyVersion("1.0.*")]
O número da versão é usado para determinar quando uma nova versão estará pronta para download. Ele também é usado para nomear tanto a pasta de implantação quanto como a pasta de cache no lado cliente, na qual reside o aplicativo. A convenção de nomeação para ambas as pastas é ApplicationName_major#.minor#.build#.revision#.
A implantação do ClickOnce é uma tecnologia poderosa, que oferece muito mais benefícios do que é possível descrever neste artigo. No entanto, a principal motivação para o uso do ClickOnce é a facilidade de implantação, instalação e controle de versão de seus aplicativos Windows Forms.
Conclusão
Ao considerar o grande número de novos recursos no Visual Studio 2005, você perceberá que estamos apenas começando a discutir a ampla variedade de tecnologias que serão usadas no desenvolvimento em Windows Forms. Elas incluem melhorias no ADO.NET e suporte a uma maneira totalmente nova de acessar dados relacionais através de mapeamento objeto-relacional com os novíssimos ObjectSpaces. O que nós fizemos aqui foi dar um gostinho dos mais importantes novos recursos e explicar o aumento de produtividade por eles proporcionados, começando pelas melhorias na IDE e no designer do Visual Studio e passando aos controles melhorados das versões anteriores, como o TextBox e o ComboBox, ou apenas aos novos, como o GridView e o WinBar. Os controles GridView e DataContainer, juntamente com as melhorias do DataSet tipado, ajudarão você a incorporar uma apresentação de dados mais rica e a processá-la em seus aplicativos mais rapidamente.
Por fim, a implantação do ClickOnce simplifica todo o processo de implantação do Windows Forms, ao mesmo tempo em que oferece recursos de implantação comparáveis aos instaladores tradicionais.