最近在用WPF数据绑定重写一下播放器项目时遇到的关于Slider的问题,在窗体透明度调节和播放进度调节上用了Slider控件。调节窗体透明度我是 这么想的:将窗体的Opacity属性的值与Slider的值绑定不就可以了,Opacity="{Binding ElementName=Slider,Path=Value,Mode=OneWay}",这样根本不用处理Slider的值改变事件 (ValueChanged)。不过我要做保存设置的功能,因此肯定要记录Slider的值咯,于是处理一下ValueChanged事件,在里面记录 Slider的值到配置中,退出程序保存配置,启动程序读取配置,再将保存的值赋给Slider的Value。结果我发现我天真了,给了Value但是 Slider根本没有任何变化,调试发现Value确实被保存到了配置中,也就是说根本原因是保存的值赋给Value没有成功,到底是什么原因呢我一直没 弄明白。

另一方面做进度调节的时候,我发现ValueChanged根本不可行,因为播放器的播放进度每1秒赋给Slider的
Value,这样每秒就触发一次ValueChanged事件,而我在播放进度的Slider的ValueChanged事件处理程序又写的是调节播放进
度的代码(就是说Slider划到哪就播放媒体的哪段,做过音乐播放器的肯定会明白的),这样很显然就进入了一个死循环!!

静下来想了想,不应该处理Slider的ValueChanged事件,而是应该当手动调节Slider的值时才去处理,也就是应该处理Slider的MouseLeftButtonUp事件,豁然开朗!!


果我发现我又天真了,尼玛调试一下发现当我手动拉动Slider的滑块然后放出鼠标时,根本不触发MouseLeftButtonUp事件啊,百度一下说
是因为Slider由RepeatButton和Thumb组成,而当你调节Slider时,实际会先出发RepeatButton的
MouseLeftButtonUp,之后会将e.Handled设为true,也就是之后的Slider的MouseLeftButtonUp被忽略掉
了(标记为已处理),所以你永远进不到Slider的MouseLeftButtonUp事件处理事件中。那怎么办呢?WPF有个万能的添加事件处理程序
的方法:AddHandler,使用示例:Slider1.AddHandler(Slider.MouseLeftButtonUp,new
MouseButtonEventHandler(Slider1_MouseLeftButtonUp),true),第三个参数指定不论是否被标记为
已处理(e.Handled=true)都要处理MouseLeftButtonUp事件,至此问题就解决了~

最后总结一下,不要在
XAML中处理Slider的ValueChanged或MouseLeftButtonUp事件,正确处理Slider值改变事件的方式应该是在窗体
Loaded后,使用AddHandler处理Slider的MouseLeftButtonUp事件。至于一开始的疑问,又百度到了,说是Slider
初始化后(给Value赋值),再处理ValueChanged事件就会出异常,这是个BUG啊!

最新文章

  1. ElasticSearch 5学习(7)——分布式集群学习分享2
  2. HTML 定时页面跳转
  3. Android Bitmap占用内存计算公式
  4. sass跨文件重写变量
  5. [CareerCup] 2.3 Delete Node in a Linked List 删除链表的节点
  6. Bootstrap页面布局15 - BS带下拉菜单的按钮
  7. HDU 1392 凸包
  8. BZOJ 1146: [CTSC2008]网络管理Network 树链剖分+线段树+平衡树
  9. Windows版词汇小助手V3.0发布了
  10. [转载] 快速理解Kafka分布式消息队列框架
  11. 2道acm简单题(2010):1.猜数字游戏;2.字符串提取数字并求和;
  12. 3dsmax不同版本 pyside qt UI 设置max窗口为父窗口的方法
  13. 背水一战 Windows 10 (78) - 自定义控件: 基础知识, 依赖属性, 附加属性
  14. setAttribute的浏览器兼容性(转)
  15. Linux-lvm逻辑卷管理和提示丢失pv物理卷
  16. UUChart的使用
  17. Google Map 谷歌地图
  18. Ubuntu 默认启动到命令行 12.04
  19. 1.7.8使用return 停止线程
  20. 常见的加密解密算法-MD5

热门文章

  1. iOS 关于NSString的一些方法
  2. HDU 1088 Write a simple HTML Browser 有点恶心的字符串题
  3. sql语句如何获得当前日期
  4. Oracle基础 exp/imp 数据泵导入/导出 命令
  5. C#调用C++的DLL搜集整理的所有数据类型转换方式
  6. 虚拟机的MAC地址分配与修改
  7. Ubuntu(16.04) 下如何修改(安装)arm-linux-gcc编译器
  8. Kinect For Windows V2开发日志八:侦测、追踪人体骨架
  9. GSS4 2713. Can you answer these queries IV 线段树
  10. Android ViewPager的简单实现