quarta-feira, 14 de setembro de 2011

Visual Studio 11 e .NET Framework 4.5 Developer Preview

Com o lançamento do Windows 8 Developer Previewbuild_logo ontem no evento //Build/ Windows a Microsoft mostrou porque é a número um em sistemas operacionais.

Mas um sistema operacional não é nada sem aplicativos e, diga-se de passagem, o Windows 8 já tem sua plataforma de desenvolvimento bem amparada.

É que junto com o lançamento a Microsoft também disponibilizou uma versão Preview do Visual Studio 11 e do .NET Framework 4.5.

Ainda é cedo para tirar conclusões e se tratando de uma versão Preview (pré beta) existem possibilidades de mudanças. A documentação da MSDN ainda não está 100% consistente, alguns links fazem referência a novidades do atual Framework 4 e é fácil se perder no que é novo ou não.

Mesmo assim acho que vale a pena dar um conferida. Então seguem os links interessantes:

Enjoy

domingo, 28 de agosto de 2011

WebClient com Timeout

Algum tempo atrás iniciei um projeto que precisava fazer requisições HTTP para páginas Web e tratar seu resultado. Dentre as alternativas para isso resolvi escolher o WebClient por ser bem simples e resolver o problema que eu tinha em mãos de forma bem prática.

WebClient client = new WebClient(); string reply = client.DownloadString("[Url]"); Console.WriteLine(reply);

Este classe conta também com vários métodos para tratamento de forma assíncrona bem como suporte a comandos menos comuns como STOR (utilizado em FTP).

Mas nem tudo deu tão certo. Durante o desenvolvimento acabei verificando que o site em questão podia demorar bastante tempo para responder e que esse era um comportamento padrão do mesmo. Ou seja, eu teria que tratar isto de alguma forma, esperando mais tempo pelo resultado da requisição HTTP.

Nesse momento praticamente me vi forçado a utilizar classes mais complexas como as derivadas de WebRequest e WebResponse por causa da falta de suporte a definição do tempo de Timeout na classe WebClient.

Resolvi dar mais uma espiada na 50355_154915967879761_4814825_ndocumentação do MSDN e vi que poderia resolver isso de forma bem fácil graças a orientação a objetos.

Bastou herdar a classe WebClient e fazer um override do método protected GetWebRequest. Ali mesmo pude definir o meu timeout. Basicamente assim:

protected override WebRequest GetWebRequest(Uri address) { var request = base.GetWebRequest(address); request.Timeout = 60;//Timeout que quiser. return request; }

Claro que esta é apenas uma amostra do que pode ser feito, mas num caso real é apropriado colocar este valor em uma propriedade ou até mesmo definir no construtor da sua classe. Minha implementação completa pode ser encontrada neste link: WebClientExtended.

Enjoy

domingo, 20 de fevereiro de 2011

Recursos do Windows 7 para WPF

Com a chegada do Windows 7 vários novos recursos foram disponibilizados aos desenvolvedores. Preview da janela,Aero Peak botões de controle na barra de tarefas e notificações diretamente no ícone.
Logo no lançamento do Windows 7 era bastante complicado, se perdia muito tempo aprendendo as novas API do SDK com wrappers para o WPF. Realmente perdíamos bastante tempo mesmo que fosse apenas pra colocar um botão no Preview da barra de tarefas.
Com a chegada do WPF 4 isso tudo ficou muito mais fácil. Através da propriedade TaskbarItemInfo da Window podemos ter acesso a esta grande API do Windows 7 e aprimorar ainda mais a experiência do usuário.
TaskbarItemInfo
Esta propriedade permite que possamos interagir com o ícone da nossa aplicação na barra de tarefas. As seguintes propriedades nos proporcionam essa facilidade:
  • Description: Descrição que aparecerá acima do Preview do Aero Peak.
  • Overlay: Define uma imagem que aparecerá na mesma posição do ícone da barra de tarefas. Isso nos permite mostrar informações mesmo quando a aplicação está no plano de fundo e o usuário está executando outras ações em outros programas.
  • ThumbnailClipMargin: Se não quisermos mostrar no Aero PeakPreview parcial do Video Player a visualização completa de nossa aplicação podemos definir através dessa propriedade qual parte deve ser mostrada no Preview.
    • ProgressState: Indica o estado da aplicação. Podemos definirVisual Studio após carregar um projeto esta propriedade de modo que avise o usuário que está sendo processada uma tarefa em tempo indeterminado, que ocorreu um erro ou a aplicação está parada e requer sua atenção.
    • ProgressValue: Utilizada quando se sabe o progresso de umaProgresso de Download no Internet Explorer atividade e se quer mostrar na barra de tarefas. É muito semelhante a um ProgressBar que não esteja sendo utilizado como Indeterminate.
    • ThumbButtonInfos: Aqui podemos colocar vários botões que,Botões de controle do Media Player através do Aero Peak, façam com que o usuário interaja com a aplicação mesmo ela estando no plano de fundo. Podem ser visualizados até 7 botões ao mesmo tempo.
    Fiz uma pequena aplicação conceito para aplicar tudo isso.Video Player Criei um Video Player que busca um vídeo via Streaming do Channel9. Utilizei o TaskbarItemInfo da seguinte forma:
    • Utilizei a barra de progresso na barra de tarefas para mostrar enquanto ainda está sendo feito buffer do vídeo.
    • Quando o vídeo começar a rodar coloco um Overlay na barra de tarefas semelhante a um botão Play.
    • Defini que no Preview do Aero Peak só mostraria a parte do vídeo e não os controles.
    • Adicionei um botão para fechar diretamente no Preview (eu sei, é redundante, mas é só pra mostrar o conceito).
    Para adicionar toda essa funcionalidade a minha aplicação não levei mais do que alguns minutos. Demora mais pra achar imagens legais e tal. Mas acho que deu pra entender a ideia. O XAML que tive que adicionar é o seguinte:
    <Window.TaskbarItemInfo> <TaskbarItemInfo x:Name="StatusTaskbarItemInfo" ProgressState="Indeterminate" Description="Video Player" ThumbnailClipMargin="15,54,17,75"> <TaskbarItemInfo.ThumbButtonInfos> <ThumbButtonInfo Description="Fechar" Click="ThumbButtonInfo_Click" ImageSource="...sua imagem aqui..."> </ThumbButtonInfo> </TaskbarItemInfo.ThumbButtonInfos> </TaskbarItemInfo> </Window.TaskbarItemInfo>
    O código do exemplo bem como uma aplicação pronta (ClickOnce) pode ser encontrados aqui.
    Enjoy

    domingo, 23 de janeiro de 2011

    WPF com Splash Screen

    Desde sempre estamos acostumados a aplicações que precisam de um tempo de espera relativamente grande para iniciar. Isso aconteceu e ainda acontece com aplicações WIN32 que ao iniciarem precisam de uma grande quantidade de arquivos carregados na memória.

    Já se foi o tempo onde o .NET era muito lento para carregar. Época em que tínhamos computadores com menos de 1GB de RAM e apenas um processador e núcleo com menos de 1GHz. Não me refiro a aplicação rodando mas sim o tempo que demorava para carregar na memória as DLL do Framework e aplicação num Cold Start. Mas mesmo assim, hoje ainda não é instantâneo.

    Uma solução que aumenta a experiência do usuário éSplash Screen do Windows Live Writer a utilização de um Splash Screen, efeito muito utilizado por vários tipos de aplicações: Adobe Photoshop, NetBeans, Visual Studio, Windows Live Writer são alguns exemplos.

    Hoje vou mostrar como colocar um Splash Screen Splash Screen do Visual Studio 2010no WPF fazendo com a resposta ao usuário ao chamar a aplicação seja praticamente imediata.

    Desde a versão do Framework 3.5 SP1 existem 3 opções para se criar um Splash Screen no WPF. Em todas elas devemos lembrar que as imagens deve ser suportadas pelo Windows Imaging Component (WIC) e isso inclui: BMP, GIF, JPEG, PNG e TIFF.

    Se você utilizar uma imagem PNG com transparência ela será mostrada no Splash Screen com transparência. Se utilizar um GIF animado só será mostrado o primeiro frame.

    Opção 1: Adicionando o item SplashScreen

    Com certeza esta é a opção mais simples.

    • No menu de contexto do seu projeto selecione a opção Add e depois New Item.
    • Selecione o item SplashScreen (WPF) e escolha um nome para o mesmo.
    • Rode a aplicação e veja como ficou a imagem padrão de Splash Screen.
    Opção 2: Utilizando uma imagem com Build Action SplashScreen

    A segunda opção não consiste em algo tão mais complexo do que o item SplashScreen, na verdade se utiliza o mesmo recurso utilizado por ele, uma imagem que tem definido seu Build Action como SplashScreen.

    • No menu de contexto do seu projeto selecione a opção Add e depois Existing Item.
    • Selecione uma imagem que queira que apareça enquanto a sua aplicação está fazendo o carregamento mais pesado.
    • Vá na aba das propriedades desta imagem e configure o Build Action para SplashScreen.
    • Rode a aplicação e veja como ficou a imagem selecionada como Splash Screen da sua aplicação.
    Opção 3:Utilizando as APIs de SplashScreen

    Podemos utilizar a API de SplashScreen através da classe de mesmo nome.

    Não existem passos mágicos a seguir, apenas devemos prestar atenção que a imagem que quisermos utilizar deve ter seu Build Action configurado para Resource.

    public partial class MainWindow : Window { public MainWindow() { var splash = new SplashScreen("Splash.png"); splash.Show(false); splash.Close(TimeSpan.FromSeconds(3)); InitializeComponent(); } }

    Como podemos ver, basta instanciar a classesplash SplashScreen passando o caminho do Resource.

    Depois chamamos o método Show para mostrar a imagem e informamos que a mesma não deverá ser fechada automaticamente.

    Por fim definimos através do método Close que após 3 segundos ela sofrerá um efeito fade out e fechará.

    O Splash Screen em si não faz a aplicação ficar mais rápida para abrir, mas como faz uso do Windows Imaging Component (WIC) ele mostra a imagem muito antes da aplicação carregar. Com isso melhora a experiência do usuário com a sua aplicação.

    Enjoy