Quero criar um visualizador de imagens simples no WPF que permita ao usuário:
- Panorâmica (arrastando o mouse a imagem).
- Zoom (com um controle deslizante).
- Mostrar sobreposições (seleção de retângulo, por exemplo).
- Mostrar imagem original (com barras de rolagem, se necessário).
Você pode explicar como fazer isso?
Não encontrei uma boa amostra na web. Devo usar o ViewBox? Ou ImageBrush? Preciso do ScrollViewer?
Respostas:
A maneira como resolvi esse problema foi colocar a imagem dentro de uma borda com a propriedade ClipToBounds definida como True. O RenderTransformOrigin na imagem é então definido como 0.5,0.5 para que a imagem comece a aumentar o zoom no centro da imagem. O RenderTransform também é definido como um TransformGroup que contém um ScaleTransform e um TranslateTransform.
Em seguida, lidei com o evento MouseWheel na imagem para implementar o zoom
Para lidar com o pan, a primeira coisa que fiz foi manipular o evento MouseLeftButtonDown na imagem, capturar o mouse e registrar sua localização. Também armazeno o valor atual do TranslateTransform, que é atualizado para implementar o pan.
Em seguida, lidei com o evento MouseMove para atualizar o TranslateTransform.
Finalmente, não se esqueça de liberar a captura do mouse.
Quanto às alças de seleção para redimensionar, isso pode ser feito usando um adorno, consulte este artigo para obter mais informações.
fonte
Depois de usar exemplos desta pergunta, eu fiz a versão completa do aplicativo de panorâmico e zoom com o zoom adequado em relação ao ponteiro do mouse. Todo o código de panorâmica e zoom foi movido para uma classe separada chamada ZoomBorder.
ZoomBorder.cs
MainWindow.xaml
MainWindow.xaml.cs
fonte
double zoomCorrected = zoom*st.ScaleX; st.ScaleX += zoomCorrected; st.ScaleY += zoomCorrected;
A resposta foi postada acima, mas não estava completa. aqui está a versão completa:
XAML
Código por trás
Eu tenho um exemplo de um projeto wpf completo usando este código no meu site: Anote o aplicativo de lembrete .
fonte
Experimente este controle de zoom: http://wpfextensions.codeplex.com
o uso do controle é muito simples, faça referência ao assembly wpfextensions do que:
Barras de rolagem não suportadas no momento. (Ele estará no próximo lançamento, que estará disponível em uma ou duas semanas).
fonte
fonte
@Anothen e @ Number8 - A classe Vector não está disponível no Silverlight, portanto, para que funcione, precisamos manter um registro da última posição vista na última vez que o evento MouseMove foi chamado e comparar os dois pontos para encontrar a diferença ; depois ajuste a transformação.
XAML:
Código por trás:
Observe também que você não precisa de um TransformGroup ou uma coleção para implementar panorâmica e zoom; em vez disso, uma CompositeTransform irá fazer o truque com menos problemas.
Tenho certeza de que isso é realmente ineficiente em termos de uso de recursos, mas pelo menos funciona :)
fonte
Para ampliar em relação à posição do mouse, tudo o que você precisa é:
fonte
@ Merk
Para sua solução insted da expressão lambda, você pode usar o seguinte código:
esse código pode ser usado como está para o .Net Frame work 3.0 ou 2.0
Espero que ajude você :-)
fonte
Mais uma versão do mesmo tipo de controle. Possui funcionalidade semelhante às demais, mas acrescenta:
O uso é simples:
E o código:
fonte
if (image.ActualWidth*(st.ScaleX + zoom) < 200 || image.ActualHeight*(st.ScaleY + zoom) < 200) //don't zoom out too small. return;
em image.MouseWheelIsso aumenta e diminui o zoom, além de movimentar, mas mantém a imagem dentro dos limites do contêiner. Escrito como um controle, adicione o estilo
App.xaml
diretamente ou através doThemes/Viewport.xaml
.Para facilitar a leitura, eu também enviei isso no gist e github
Eu também empacotei isso em pepita
./Controls/Viewport.cs:
./Themes/Viewport.xaml:
./App.xaml
Uso:
Qualquer problema, me dê um grito.
Feliz codificação :)
fonte