Visual Basic em Português

Página pessoal de Jorge Paulino sobre o Visual Basic (VB.NET, ASP.NET, VB6, VBA) e algumas noticias de tecnologia

VB.NET: Usando Controlos WPF em WinForms

Windows Presentation Foundation (WPF) permite criar aplicações muito ricas, muito versáteis e com muitos recursos visuais. Uma aplicação que usa WPF é normalmente composta por duas partes: um arquivo XML com características especiais chamado XAML (eXtended Aplication Markup Language, pronuncia-se “zémel”), e um código .NET (que pode ser escrito numa linguagem compatível como o VB.net ou C#).

Mas nem todos gostam de WPF para criar aplicações, até porque é necessário um processo de aprendizagem significativo, quer pelo XAML quer pela arquitectura geral de funcionamento.

Mas porquê não utilizar as potencialidades do WPF em Windows Forms?

É bastante simples utilizar WPF em Windows Forms e com isso usar todas as suas potencialidades. Muitos utilizadores queixam-se dos controlos disponíveis no Visual Studio e esta é uma oportunidade de criar os seus próprios controlos quase sem limites. Estes dois exemplos iram mostrar como incorporar um controlo WPF em Windows Forms e como fazer algumas alterações com o objectivo de melhorar visualmente os mesmos.

Para criar um controlo WPF é apenas necessário adicionar um novo item ao projecto (desde que esteja seleccionado a plataforma . NET Framework 3.0 ou superior) e seleccionar User Control (WPF)


 

Depois, para cada controlo, indicar o nome pretendido de acordo com os exemplos.

wpfPictureBox




Este controlo tem algumas personalizações com é o caso de:

  • Sombra na PictureBox
  • Possibilidade de alterar a opacidade da imagem


No editor de XAML utilizar o seguinte código:

<UserControl x:Class="wpfPictureBox"
    xmlns=http://schemas.microsoft.com/winfx/2006/xaml/presentation
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Width="300" Height="300">

    <!-- Definição da imagem e da sombra –>
    <Image Margin="10" x:Name="Image" Stretch="Uniform" Opacity="1">
      <Image.BitmapEffect>
            <DropShadowBitmapEffect Opacity="1" />
        </Image.BitmapEffect>
     </Image>

</UserControl>

Após compilar a aplicação ficará disponível na Toolbox o controlo wpfPictureBox. Arrastar para o Form, adicionar também uma TrackBar e utilizar o seguinte código para definir a imagem e alterar a opacidade da imagem:

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        ' Definições da TrackBar
        Me.TrackBar1.Maximum = 100
        Me.TrackBar1.Minimum = 0
        Me.TrackBar1.Value = 100 

        ' Carrega uma imagem no nosso controlo
        WpfPictureBox1.Image.Source = New Windows.Media.Imaging.BitmapImage(New Uri("c:\imagem.jpg"))

    End Sub

    ' Quando se mexe na TrackBar diminui/aumenta a opacidade da imagem
    Private Sub TrackBar1_Scroll(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TrackBar1.Scroll

        WpfPictureBox1.Image.Opacity = Me.TrackBar1.Value / 100

    End Sub

wpfComboBox




Este controlo tem algumas personalizações (algumas apenas para ilustração das potencialidades do WPF) com é o caso de:

  • Sombra na ComboBox
  • Botão dentro da lista para adicionar novos itens
  • Efeito de fundo na caixa e lista

No editor de XAML utilizar o seguinte código: 

<UserControl  x:Class="wpfComboBox" 
    xmlns=http://schemas.microsoft.com/winfx/2006/xaml/presentation
    xmlns:x=http://schemas.microsoft.com/winfx/2006/xaml 
    Width="200" Height="30">

    <ComboBox x:Name="wpfCombo" Margin="5" Foreground="White" BorderBrush="White" MaxDropDownHeight="150">

        <!-- Define o efeito da sombra –>
        <ComboBox.BitmapEffect>
            <DropShadowBitmapEffect ShadowDepth="1" Opacity="1" Color="DarkSeaGreen" />
        </ComboBox.BitmapEffect>

        <!-- Define o efeito do fundo –>
        <ComboBox.Background>
            <LinearGradientBrush>

                <LinearGradientBrush.GradientStops>
                    <GradientStopCollection>
                        <GradientStop Color="DarkSeaGreen" Offset="0" />
                        <GradientStop Color="White" Offset="1" />
                    </GradientStopCollection>
                </LinearGradientBrush.GradientStops>

           </LinearGradientBrush>
        </ComboBox.Background>

        <ComboBox.Resources>
            <Style TargetType="{x:Type ComboBoxItem}">               

                <!-- Define o efeito do fundo para os itens –>
                <Setter Property="Background">
                    <Setter.Value>
                        <LinearGradientBrush>
                            <GradientStop Color="DarkSeaGreen" Offset="0"/>
                            <GradientStop Color="White" Offset="1"/>
                        </LinearGradientBrush>
                    </Setter.Value>
                </Setter>

                <!-- Define a cor do texto dos items –>
                <Setter Property="Foreground" Value="White" />

            </Style>
        </ComboBox.Resources>

         <!-- Insere um botão para criar um novo item –>
        <Button x:Name="btnCombo" Width="150" Background="White" Height="22" Foreground="DarkSeaGreen">
            <TextBlock>Inserir novo item ... </TextBlock>
        </Button>

    </ComboBox>

</UserControl>

Após compilar a aplicação ficará disponível na Toolbox o controlo wpfComboBox. Arrastar para o Form e utilizar o seguinte código para o preencher e detectar que o botão foi pressionado:

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        ' Insere alguns itens na wpfCombobox
        For x As Byte = 0 To 20
            WpfComboBox1.wpfCombo.Items.Add("Combobox Item " & x.ToString.PadLeft(2, "0"c))
        Next

        ' Define uma acção para quando for pressionado o botão da wpfComboBox
        AddHandler WpfComboBox1.btnCombo.Click, AddressOf btnComboBoxClick 

    End Sub

    Sub btnComboBoxClick()
        MessageBox.Show("Adicionar um novo item à wpfComboBox")
    End Sub

São pequenos exemplos que mostram como utilizar controlos WPF numa aplicação WinForms. Com estes controlos consegue-se personalizar bastante a aplicação e melhorar o aspecto visual.

PS: Como sempre, qualquer dúvida, comentário ou correcção ao artigo é sempre bem vinda!

 

5 comentários:

Rafal - Leme disse...

Olá...

Tentei por em prática o exemplo deste artigo e ocorre a seguinte mensagem:
"Error 1 'WpfComboBox.wpfComboBox.Friend WithEvents wpfCombo As System.Windows.Controls.ComboBox' is not accessible in this context because it is 'Friend'."

O que pode ser?
Grato.

jpaulino disse...

Olá Rafal - Leme,

Tem de me mostrar o código que utilizou e onde dá o erro.

Se possível coloque a questão aqui: http://www.portugal-a-programar.org/forum/index.php?board=201.0

ribeiro disse...

Muito bom artigo.
E para os que só sentem entusiasmo com nomes sonantes, deverias mencionar que WPF é a base para o Silverlight. A "so called" flash competitor.

dani disse...

Ola,
o controlo não aparece na toolbox.
O que pode ser?

Obrigado

jpaulino disse...

Olá,

E deu algum erro a compilar ?

Mensagens Recentes



Microsoft Office Especialist

Membro da Comunidade
Experts-Exchange


Administ. da Comunidade
Portugal-a-Programar



Twitter

Artigos no CodeProject

Artigos no CodeProject

Subscrever Novidades

Endereço de Email:

Delivered by FeedBurner

Seguidores

Histórico