silverlight图片局部放大效果

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

 

界面:

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

 

原理:

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

 

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

 

尺寸要点:

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

 

关键代码:

复制代码
代码:by 菩提树下的杨过 http://www.cnblogs.com/yjmyzz
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 <= 10)
                {
                    newLeft 
= 10;
                }
                
if (newLeft >= 130)
                {
                    newLeft 
= 130;
                }
                
if (newTop <= 10) { newTop = 10; }
                
if (newTop >= 85) { newTop = 85; }
                element.SetValue(Canvas.TopProperty, newTop);
                element.SetValue(Canvas.LeftProperty, newLeft);
                mousePosition 
= e.GetPosition(element);
                Adjust();
                
if (mousePosition.X <= 0 || mousePosition.Y <= 0) { return; }
                Debug();
            }
        }

        
private void Rectangle_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
        {
            FrameworkElement element 
= sender as FrameworkElement;
            trackingMouseMove 
= false;
            element.ReleaseMouseCapture();
            mousePosition.X 
= mousePosition.Y = 0;
            element.Cursor 
= null;
        }

        
/// <summary>
        
/// 调试信息
        
/// </summary>
        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");
        }


        
/// <summary>
        
/// 调整右侧大图的位置
        
/// </summary>
        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);
        }

    }
}
复制代码

 

 

 

posted @   菩提树下的杨过  阅读(5493)  评论(20编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述
历史上的今天:
2007-12-03 [转贴]ViewState 解码工具
点击右上角即可分享
微信分享提示