WPF - Apresentando o controle Viewbox


Neste artigo eu continuo apresentando os controles da WPF - Windows Presentation Foundation- de forma que você possa se familiarizar com os recursos que a WPF oferece. Hoje eu vou mostrar como usar o controle Viewbox.

O controle Viewbox pertence ao namespace System.Windows.Controls e é usado como um decorador de conteúdo que pode esticar e dimensionar um determinado controle filho para preencher o espaço disponível.

A classe Viewbox apresenta a seguinte hierarquia de herança:

System.Object
  
System.Windows.Threading.DispatcherObject
     
System.Windows.DependencyObject
        
System.Windows.Media.Visual
             
System.Windows.UIElement
                
System.Windows.FrameworkElement
                    
System.Windows.Controls.Decorator
                          System.Windows.Controls.Viewbox

Namespace: System.Windows.Controls
Assembly: PresentationFramework (in PresentationFramework.dll)
XMLNS for XAML: http://schemas.microsoft.com/winfx/2006/xaml/presentation, http://schemas.microsoft.com/netfx/2007/xaml/presentation

Criando um Viewbox via código

Abaixo temos o código que podemos usar para criar um Viewbox via código em uma aplicação WPF:

Versão VB .NET Versão C#
' Cria um ViewBox e o adiciona ao Canvas
Dim m_Viewbox As New Viewbox()
m_Viewbox.StretchDirection = StretchDirection.Both
m_Viewbox.Stretch = Stretch.Fill
m_Viewbox.MaxWidth = 400
m_Viewbox.MaxHeight = 400
 
' Cria um ViewBox e o adiciona ao Canvas
m_Viewbox = new Viewbox();
m_Viewbox.StretchDirection = StretchDirection.Both;
m_Viewbox.Stretch = Stretch.Fill;
m_Viewbox.MaxWidth = 400;
m_Viewbox.MaxHeight = 400;
 

O código pode ser usado no arquivo code-behind MainWindow.xaml.vb  ou MainWindow.xaml.cs.

O código XAML para definir um controle Viewbox é dado a seguir:

<Viewbox>
    controle filho
</
Viewbox>

Obs: Um Viewbox só pode ter um controle filho. Se você adicionar mais de um controle filho , será lança da a exeção ArgumentException em tempo de execução.

A classe Viewbox possui dezenas de métodos, propriedades e eventos que você pode consultar na referência:
WPF - Viewbox - MSDN

Neste artigo como algumas das propriedades básicas na utilização do controle.

Usando o controle Viewbox

Abra o Visual Basic 2010 Express Edition (se preferir pode usar o Visual C# Express Edition) e no menu File -> New Project selecione o template WPF Application e informe o nome WPF_Viewbox e clique no botão OK:

A seguir selecione o arquivo MainWindow.xaml e defina o seguinte código XAML:

<Window x:Class="MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Usando o controle Viewbox" Height="350" Width="525">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition/>
            <RowDefinition Height="10*"/>
        </Grid.RowDefinitions>
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="5*"/>
                <ColumnDefinition/>
            </Grid.ColumnDefinitions>
            <Label Grid.Column="0" FontWeight="bold">Procurar imagem</Label>
            <Button Grid.Column="1" Click="Button_Click">Browse</Button>
        </Grid>
        <Viewbox Grid.Row="1" Name="viewbox1" MouseDown="viewbox1_MouseDown">
            <Image Name="oImage"></Image>
        </Viewbox>
    </Grid>
</Window>

No leiaute da janela temos um tabela definida pelo controle Grid , um controle Label, um controle Button e o controle Viewbox contendo o controle Image.

O controle Grid possui 3 propriedades principais:

-RowDefinitions - é uma coleção de RowDefinition sendo usada para incuir linhas no grid;
-ColumnDefinitions - representa uma coleção de ColumnDefinition sendo usada para incluir colunas ao grid;
-ShowGridLines - indica se as linhas da grade de um painel são visíveis ou não;

Obs: Nosso grid possui duas linhas e duas colunas.

Observe que temos definidos dois eventos. O evento Click do controle Button (Button_Click) e o evento MouseDown do controle viewbox (viewbox1_MouseDown).

Se você abrir o arquivo code-behind MainWindow.xaml.vb verá o seguinte código :

Class MainWindow
    Private Sub Button_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs)
    End Sub
    Private Sub viewbox1_MouseDown(ByVal sender As System.Object, ByVal e As System.Windows.Input.MouseButtonEventArgs)
    End Sub
End Class

Obs: Se você não visualizar este código selecione o controle Button e na janela de propriedade clique no ícone de eventos e a seguir procure pelo evento Click e clique duas vezes sobre ele. (Ou clique duas vezes no controle Button da janela). Repita o procedimento para o controle viewbox.

Vamos implementar o código do evento Click do controle Button conforme o código a seguir:

 Private Sub Button_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs)
        Try
            Dim oDlg As New OpenFileDialog()
            oDlg.Filter = "(*.bmp)|*.bmp"
            oDlg.ShowDialog()
            Dim bmp As New BitmapImage()
            bmp.BeginInit()
            bmp.UriSource = New Uri(oDlg.FileName)
            bmp.EndInit()
            oImage.Source = bmp
        Catch ex As Exception
            MessageBox.Show("Erro ao abrir imagem.")
        End Try
    End Sub

Este código abre exibirá uma caixa de diálogo abrir arquivo que permite ao usuário procurar e selecionar uma arquivo imagem no formato bitmap.

Ao selecionar a imagem ele deverá ser exibida pelo controle Imagem oImage contido no controle Viewbox.

A seguir vamos definir o seguinte código no evento MouseDown do controle Viewbox:

Private Sub viewbox1_MouseDown(ByVal sender As System.Object, ByVal e As System.Windows.Input.MouseButtonEventArgs)
        If e.LeftButton = MouseButtonState.Pressed AndAlso viewbox1.Width <= 500 Then
            viewbox1.Height += 5
            viewbox1.Width += 5
      End If

      If e.RightButton = MouseButtonState.Pressed AndAlso viewbox1.Width >= 10 Then
            viewbox1.Height -= 5
            viewbox1.Width -= 5
   End If
End Sub

Neste código quando o usuário clicar com o botão esquerdo do mouse no controle Viewbox, o elemento filho que é a imagem será aumentada (efeito zoom). Se o usuário clicar com o botão esquerdo no controle viewbox1 então a imagem será diminuída.

Para completar vamos definir no evento Loaded da janela Window o código abaixo:

 Private Sub MainWindow_Loaded(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles Me.Loaded
        viewbox1.Stretch = Stretch.Fill
        viewbox1.Width = 40
        viewbox1.Height = 40
    End Sub

O método Stretch obtém ou define modo que determina como o conteúdo se encaixa no espaço disponível.

A enumeração Stretch descreve como conteúdo será redimensionado para preencher o espaço alocado. O valores possíveis são:

None O conteúdo preserva o seu tamanho original.
Fill O conteúdo é redimensionado para preencher as dimensões de destino. A relação de aspecto não é preservada.
Uniform O conteúdo é redimensionado para caber nas dimensões de destino enquanto preserva sua proporção original.
UniformToFill O conteúdo é redimensionado para preencher as dimensões de destino enquanto preserva sua proporção original. Se a proporção do retângulo de destino difere da de origem, o conteúdo fonte é cortado para caber nas dimensões de destino.

Este código apenas define o modo de preenchimento como Stretch.Fill e o tamanho da figura com largura e altura igual a 30.

Executando o projeto iremos obter:

1 - A aplicação irá exibir a janela e quando o usuário clicar no botão Browse será a aberta a caixa de diálogo para que uma imagem seja selecionada:

2 - A imagem será exibida no controle Image com o tamanho inicial definido no evento Loaded da janela.

3- Clicando com o botão esquerdo do mouse várias vezes a imagem terá o seu tamanho aumentado;

Simples , simples assim...

Pegue o projeto completo aqui: WPF_ViewBox.zip

Eu sei é apenas WPF, mas eu gosto...

Referências:

José Carlos Macoratti