Quiero crear un visor de imágenes simple en WPF que permita al usuario:
- Desplazar (arrastrando la imagen con el mouse).
- Zoom (con un control deslizante).
- Mostrar superposiciones (selección de rectángulo, por ejemplo).
- Mostrar imagen original (con barras de desplazamiento si es necesario).
¿Puedes explicar cómo hacerlo?
No encontré una buena muestra en la web. ¿Debo usar ViewBox? O ImageBrush? ¿Necesito ScrollViewer?
Respuestas:
La forma en que resolví este problema fue colocar la imagen dentro de un borde con su propiedad ClipToBounds establecida en True. El RenderTransformOrigin en la imagen se establece en 0.5,0.5 para que la imagen comience a hacer zoom en el centro de la imagen. El RenderTransform también se establece en un TransformGroup que contiene un ScaleTransform y un TranslateTransform.
Luego manejé el evento MouseWheel en la imagen para implementar el zoom
Para manejar la panorámica, lo primero que hice fue controlar el evento MouseLeftButtonDown en la imagen, capturar el mouse y registrar su ubicación, también almaceno el valor actual de TranslateTransform, esto es lo que se actualiza para implementar la panorámica.
Luego manejé el evento MouseMove para actualizar TranslateTransform.
Finalmente no olvides liberar la captura del mouse.
En cuanto a los tiradores de selección para cambiar el tamaño, esto se puede lograr con un adorno, consulte este artículo para obtener más información.
fuente
Después de usar muestras de esta pregunta, hice la versión completa de la aplicación de desplazamiento panorámico y zoom con el zoom adecuado en relación con el puntero del mouse. Todo el código de panorámica y zoom se ha movido a una clase separada llamada ZoomBorder.
ZoomBorder.cs
MainWindow.xaml
MainWindow.xaml.cs
fuente
double zoomCorrected = zoom*st.ScaleX; st.ScaleX += zoomCorrected; st.ScaleY += zoomCorrected;
La respuesta fue publicada arriba pero no estaba completa. Aquí está la versión completa:
XAML
Código detrás
Tengo un ejemplo de un proyecto wpf completo con este código en mi sitio web: escriba la aplicación de notas adhesivas .
fuente
Pruebe este control de zoom: http://wpfextensions.codeplex.com
El uso del control es muy simple, referencia al ensamblaje wpfextensions que:
Las barras de desplazamiento no son compatibles en este momento. (Será en la próxima versión, que estará disponible en una o dos semanas).
fuente
fuente
@Anothen y @ Number8: la clase Vector no está disponible en Silverlight, por lo que para que funcione, solo necesitamos mantener un registro de la última posición vista la última vez que se llamó al evento MouseMove y comparar los dos puntos para encontrar la diferencia ; luego ajuste la transformación.
XAML:
Código detrás:
También tenga en cuenta que no necesita un TransformGroup o una colección para implementar la panorámica y el zoom; en cambio, un CompositeTransform hará el truco con menos problemas.
Estoy bastante seguro de que esto es realmente ineficiente en términos de uso de recursos, pero al menos funciona :)
fuente
Para hacer zoom en relación con la posición del mouse, todo lo que necesita es:
fuente
@ Merk
Para su solución en lugar de la expresión lambda, puede usar el siguiente código:
este código se puede usar como está para .Net Frame work 3.0 o 2.0
Espero que te ayude :-)
fuente
Otra versión más del mismo tipo de control. Tiene una funcionalidad similar a las demás, pero agrega:
El uso es simple:
Y el codigo:
fuente
if (image.ActualWidth*(st.ScaleX + zoom) < 200 || image.ActualHeight*(st.ScaleY + zoom) < 200) //don't zoom out too small. return;
en image.MouseWheelEsto acercará y alejará, así como la panorámica, pero mantendrá la imagen dentro de los límites del contenedor. Escrito como un control, así que agregue el estilo
App.xaml
directamente o medianteThemes/Viewport.xaml
.Para facilitar la lectura También he subido esto en lo esencial y github
También he empaquetado esto en Nuget
./Controls/Viewport.cs:
./Themes/Viewport.xaml:
./App.xaml
Uso:
Cualquier problema, dame un grito.
Feliz codificación :)
fuente