Tengo una imagen renderizada grande y necesito una sección ampliada de lo que está debajo del cursor del usuario.¿Cómo construir una lupa en WPF C# 4.0?
Mi imagen está dentro de una cuadrícula y se define en XAML de esta manera:
<Grid x:Name="RootImgGrid" Background="#FF333333" >
<Viewbox x:Name="imgViewBox" Margin="1,1,1,1" Stretch="Fill" >
<Canvas x:Name="imgCanvas" ClipToBounds="True" Width="{Binding ElementName=RootImgGrid, Path=ActualWidth}" Height="{Binding ElementName=RootImgGrid, Path=ActualHeight}">
<Image x:Name="imgObj" MouseWheel="img_MouseWheel" Cursor="Hand" MouseMove="Img_MouseMove" MouseDown="Img_MouseDown" MouseUp="Img_MouseUp" >
<Image.RenderTransform>
<TransformGroup x:Name="imgTransformGroup">
<ScaleTransform x:Name="imgScaleTransform"></ScaleTransform>
<TranslateTransform x:Name="imgTranslateTransform"></TranslateTransform>
</TransformGroup>
</Image.RenderTransform>
<Image.LayoutTransform>
<RotateTransform x:Name="imgRotateTransform"></RotateTransform>
</Image.LayoutTransform>
</Image>
</Canvas>
</Viewbox>
</Grid>
Y tengo un área ampliada, donde debe aparecer la imagen debajo de mi cursor de zoom de 2x.
<Viewbox x:Name="imgViewBoxMagnifier" Width="400" Height="90">
<Canvas x:Name="imgCanvasMagnifier" Width="400" Height="90">
<Canvas.Clip>
<RectangleGeometry Rect="0,0,400,90" />
</Canvas.Clip>
<Image x:Name="imgMagnifier" Margin="2" Width="400" Height="90">
<Image.RenderTransform>
<TransformGroup x:Name="imgMagnifierTransformGroup">
<ScaleTransform x:Name="imgMagnifierScaleTransform"></ScaleTransform>
<TranslateTransform x:Name="imgMagnifierTranslateTransform"></TranslateTransform>
</TransformGroup>
</Image.RenderTransform>
<Image.LayoutTransform>
<RotateTransform x:Name="imgMagnifierRotateTransform"></RotateTransform>
</Image.LayoutTransform>
</Image>
</Canvas>
</Viewbox>
Ahora, en mi código .CS Tengo la función que debe mostrar la imagen ampliada:
public void Magnifier(Canvas imgCanvas, Image imgObject, Image imgMagnifier, MouseEventArgs e)
{
Int32 width = 400;
Int32 height = 90;
if (imgMagnifier.Source != imgObject.Source)
{
imgMagnifier.Source = imgObject.Source;
}
Size size = imgObject.RenderSize;
RotateTransform rt = (RotateTransform)imgObject.LayoutTransform;
TranslateTransform tt = (TranslateTransform)((TransformGroup)imgObject.RenderTransform).Children[1];
ScaleTransform st = (ScaleTransform)((System.Windows.Media.TransformGroup)(imgObject.RenderTransform)).Children[0];
Double x = e.GetPosition(imgCanvas).X - tt.X;
Double y = e.GetPosition(imgCanvas).Y - tt.Y;
Point pos = e.MouseDevice.GetPosition(imgCanvas);
TransformGroup transformGroup = new TransformGroup();
ScaleTransform scale = new ScaleTransform();
scale.CenterX = x;
scale.CenterY = y;
scale.ScaleX = st.ScaleX * 10;
scale.ScaleY = st.ScaleY * 10;
transformGroup.Children.Add(scale);
TranslateTransform translate = new TranslateTransform();
translate.X = ??????????????????;
translate.Y = ??????????????????;
transformGroup.Children.Add(translate);
imgMagnifier.RenderTransform = transformGroup;
}
¿Cómo puedo encontrar el valor correcto de los "?????? ??
translate.X = -x * 10/(size.Width/400);
translate.Y = -y * 10/(size.Height/90);
Muestra la imagen correcta, aumentada, pero no muestra el área de la imagen debajo de mi cursor.
Gracias de antemano.
¿Qué tal si revisamos el código en github y será indexado en caso de que las personas lo busquen? – Candide
Claro. Enlace actualizado –