O Scott Guthrie anunciou que no início de 2008 deve ser lançado o Silverlight 2.0, com um monte de novas features:

  • Novos controles, como caixas de texto, checkboxes, tabcontrols e até uma grid
  • Controles de layout
  • Data binding
  • Suporte a rede, inclusive Cross Domain 
  • Suporte a uma biblioteca de classes bastante completa, com suporte a Linq to XML e api para acesso ao DOM HTML

Esta nova versão deverá ser lançada no primeiro trimestre de 2008, com uma licença Go-Live, que possibilita a criação de projetos de produção, em conjunto com uma atualização para o Visual Studio 2008, de maneira a possibilitar a criação de projetos Slverlight com as diversas versões da ferramenta, inclusive as Express.

Fiquem ligados, porque pelo que está pintando, vai ser de arrasar! 

Este post do Scott Guthrie anunciou que a Microsoft irá liberar partes do código fonte do Framework .net, sob licença MS-RL.

Isso permitirá que possamos baixar para estudar, verificar o código e até mesmo debugar os fontes das bibliotecas.

Isso é realmente ótimo, pois além de podermos ver como é que se faz, poderemos ver também o que está acontecento com aqueles bugs estranhos que aparecem, sem que tenhamos uma pista do que acontece nas bibliotecas do Framework.

Se você ainda não conhece o Silverlight, vale a pena conhecer. O Silverlight é uma nova tecnologia para a Web, que permite fazer facilmente aplicações de conteúdo rico que pode ser usada em múltiplos browsers (IE, Firefox e Safari) e plataformas (Windows e Mac). Ele usa um subset do XAML do WPF e está disponível em duas versões: 1.0, que usa JavaScript como code-behind ou 1.1, que usa linguagens gerenciadas, como o C# ou o VB.net, além de IronPython, IronRuby ou mesmo Chrome. Além disso, permite um excelente streaming de mídia. Um bom exemplo está em http://silverlight.net/fox

A versão 1.0 acaba de ser lançada, em conjunto com o Expression Encoder, mais um componente da suíte de programas Expression, com o anúncios de que em breve devemos ter Silverlight para Linux. O projeto, chamado Moonlight, está sendo feito em parceria com a Novell e prevê o Silverlight para múltiplas distribuições do Linux rodando em FireFox, Konqueror ou Opera. Se você queria programar em C# para Linux, aguarde.

Algumas vezes eu faço uns projetos de teste no Visual Studio e a lista “Recent Projects” fica cheia de nomes como “ConsoleApplication1”, “WebSite1”. Eu gostaria de limpar, mas o VS não tem nada para apagar os nomes da lista.

Então resolvi dar uma pesquisada e verifiquei que esta lista fica em HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\9.0\ProjectMRUList para o VS2008 e em HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\8.0\ProjectMRUList, nos valores File1, File2, File3,….

Assim, resolvi criar um pequeno programa que permite excluir arquivos desta lista para mim. Basta criar uma aplicação WinForms e colocar uma  ListView, com uma coluna, “Nome”. No evento Load usamos a classe Registry para ler os arquivos desta chave:


    private void Form1_Load(object sender, EventArgs e)
    {
      LeListaMru();
    }

    private void LeListaMru()
    {
      listView1.Items.Clear();
      // Abre chave do MRU do VS
      using (RegistryKey regKey = Registry.CurrentUser.OpenSubKey(MRUKEY))
      {
       // Pega lista de arquivos do MRU
        string[] arquivos = regKey.GetValueNames();
        foreach (string arq in arquivos)
        {
          // Adiciona nome do arquivo na ListView
          string keyValue = (string)regKey.GetValue(arq,””,RegistryValueOptions.DoNotExpandEnvironmentNames);
          if (keyValue != “”)
            listView1.Items.Add(Environment.ExpandEnvironmentVariables(keyValue)).Tag = keyValue;
        }
      }
    } 

Aqui, um pequeno truque: a lista é guardada com os nomes dos arquivos usando-se as variáveis de ambiente, como %USERPROFILE%, em chaves do tipo REG_EXPAND_SZ. Lemos as chaves sem expandi-las e adicionamos na lista, expandindo o nome usando ExpandEnvironmentVariables e guardamos o nome original no objeto Tag. Com isso, temos acesso ao nome expandido e não expandido.

Com a lista na janela, selecionamos os arquivos que queremos excluir e teclamos Del para exclui-los. No evento KeyDown da ListView excluimos os valores selecionados:

    private void listView1_KeyDown(object sender, KeyEventArgs e)
    {
      // Se teclou Delete
      if (e.KeyCode == Keys.Delete &&
         MessageBox.Show(“Confirma exclusão dos projetos selecionados?”,
            “Exclui projetos”, MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
      {
        // Abre chave do MRU do VS
        using (RegistryKey regKey = Registry.CurrentUser.OpenSubKey(MRUKEY,true))
        {
          // Apaga os valores atuais
        string[] arquivos = regKey.GetValueNames();
        foreach (string arq in arquivos)
              regKey.DeleteValue(arq);
          // Grava os valores só dos itens não selecionados
          int k = 1;
          foreach (ListViewItem item in listView1.Items)
            if (!item.Selected)
            {
              regKey.SetValue(string.Format(“File{0}”, k), (string)item.Tag, RegistryValueKind.ExpandString);
              k++;
            }
        }
        LeListaMru();
      }
    }

Aqui, uma observação: o Visual Studio não gosta de buracos na lista: se ele não encontrar o File2, ele despreza o restante da lista. Assim, o que fiz foi deletar toda a lista e só gravar os valores não selecionados, rearranjando-a. Com este pequeno programa, posso manipular a lista de projetos recentes do Visual Studio e deixá-la do jeito que quero.

Você tem uma porção de arquivos MP3 e WMA jogados em seu disco e nem sabe que músicas eles contém. O meu novo utilitário da PCMagazine, o RenaMusic permite verificar (e alterar) os tags dos arquivos e renomeá-los ou movê-los para uma pasta, usando os dados contidos nas tags para criar o novo nome. Assim, se você criar um padrão como “C:\Musicas\<Artist>\<Title>”, o programa irá criar uma pasta para cada artista no diretório “C:\Musicas” e organizar as músicas nestas pastas, renomeando-os usando o título da música contido na tag.

Se você se interessou, dê uma olhada em  http://www.pcmag.com/article2/0,1895,2162882,00.asp

Aproveite também para conferir os outros meus utilitários, como o InstaBack, NetShare Manager, ou mesmo o NoteWhen, entre muitos outros.

Se você gostou do Family.Show, que descrevi aqui, você não foi o único. Os downloads e o feedback para o programa foram tão grandes, que está sendo lançada a versão 2.0, com novos recursos, como temas, entrada de dados em uma grid, visual mais rico.

Se você ainda não conferiu, pode baixar a nova versão no CodePlex. O código fonte também está disponível para você analisar.

Um efeito muito interessante é aquele que temos no Expression Blend, quando selecionamos Tools/Options e mudamos o valor de Workspace zoom: podemos mudar o tamanho dos controles, aumentando-os ou diminuindo-os como um todo, permitindo que a visualização fique mais comoda.

A obtenção deste efeito com WPF é muito simples: basta colocar todos os controles que queremos dar o zoom num conteiner, por exemplo, num Canvas e aplicar uma transformação de escala (ScaleTransform) sobre ele. Todos os controles dentro dele serão aumentados ou diminuídos simultaneamente, dando o mesmo efeito que temos no Blend.

Ao digitar este código no XamlPad ou XamlCruncher, você verá que pode alterar o zoom dos componentes na janela ao mudar a posição do Slider:

<Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <Grid RenderTransformOrigin="0,0">
        <Grid.RowDefinitions>
            <RowDefinition Height="0.85*"/>
            <RowDefinition Height="0.15*"/>
        </Grid.RowDefinitions>
        <StackPanel Margin="8,8,8,8" Grid.Row="1">
            <Slider Width="308" Height="16" Maximum="2" x:Name="Slider" Value="1"/>
        </StackPanel>
        <Canvas>
            <Canvas.RenderTransform>
                <TransformGroup>
                    <ScaleTransform 
                     ScaleX="{Binding Path=Value, ElementName=Slider, Mode=Default}"
                     ScaleY="{Binding Path=Value, ElementName=Slider, Mode=Default}"
                    />
                </TransformGroup>
            </Canvas.RenderTransform>
            <TextBox Text="TextBox" Canvas.Left="10" Canvas.Top="10"/>
            <Label Content="Label" Canvas.Left="10" Canvas.Top="50"/>
            <CheckBox Content="CheckBox" Canvas.Left="10" Canvas.Top="100"/>
            <ListBox Width="188" Height="100" Canvas.Left="10" Canvas.Top="150">
                <ListBoxItem Content="Item 1"/>
                <ListBoxItem Content="Item 2"/>
                <ListBoxItem Content="Item 3"/>
                <ListBoxItem Content="Item 4"/>
                <ListBoxItem Content="Item 5"/>
            </ListBox>
            <ComboBox Width="196" Canvas.Left="10" Canvas.Top="282">
                <ComboBoxItem Content="Item 1"/>
                <ComboBoxItem Content="Item 2"/>
                <ComboBoxItem Content="Item 3"/>
            </ComboBox>
        </Canvas>
    </Grid>
</Window>

 

Zoom

O segredo está nestas linhas:

<Canvas.RenderTransform>
  <TransformGroup>
    <ScaleTransform ScaleX="{Binding Path=Value, ElementName=Slider, Mode=Default}"
      ScaleY="{Binding Path=Value, ElementName=Slider, Mode=Default}" />
  </TransformGroup>
</Canvas.RenderTransform>

Aqui fazemos a escala do canvas que contém os outros componentes. Note que estamos fazendo o data binding com a posição do slider. Assim, quando movimentamos o slider, todos os componentes aumentam ou diminuem.

Se você ainda não está convencido que o WPF irá mudar a maneira que desenvolvemos programas (e a maneira que nossos usuários irão vê-las), sugiro que dê uma olhada no Family.Show, em http://www.vertigo.com/familyshow.aspx.

Esta é uma aplicação de árvore genealógica, porém ela dá uma renovada no aspecto da aplicação: seu design é muito bonito, a interface com o usuário é simples mas, ao mesmo tempo, o programa é completo e eficiente.

familyshow

O programa mostra a árvore genealógica na parte esquerda da janela. À direita, é mostrada a pessoa selecionada. Podem-se acrescentar fotos, dados sobre a pessoa ou mesmo textos que descrevam-na. Quando você seleciona outra pessoa, a árvore genealógica se desloca, mostrando o ramo referente a ela. 

Uma característica interessante é o slider de visualização da linha do tempo: à medida que alteramos a posição (mudando o ano), as pessoas ficam transparentes (não nascidas) ou escuras (já falecidas).  Este é um exemplo típico de data binding, que pode ser feito sem código no WPF.

Neste programa vemos exemplos de data binding, animações, visual rico, textos WYSIWYG, estilos e templates e muito mais…

Você pode instalá-lo via ClickOnce e montar sua própria árvore genealógica, ou mesmo estudar o código fonte, que está disponível aqui.