WPF -
Exibindo e posicionando Imagens no Canvas
![]() |
Hoje veremos como podemos exibir imagens e a seguir posicioná-las usando os eventos do mouse no elemento de leiaute Canvas da WPF - Windows Presentantion Foundation . |
Chegou o Curso ASP .NET MVC 5 Vídeo Aulas (C#)
Na WPF o layout é determinado pelo container que você usa e embora existem muitos containers a escolher, existem os seguintes princípios básicos:
O Windows
Presentation Foundation (ou WPF), inicialmente chamado de Avalon, é
um subsistema gráfico disponível a partir do .NET Framework 3.0(inicialmente
chamado de WinFX), que usa uma linguagem de marcação, conhecida como
XAML para desenvolvimento de Interfaces ricas. O WPF está incluído com o
Windows Vista e Windows Server 2008, e também está disponível para
Windows XP Service Pack 2 e mais recentes, e Windows Server 2003. Este oferece um modelo consistente de programação para construir aplicações e uma clara separação entre interface com o usuário e lógica de negócios. Uma aplicação WPF pode ser implantada em ambiente Desktop ou hospedada em um site da web. Se propõem a unificar um número de serviços de aplicações: interface com o usuário, desenhos 2D e 3D, documentos fixos e adaptáveis, tipografia avançada, gráficos vetoriais, gráficos Raster, animações, vinculação de dados, áudio e vídeo. http://pt.wikipedia.org/wiki/Windows_Presentation_Foundation |
Quase todos os elementos WPF com os quais trabalhamos derivam da classe base System.Windows.FrameworkElement e herdam algumas propriedades específicas de leiaute. Estas propriedades servem para refinar a maneira como os elementos são posicionados no seu controle pai. Dentre estas propriedades básicas temos: Margin, VerticalAlignment e HorizonalAlignment.
Todos os containers de leiaute WPF são Panels que derivam da classe abstrata System.Windows.Controls.Panel conforme mostra a figura abaixo:
O Canvas é o elemento de leiaute mais básico no WPF sendo diferente de todos os demais Panels.
A diferença reside no fato de que o Canvas não adiciona nenhum comportamento de layout especial aos seus controles filhos. O canvas precisa ter um tamanho exato para Width e Height e todos os seus controles filhos precisam ter um tamanho e posição exatamente definidas.
Seus elementos filhos são posicionados em coordenadas explicitas. As coordenadas podem ser especificadas com relação a um lado do panel usando as propriedades Canvas.Left, Canvas.Top, Canvas.Bottom and Canvas.Right.
O Canvas oferece suporte ao posicionamento absoluto e fornece a funcionalidade de layout menos interna para seus controles contidos; permite também controlar a posição contida em um deslocamento do qualquer canto do painel.
Este Panel é usado para agrupar elementos gráficos em 2D junto e não para elementos de interface de usuário.
Por exemplo, se um controle especifica valores para Top e Right, ele manterá uma distância constante do canto superior direito.Se forem especificados os valores para mais de uma propriedade horizontal ou vertical, em seguida, um dos valores será ignorado.
![]() |
Neste artigo veremos
como exibir imagens em um elemento Canvas e permitindo que o usuário
posicione-as usando os eventos do mouse.
Recursos usados :
Criando o projeto no VS 2013
Abra o VS 2013 Express for Windows desktop e clique em New Project;
A seguir selecione Visual Basic -> WPF Application;
Informe o nome Canvas_Imagem e clique no botão OK;
Abra o arquivo MainWindow.xaml e inclua o código XAML abaixo onde definimos :
1 elemento Canvas no Grid e também
3 eventos de mouse que iremos tratar para posicionar a imagem:
MouseLeftButtonDown="CanvasMouseLeftButtonDown"
MouseLeftButtonUp="CanvasMouseLeftButtonUp"
MouseMove="CanvasMouseMove"
1 controle Button com o evento btn_AdicionarImagem
<Window x:Class="MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Canvas - Imagens" Height="450" Width="625" Background="Aqua">
<Grid>
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<Canvas x:Name="canvas"
MouseLeftButtonDown="CanvasMouseLeftButtonDown"
MouseLeftButtonUp="CanvasMouseLeftButtonUp"
MouseMove="CanvasMouseMove"/>
<Button Grid.Row="1" Content="Adicionar uma Imagem" Click="btn_AdicionarImagem"/>
</Grid>
</Window>
|
O leiaute gerado pelo código XAML pode ser visto abaixo:
No início do arquivo MainWindow.xaml.vb vamos definir duas variáveis, uma para tratar a imagem e outra para tratar a posição do mouse:
Dim
ImagemArrastada As ImageAgora vamos definir no arquivo MainWindow.xaml.vb o evento Click - btnAdicionarImagem - o código que permite ao usuário selecionar uma imagem exibindo no Canvas:
Private Sub btn_AdicionarImagem(sender As Object, e As RoutedEventArgs) Try Dim ofd1 = New Microsoft.Win32.OpenFileDialog() 'filtra as imagens ofd1.Filter = "Image Files (*.jpg; *.jpeg; *.gif; *.bmp)|*.jpg; *.jpeg; *.gif; *.bmp" 'se selecionou um arquivo então trata e exibe a imagem
If CBool(ofd1.ShowDialog()) Then
Dim bitmap = New BitmapImage(New Uri(ofd1.FileName))
Dim imagem = New Image() With {.Source = bitmap}
'ajusta a imagem
canvas.SetLeft(imagem, 0)
canvas.SetTop(imagem, 0)
canvas.Children.Add(imagem)
End If
Catch ex As Exception
MessageBox.Show("Erro : " + ex.Message, "Erro", MessageBoxButton.OK, MessageBoxImage.Error)
End Try
End Sub
|
Vamos definir agora o código para cada evento do mouse definido :
1- MouseLeftButtonDown
Private Sub CanvasMouseLeftButtonDown(sender As Object, e As MouseButtonEventArgs)
Try
Dim imagem = TryCast(e.Source, Image)
'se a imagem existe captura a posição do mouse
If imagem IsNot Nothing AndAlso canvas.CaptureMouse() Then
posicaoMouse = e.GetPosition(canvas)
ImagemArrastada = imagem
' em caso de multiplas imagens
Panel.SetZIndex(ImagemArrastada, 1)
End If
Catch ex As Exception
Throw
End Try
End Sub
|
2- MouseLeftButtonUp
Private Sub CanvasMouseLeftButtonUp(sender As Object, e As MouseButtonEventArgs)
Try
If ImagemArrastada IsNot Nothing Then
canvas.ReleaseMouseCapture()
Panel.SetZIndex(ImagemArrastada, 0)
ImagemArrastada = Nothing
End If
Catch ex As Exception
Throw
End Try
End Sub
|
3- MouseMove
Private Sub CanvasMouseMove(sender As Object, e As MouseEventArgs)
Try
If ImagemArrastada IsNot Nothing Then
Dim position = e.GetPosition(canvas)
Dim offset = position - posicaoMouse
posicaoMouse = position
canvas.SetLeft(ImagemArrastada, canvas.GetLeft(ImagemArrastada) + offset.X)
canvas.SetTop(ImagemArrastada, canvas.GetTop(ImagemArrastada) + offset.Y)
End If
Catch ex As Exception
Throw
End Try
End Sub
|
Executando o projeto e selecionando uma imagem teremos :
Após isso podemos posicionar a imagem conforme mostra a figura a seguir:
Podemos também selecionar múltiplas imagens posicionando-as no elemento conforme figura abaixo:
Normalmente a Z-Order dos elementos no interior do elemento Canvas é especificada pela ordem no código XAML. Mas neste exemplo estamos sobrescrevendo a Z-Order e explicitamente definindo a propriedade Panel.SetZIndex(ImagemArrastada, 1) para o elemento.
Pegue o projeto completo aqui:
Canvas_Imagem.zip
Veja os
Destaques e novidades do SUPER DVD Visual Basic
(sempre atualizado) : clique e confira !
Quer migrar para o VB .NET ?
Quer aprender C# ??
Quer aprender os conceitos da Programação Orientada a objetos ? Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ? |
Gostou ?
Compartilhe no Facebook
Compartilhe no Twitter
Referências:
Super DVD Vídeo Aulas - Vídeo Aula sobre VB .NET, ASP .NET e C#
TreeView - Arrastar e Soltar (Drag and Drop) - Macoratti.net