J'ai résolu ce problème en plaçant l'image à l'intérieur d'une bordure dont la propriété ClipToBounds est définie sur True. La propriété RenderTransformOrigin de l'image est ensuite définie sur 0.5,0.5 afin que l'image commence à zoomer sur le centre de l'image. La RenderTransform est également définie comme un TransformGroup contenant une ScaleTransform et une TranslateTransform.
J'ai ensuite géré l'événement MouseWheel sur l'image pour implémenter le zoom.
private void image_MouseWheel(object sender, MouseWheelEventArgs e)
{
var st = (ScaleTransform)image.RenderTransform;
double zoom = e.Delta > 0 ? .2 : -.2;
st.ScaleX += zoom;
st.ScaleY += zoom;
}
Pour gérer le panoramique, la première chose que j'ai faite a été de gérer l'événement MouseLeftButtonDown sur l'image, pour capturer la souris et enregistrer sa position, je stocke également la valeur actuelle de la TranslateTransform, c'est ce qui est mis à jour pour mettre en œuvre le panoramique.
Point start;
Point origin;
private void image_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
image.CaptureMouse();
var tt = (TranslateTransform)((TransformGroup)image.RenderTransform)
.Children.First(tr => tr is TranslateTransform);
start = e.GetPosition(border);
origin = new Point(tt.X, tt.Y);
}
Ensuite, j'ai géré l'événement MouseMove pour mettre à jour la TranslateTransform.
private void image_MouseMove(object sender, MouseEventArgs e)
{
if (image.IsMouseCaptured)
{
var tt = (TranslateTransform)((TransformGroup)image.RenderTransform)
.Children.First(tr => tr is TranslateTransform);
Vector v = start - e.GetPosition(border);
tt.X = origin.X - v.X;
tt.Y = origin.Y - v.Y;
}
}
Enfin, n'oubliez pas de relâcher la capture de la souris.
private void image_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
image.ReleaseMouseCapture();
}
Quant aux poignées de sélection pour le redimensionnement, elles peuvent être réalisées à l'aide d'un ornement. cet article pour plus d'informations.
0 votes
Pour obtenir un Zoom Control professionnel pour WPF, consultez l'adresse suivante ZoomPanel . Il n'est pas gratuit, mais il est très facile à utiliser et possède de nombreuses fonctionnalités - zoom et panoramique animés, prise en charge de ScrollViewer, prise en charge de la molette de la souris, ZoomController inclus (avec des boutons de déplacement, de zoom avant, de zoom arrière, de zoom rectangulaire et de réinitialisation). Il est également fourni avec de nombreux exemples de code.
0 votes
J'ai écrit un article sur codeproject.com sur l'implémentation d'un contrôle de zoom et de pan pour WPF. codeproject.com/KB/WPF/zoomandpancontrol.aspx
0 votes
Bonne trouvaille. L'essai est gratuit, mais ils demandent 69 dollars par ordinateur pour une licence si vous avez l'intention de créer un logiciel avec. Il s'agit d'une DLL à utiliser, donc ils ne peuvent pas vous en empêcher, mais c'est là que, si vous le construisez commercialement pour un client, en particulier un qui exige que tout utilitaire tiers soit déclaré et fasse l'objet d'une licence individuelle, vous devrez payer les frais de développement. Dans le CLUF, il n'est pas dit que c'est sur une base "par application", cependant, de sorte que dès que vous avez enregistré votre achat, il serait alors "libre" pour toutes les applications que vous avez créées, et vous pourriez copier votre fichier de licence payée avec elle pour représenter l'achat.