关于deepzoom在blend里面导出并且实现放大缩小以及平移。

来源:互联网 发布:听见下雨的声音 知乎 编辑:程序博客网 时间:2024/04/29 03:00
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;
        }
       
原创粉丝点击