WPF之鼠标滑动切换图片

原文:WPF之鼠标滑动切换图片

  在网上找了一会儿也没找到我想要的效果,还是自己动手,丰衣足食吧。

  需求:当前面板中只显示一张图片,图片栏的下部有用来显示当前图片处于图片队列中的位置的圆球,并且点击下部栏内的圆球可以快速切换,附动画缓动效果。

 

  比较简单,但是还是简单说一下开发的思路吧。

  主要是要有一个容器放置很多张图片,然后让它们排列好,增加鼠标事件以达到左右滑动的效果,要关联外部控件控制图片的位置,那么就要有一个依赖属性来控制。

  首先,我们来一个Canvas,然后要让里面的子项排列好,不然它们就堆在一起了。(艾玛,你说为啥不用StackPanel呢?)

  #region 绘制窗口//分配容器的大小protected override Size MeasureOverride(Size constraint){Size size = new Size(_width, _height);foreach (UIElement e in InternalChildren){e.Measure(new Size(_width, _height));}return size;}//分配子项的大小protected override Size ArrangeOverride(Size arrangeSize){for (int i = 0; i < InternalChildren.Count; i++){InternalChildren[i].Arrange(new Rect(i * _width, 0, _width, _height));}return arrangeSize;}#endregion
绘制窗口

  然后为Canvas加上鼠标事件用来滑动,其实这个很简单的,就是鼠标摁下去的点和起来的点的一个距离判断,如果距离够了,就移动一个子项的距离,至于左右就要看你自己怎么设置了,这里也是为什么不用StackPanel的原因了,

  因为这边Canvas我绘制的窗口之中,我会去设置子项的大小,然后根据子项的大小来实现滑动及统一,这样比较方便。

      void CanvasWithPhoto_MouseUp(object sender, System.Windows.Input.MouseButtonEventArgs e){_endPoint = e.GetPosition(App.Current.MainWindow);//X轴滑动的距离double offsetX = _startPoint.X - _endPoint.X;if (offsetX > 10 && Index < _totalPage){++Index;}else if (offsetX < -10 && Index > 1){--Index;}Move(Index);}//X轴的移动动画private void Move(int Index){DoubleAnimation animation = new DoubleAnimation(-(Index - 1) * _width, TimeSpan.FromMilliseconds(500));animation.DecelerationRatio = 0.2;animation.AccelerationRatio = 0.2;_translate.BeginAnimation(TranslateTransform.XProperty, animation);}void CanvasWithPhoto_MouseDown(object sender, System.Windows.Input.MouseButtonEventArgs e){_startPoint = e.GetPosition(App.Current.MainWindow);}
鼠标事件

  艾玛,这里就有人说了那Index是什么啊,这里就是当前页面了,因为需求里面是想快速定位到图片的,第三张跳到第七张这个样子的,所以用了一个Index,这个就是依赖属性,而且添加了一个自定义的事件,留出一个接口方便以后使用,其实这个程序里面我也没有用上,纯粹就是习惯。

  //当前页public int Index{get { return (int)GetValue(IndexProperty); }set { SetValue(IndexProperty, value); }}public static readonly DependencyProperty IndexProperty =DependencyProperty.Register("Index", typeof(int), typeof(CanvasWithPhoto), new FrameworkPropertyMetadata(1, new PropertyChangedCallback(OniIndexChanged)));public static void OniIndexChanged(DependencyObject sender,DependencyPropertyChangedEventArgs e){CanvasWithPhoto c = (CanvasWithPhoto)sender;int newValue = (int)e.NewValue;int oldValue = (int)e.OldValue;c.Index = (int)e.NewValue;c.OnIndexChanged(oldValue, newValue);}private void OnIndexChanged(int oldValue, int newValue){RoutedPropertyChangedEventArgs<int> args= new RoutedPropertyChangedEventArgs<int>(oldValue, newValue);args.RoutedEvent = IndexChangedEvent;RaiseEvent(args);Move(newValue);}public static RoutedEvent IndexChangedEvent =EventManager.RegisterRoutedEvent("IndexChanged", RoutingStrategy.Bubble, typeof(RoutedPropertyChangedEventHandler<int>), typeof(CanvasWithPhoto));public event RoutedPropertyChangedEventHandler<int> IndexChanged{add { AddHandler(IndexChangedEvent, value); }remove { RemoveHandler(IndexChangedEvent, value); }}
依赖属性

最后,自定义的CanvasWithImage是不会限制长度的,这样就会有一个图片会全部显示出来的问题,这里我是用一个StackPanel包裹住,这个StackPanel是有一个宽度限制的,ClipToBounds="True",设置这个属性,会讲超出部分的内容裁减隐藏。

简陋的效果图:

软件环境:VisualStudio2010 + Windows 7

http://download.csdn.net/detail/qq278709708/9150335

不足的地方大家多多指教

 

  

  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/538040.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CPU的核心数、线程数的关系和区别

原文地址&#xff1a;http://blog.csdn.net/yu132563/article/details/45222935 ------------------------------------- 我们在选购电脑的时候&#xff0c;CPU是一个需要考虑到核心因素&#xff0c;因为它决定了电脑的性能等级。CPU从早期的单核&#xff0c;发展到现在的双核…

mysql in 子查询优化_mysql in 子查询 容易优化

mysql in 子查询 简单优化 大数量下&#xff0c;不要使用 in 嵌套子查询&#xff0c;性能很差&#xff0c;很容易卡死。 ? 简单调整方式如下&#xff1a; select uid,nick_name from uc_users where uid in(select fid from uc_follow where uid#uid#) ? 可拆解成&#xff1a…

谷歌浏览器插件入门示例

2019独角兽企业重金招聘Python工程师标准>>> 实现&#xff1a;任何网址实现图片下载和获取当前域名的cookies的json字符串。 图片下载是给小白用的&#xff0c;可以选中批量下载&#xff0c;获取cookies 是为了方便程序员调试用。 获取cookies: git地址&#xff1a;…

Fiddler中response乱码的解决方案

原文连接&#xff1a;http://blog.csdn.net/quiet_girl/article/details/50577828 ---------------------------------------------------------- 有时候我们看到Response中的HTML是乱码的&#xff0c; 这是因为HTML被压缩了&#xff0c; 我们可以通过两种方法去解压缩。 解决…

线程带来的风险

线程安全性问题 多线程环境下 多个线程共享一个资源对资源进行非原子性操作。 以上三者都存在就会发生线程安全性问题 如文中的卖火车票问题&#xff1a;http://blog.csdn.net/zengmingen/article/details/53217229 原因是&#xff1a;一行java代码转成.class字节码文件后是…

vue内引入语音播报功能

为什么80%的码农都做不了架构师&#xff1f;>>> 在vue项目中引入语音播报&#xff0c;使用的科大讯飞语音接入&#xff0c; 具体思路为每次接收到语音信息后存入一个数组&#xff0c;然后监听这个数组&#xff0c;开始冲第一个索引播放&#xff0c;并且同时根据vue…

php mysql 排序规则_php 数组排序以及按照某个字段排序

如果你已经使用了一段时间PHP的话&#xff0c;那么&#xff0c;你应该已经对它的数组比较熟悉了——这种数据结构允许你在单个变量中存储多个值&#xff0c;并且可以把它们作为一个集合进行操作。经常&#xff0c;开发人员发现在PHP中使用这种数据结构对值或者数组元素进行排序…

单例问题与线程安全

饿汉式 没有线程安全性问题 懒汉式 public class SingletonDemo2 {private static SingletonDemo2 instance;private SingletonDemo2() {}public static SingletonDemo2 getInstance() {if(instancenull) {instancenew SingletonDemo2();}return instance;}}如果遇到多线程。上…

python 音速_中国大学MOOC的APP(慕课)2021用Python玩转数据章节答案

在高技术战争件下,信息的获取相当于人的感觉器官,信息的传输相当于人的神经网络,信息的处理相当于人的大脑,( )则将它们联系为一个整体,构成了作战的神经系统。车身可拆卸的连接有螺纹连接、卡口链接、铰链连接。在高技术战争件下,信息的获取相当于人的感觉器官,信息的传输相当…

Mysql中的触发器

原文地址&#xff1a;https://www.cnblogs.com/zyshi/p/6618839.html ---------------------------------------------------------什么是触发器 简单的说&#xff0c;就是一张表发生了某件事&#xff08;插入、删除、更新操作&#xff09;&#xff0c;然后自动触发了预先编写好…

一张图理解JS的原型(prototype、_proto_、constructor的三角关系)

注意&#xff1a;前方高能预警&#xff0c;请认真仔细看完&#xff0c;阅读完后自己再次画下原型图&#xff0c;相信你一定会有更深刻的认识。(推荐炒鸡好用的画流程图的软件ProcessOn)构造函数&#xff1a;function Foo ( ) { };实例对象&#xff1a;let f1new Foo;let o1new …

Oracle触发器和MySQL触发器之间的区别

原文链接&#xff1a;http://blog.csdn.net/a19881029/article/details/37820363 -----------------------------------------------------------Oracle触发器格式&#xff1a;[plain] view plaincopyCREATE [OR REPLACE] TRIGGER trigger_name BEFORE|AFTER INSERT|UPDA…

下列选项中不符合python语言变量命名规则的是_学习Python第二日--基本概念和类型...

编程语言分类:解释型语言和编译型语言。解释型语言不会产生额外的文件,运行时一行一行的翻译。编译型语言需要产生一个额外的文件,是电脑能够识别的内容,运行后将产生额外的文件。 变量是可变的量,是它的值可以发生改变。变量的作用是保存值,保存的值可以是数据,而且保存…

HashMap死锁原因及替代方案

原文链接&#xff1a;http://blog.csdn.net/fhzaitian/article/details/51505516 ------------------------------------------------------------------------1、首先我们需要简单地了解一下HashMap数据结构 HashMap通常会用一个指针数组&#xff08;假设为table[]&#xff09…

优化mysql数据库_MySQL数据库十大优化技巧

WEB开发者不光要解决程序的效率问题&#xff0c;对数据库的快速访问和相应也是一个大问题。希望本文能对大家掌握MySQL优化技巧有所帮助。1. 优化你的MySQL查询缓存在MySQL服务器上进行查询&#xff0c;可以启用高速查询缓存。让数据库引擎在后台悄悄的处理是提高性能的最有效方…

跋山涉水——深入 Redis 字典遍历

Redis 字典的遍历过程逻辑比较复杂&#xff0c;互联网上对这一块的分析讲解非常少。我也花了不少时间对源码的细节进行了整理&#xff0c;将我个人对字典遍历逻辑的理解呈现给各位读者。也许读者们对字典的遍历过程有比我更好的理解&#xff0c;还请不吝指教。一边遍历一边修改…

linux下VI模式中上下左右键和回退键出现字母

原文地址&#xff1a;http://blog.csdn.net/u012860950/article/details/50127779 ---------------------------------------------------------------- 1.编辑/etc/vim/vimrc.tiny 由于/etc/vim/vimrc.tiny的拥有者是root用户&#xff0c;所以要在root的权限下对这个文件进行修…

mysql数据库查询优化建议_mysql数据库查询优化的24条建议

MySQL是一个强大的开源数据库。随着MySQL上的应用越来越多&#xff0c;MySQL逐渐遇到了瓶颈。这里提供一些关于Mysql 数据库查询优化的24条优化建议&#xff0c;仅供参考。Mysql 查询优化1、使用慢查询日志&#xff0c;找出执行慢的查询。2、使用 EXPLAIN 来决定查询功能是否合…

常规sql读取CLOB

plsql下&#xff0c;普通sqlsql-cmd下总结&#xff1a; 常规的sql&#xff0c;查询clob字段&#xff0c;只能显示部分内容。 查clob内容select dbms_lob.substr(c_content) from table_content t dbms_lob.substr将大文本转换字符类型读出来.dbms_lob.substr的转换对字段conten…

精解 ES6箭头函数

&#x1f431; 个人主页&#xff1a;SHOW科技&#xff0c;公众号&#xff1a;SHOW科技 &#x1f64b;‍♂️ 作者简介&#xff1a;2020参加工作&#xff0c;专注于前端各领域技术&#xff0c;共同学习共同进步&#xff0c;一起加油呀&#xff01; &#x1f4ab;优质专栏&#x…