public partial class MainPage : UserControl
{
bool isMouseDown=false;
bool drag = false;
Point MouseCurrentPosition;
Point DeepZoomCurrentPosition;
double zoom = 1;
public MainPage()
{
InitializeComponent();
msi.ViewportChanged += new RoutedEventHandler(msi_ViewportChanged);
msi.MouseLeftButtonDown += new MouseButtonEventHandler(msi_MouseLeftButtonDown);
msi.MouseMove += new MouseEventHandler(msi_MouseMove);
msi.MouseLeftButtonUp += new MouseButtonEventHandler(msi_MouseLeftButtonUp);
msi.MouseWheel += new MouseWheelEventHandler(msi_MouseWheel);
}
void msi_ViewportChanged(object sender, RoutedEventArgs e)
{
Point viewportOrigin = msi.ViewportOrigin;
double viewportWidth = msi.ViewportWidth;
overlayScale.ScaleX = 1 / viewportWidth;
overlayScale.ScaleY = 1 / viewportWidth;
Point newO = LogicalToElement(new Point(), viewportOrigin, viewportWidth);
overlayTranslate.X = newO.X;
overlayTranslate.Y = newO.Y;
}
private Point LogicalToElement(Point p, Point Origin, double Width)
{
return new Point(((p.X - Origin.X) / Width) * msi.ActualWidth,
((p.Y - Origin.Y) / Width) * msi.ActualWidth);
}
public void Zoom(double zoom, Point pointToZoom)
{
Point logicalPoint =this.msi.ElementToLogicalPoint(pointToZoom);
this.msi.ZoomAboutLogicalPoint(zoom, logicalPoint.X, logicalPoint.Y);
}
private void msi_MouseLeftButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
isMouseDown = true;
MouseCurrentPosition = e.GetPosition(msi);
DeepZoomCurrentPosition = msi.ViewportOrigin;
msi.CaptureMouse();
}
private void msi_MouseLeftButtonUp(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
isMouseDown = false;
drag = false;
msi.ReleaseMouseCapture();
}
private void msi_MouseMove(object sender, System.Windows.Input.MouseEventArgs e)
{
if (isMouseDown && !drag)
{
drag = true;//拖放启用
double w = msi.ViewportWidth;//图形区域
Point po = new Point(msi.ViewportOrigin.X, msi.ViewportOrigin.Y);
msi.UseSprings = false;//禁用弹簧动画
msi.ViewportOrigin = po;//重新赋值坐标
msi.ViewportWidth = w;
zoom = 1 / w;//1表示整个图片 w表示多少区域
msi.UseSprings = true;
}
if (drag)
{
Point newpoint = DeepZoomCurrentPosition;
newpoint.X += (((MouseCurrentPosition.X- e.GetPosition(msi).X ) / msi.ActualWidth) * msi.ViewportWidth);
newpoint.Y += (((MouseCurrentPosition.Y- e.GetPosition(msi).Y )/msi.ActualHeight) * msi.ViewportWidth);
msi.ViewportOrigin = newpoint;
}
}
private Point lastMousePos = new Point();
private void msi_MouseWheel(object sender, System.Windows.Input.MouseWheelEventArgs e)
{
double newzoom = zoom;
if (e.Delta < 0)
{
newzoom /= 1.3;//缩小
}
else
{
newzoom *= 1.3;//放大
}
//转换成0-1之间坐标
Point p = msi.ElementToLogicalPoint(e.GetPosition(null));
zooms(newzoom, p);
} private void zooms(double newzoom, Point p)
{
if (newzoom< 0.5)
newzoom = 0.5;//最小0.5
//newzoom除以zoom 因为1正好整个图片 所以除以上次zoom的数就是缩小或者放大
msi.ZoomAboutLogicalPoint(newzoom / zoom, p.X, p.Y);
zoom = newzoom;
}
{
bool isMouseDown=false;
bool drag = false;
Point MouseCurrentPosition;
Point DeepZoomCurrentPosition;
double zoom = 1;
public MainPage()
{
InitializeComponent();
msi.ViewportChanged += new RoutedEventHandler(msi_ViewportChanged);
msi.MouseLeftButtonDown += new MouseButtonEventHandler(msi_MouseLeftButtonDown);
msi.MouseMove += new MouseEventHandler(msi_MouseMove);
msi.MouseLeftButtonUp += new MouseButtonEventHandler(msi_MouseLeftButtonUp);
msi.MouseWheel += new MouseWheelEventHandler(msi_MouseWheel);
}
void msi_ViewportChanged(object sender, RoutedEventArgs e)
{
Point viewportOrigin = msi.ViewportOrigin;
double viewportWidth = msi.ViewportWidth;
overlayScale.ScaleX = 1 / viewportWidth;
overlayScale.ScaleY = 1 / viewportWidth;
Point newO = LogicalToElement(new Point(), viewportOrigin, viewportWidth);
overlayTranslate.X = newO.X;
overlayTranslate.Y = newO.Y;
}
private Point LogicalToElement(Point p, Point Origin, double Width)
{
return new Point(((p.X - Origin.X) / Width) * msi.ActualWidth,
((p.Y - Origin.Y) / Width) * msi.ActualWidth);
}
public void Zoom(double zoom, Point pointToZoom)
{
Point logicalPoint =this.msi.ElementToLogicalPoint(pointToZoom);
this.msi.ZoomAboutLogicalPoint(zoom, logicalPoint.X, logicalPoint.Y);
}
private void msi_MouseLeftButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
isMouseDown = true;
MouseCurrentPosition = e.GetPosition(msi);
DeepZoomCurrentPosition = msi.ViewportOrigin;
msi.CaptureMouse();
}
private void msi_MouseLeftButtonUp(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
isMouseDown = false;
drag = false;
msi.ReleaseMouseCapture();
}
private void msi_MouseMove(object sender, System.Windows.Input.MouseEventArgs e)
{
if (isMouseDown && !drag)
{
drag = true;//拖放启用
double w = msi.ViewportWidth;//图形区域
Point po = new Point(msi.ViewportOrigin.X, msi.ViewportOrigin.Y);
msi.UseSprings = false;//禁用弹簧动画
msi.ViewportOrigin = po;//重新赋值坐标
msi.ViewportWidth = w;
zoom = 1 / w;//1表示整个图片 w表示多少区域
msi.UseSprings = true;
}
if (drag)
{
Point newpoint = DeepZoomCurrentPosition;
newpoint.X += (((MouseCurrentPosition.X- e.GetPosition(msi).X ) / msi.ActualWidth) * msi.ViewportWidth);
newpoint.Y += (((MouseCurrentPosition.Y- e.GetPosition(msi).Y )/msi.ActualHeight) * msi.ViewportWidth);
msi.ViewportOrigin = newpoint;
}
}
private Point lastMousePos = new Point();
private void msi_MouseWheel(object sender, System.Windows.Input.MouseWheelEventArgs e)
{
double newzoom = zoom;
if (e.Delta < 0)
{
newzoom /= 1.3;//缩小
}
else
{
newzoom *= 1.3;//放大
}
//转换成0-1之间坐标
Point p = msi.ElementToLogicalPoint(e.GetPosition(null));
zooms(newzoom, p);
} private void zooms(double newzoom, Point p)
{
if (newzoom< 0.5)
newzoom = 0.5;//最小0.5
//newzoom除以zoom 因为1正好整个图片 所以除以上次zoom的数就是缩小或者放大
msi.ZoomAboutLogicalPoint(newzoom / zoom, p.X, p.Y);
zoom = newzoom;
}