ITPub博客

首页 > IT职业 > IT生活 > silverlight图片局部放大效果

silverlight图片局部放大效果

IT生活 作者:nighteagle 时间:2021-09-09 09:14:39 0 删除 编辑

很多购物平台中(比如京东购物),浏览产品详情时都有这种效果,前几天看到有朋友问SL能不能实现,当然可以 

图片描述    

 

界面:

1.左侧小图片(用一个矩形Fill一张图片即可)
2.左侧半透明矩形
3.右侧大图片(用一个Canvas设置Clip裁剪可视区域作为蒙板,图片放置在Canvas中即可)

 

原理:

获取左侧半透明矩形的相对位置,然后动态调整右侧大图的Canvas.Left与Canvas.Top

 

需要知道以下技术点:
1.Clip的应用
2.如何拖动对象
3.拖动时的边界检测
4.动态调整对象的Canvas.Left与Canvas.Top属性

 

尺寸要点:

1.右侧大图可视区域与左侧半透明矩形的“长宽比例”应该相同
2.“图片原始尺寸长度比” 应该 “与左侧小图片长度比”相同
3.图片原始大小/左侧小图大小 = 右侧可视区域大小/半透明矩形大小

 

关键代码:

using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
namespace PartMagnifier
{
    public partial class MainPage : UserControl
    {
        bool trackingMouseMove = false;
        Point mousePosition;
        public MainPage()
        {
            // 为初始化变量所必需
            InitializeComponent();
        }
        private void LayoutRoot_Loaded(object sender, System.Windows.RoutedEventArgs e)
        {
            Adjust();
        }
        private void Rectangle_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            FrameworkElement element = sender as FrameworkElement;
            mousePosition = e.GetPosition(element);
            trackingMouseMove = true;
            if (null != element)
            {
                element.CaptureMouse();
                element.Cursor = Cursors.Hand;
            }
            Adjust();
            Debug();
            sb.Begin();//标题动画,可去掉
        }
        private void Rectangle_MouseMove(object sender, MouseEventArgs e)
        {
            FrameworkElement element = sender as FrameworkElement;
            if (trackingMouseMove)
            {
                double deltaV = e.GetPosition(element).Y - mousePosition.Y;
                double deltaH = e.GetPosition(element).X - mousePosition.X;
                double newTop = deltaV + (double)element.GetValue(Canvas.TopProperty);
                double newLeft = deltaH + (double)element.GetValue(Canvas.LeftProperty);
                if (newLeft = 130)
                {
                    newLeft = 130;
                }
                if (newTop = 85) { newTop = 85; }
                element.SetValue(Canvas.TopProperty, newTop);
                element.SetValue(Canvas.LeftProperty, newLeft);
                mousePosition = e.GetPosition(element);
                Adjust();
                if (mousePosition.X 
        /// 调试信息
        /// 
        void Debug()
        {
          txtResult.Text = "鼠标相对坐标:" + mousePosition.ToString() + "n小框left:" + rect.GetValue(Canvas.LeftProperty) + ",
         小框top:" + rect.GetValue(Canvas.TopProperty) + "n大图left:" + ((double)img.GetValue(Canvas.LeftProperty)).ToString("F0") +
          ",大图right:" + ((double)img.GetValue(Canvas.TopProperty)).ToString("F0");
        }
        /// 
        /// 调整右侧大图的位置
        /// 
        void Adjust()
        {
            
            double n = cBig.Width / rect.Width;
            double left = (double)rect.GetValue(Canvas.LeftProperty) - 10;
            double top = (double)rect.GetValue(Canvas.TopProperty) - 10;
            double newLeft = -left * n;
            double newTop = -top * n;
            img.SetValue(Canvas.LeftProperty, newLeft);
            img.SetValue(Canvas.TopProperty, newTop);
        }
    }
}


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/4363/viewspace-2801071/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2019-08-12

  • 博文量
    97
  • 访问量
    740