silverlight实现图片局部放大效果的方法
本文实例讲述了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.图片原始大小/左侧小图大小=右侧可视区域大小/半透明矩形大小
关键代码:
usingSystem.Windows; usingSystem.Windows.Controls; usingSystem.Windows.Input; namespacePartMagnifier { publicpartialclassMainPage:UserControl { booltrackingMouseMove=false; PointmousePosition; publicMainPage() { //为初始化变量所必需 InitializeComponent(); } privatevoidLayoutRoot_Loaded(objectsender,System.Windows.RoutedEventArgse) { Adjust(); } privatevoidRectangle_MouseLeftButtonDown(objectsender,MouseButtonEventArgse) { FrameworkElementelement=senderasFrameworkElement; mousePosition=e.GetPosition(element); trackingMouseMove=true; if(null!=element) { element.CaptureMouse(); element.Cursor=Cursors.Hand; } Adjust(); Debug(); sb.Begin();//标题动画,可去掉 } privatevoidRectangle_MouseMove(objectsender,MouseEventArgse) { FrameworkElementelement=senderasFrameworkElement; if(trackingMouseMove) { doubledeltaV=e.GetPosition(element).Y-mousePosition.Y; doubledeltaH=e.GetPosition(element).X-mousePosition.X; doublenewTop=deltaV+(double)element.GetValue(Canvas.TopProperty); doublenewLeft=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(); } } privatevoidRectangle_MouseLeftButtonUp(objectsender,MouseButtonEventArgse) { FrameworkElementelement=senderasFrameworkElement; trackingMouseMove=false; element.ReleaseMouseCapture(); mousePosition.X=mousePosition.Y=0; element.Cursor=null; } //////调试信息 /// voidDebug() { 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"); } //////调整右侧大图的位置 /// voidAdjust() { doublen=cBig.Width/rect.Width; doubleleft=(double)rect.GetValue(Canvas.LeftProperty)-10; doubletop=(double)rect.GetValue(Canvas.TopProperty)-10; doublenewLeft=-left*n; doublenewTop=-top*n; img.SetValue(Canvas.LeftProperty,newLeft); img.SetValue(Canvas.TopProperty,newTop); } } }
更多关于C#相关内容感兴趣的读者可查看本站专题:《C#图片操作技巧汇总》、《C#常见控件用法教程》、《WinForm控件用法总结》、《C#数据结构与算法教程》、《C#面向对象程序设计入门教程》及《C#程序设计之线程使用技巧总结》
希望本文所述对大家C#程序设计有所帮助。