最近在用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啊!

正确处理WPF中Slider值改变事件的方式的更多相关文章

  1. 示例:WPF中Slider控件封装的缓冲播放进度条控件

    原文:示例:WPF中Slider控件封装的缓冲播放进度条控件 一.目的:模仿播放器播放进度条,支持缓冲任务功能 二.进度: 实现类似播放器中带缓存的播放样式(播放区域.缓冲区域.全部区域等样式) 实现 ...

  2. Android 监听EditView中的文本改变事件

    android中的编辑框EditText也比较常用,那比如在搜索框中,没输入一个字,下面的搜索列表就显示有包含输入关键字的选项,这个输入监听怎么实现的呢? 我们可以建一个例子,效果图如下: 我们可以监 ...

  3. LabVIEW设计模式系列——普遍使用值改变事件

    标准: 1.当使用值改变事件时,使用单击时触发或者单击时释放开关动作.这样即保证仅仅触发一次,也保证按钮恢复默认值 标准:1.值改变事件的优点:不论是鼠标动作还是键盘动作都能触发值改变事件,增强了程序 ...

  4. LabVIEW设计模式系列——事件结构中值改变事件

    标准:1.将具有值改变事件的控件,放置在其事件结构的值改变页面里.

  5. Jquery文本框值改变事件兼容性

    Jquery文本框值改变事件(支持火狐.ie)   Jquery值改变事件支持火狐和ie浏览器,并且测试通过,绑定后台代码可以做成autocomplete控件. 具体代码列举如下: ? $(docum ...

  6. Jquery文本框值改变事件(支持火狐、ie)

    Jquery值改变事件支持火狐和ie浏览器,并且测试通过,绑定后台代码可以做成autocomplete控件. 具体代码列举如下: $(document).ready(function () { $(& ...

  7. ie下的值改变事件

    前两天在页面上写了一个值改变事件,值是用js改变的,用的oninput方法和onpropertyChange方法,但是可能是因为框架的缘故,在ie浏览器下,陷入了莫名其妙的循环中.然后考虑是在加载的时 ...

  8. 原生js监听input值改变事件

    哈哈哈,又来了,今天闲来无事,实验了下原生js监听input value值改变事件,下面就来说道说道: 本来写监听input值便获是用jquery的,之前的随笔写了,就是这个方法,地址:http:// ...

  9. 在VS2005中设置WPF中自定义按钮的事件

    原文:在VS2005中设置WPF中自定义按钮的事件 上篇讲了如何在Blend中绘制圆角矩形(http://blog.csdn.net/johnsuna/archive/2007/08/13/17407 ...

随机推荐

  1. Android SQLite 的简单实例

    1.前言: 今天再一次去蹭了一下某老师的android课,这一次讲的是Android的SQLite的使用,老师当场讲解了他自己做的例子. 回来之后,我春心萌动,不得不拿着参考资料再做了一个类似的例子, ...

  2. 使用hibernate配置多数据源链接MySQL和Oracle数据库

    最近做项目要将读取到的数据同时插入到MySQL数据库和Oracle数据库当中,以前都是使用一个数据库,没有用过多数据源的情况,现在把这个问题搞定了,写下来希望对大家有点帮助,可能我所使用的方法不是最好 ...

  3. [Android]Handler的消息机制

    最经面试中,技术面试中有一个是Handler的消息机制,细细想想,我经常用到的Handler无非是在主线程(或者说Activity)新建一个Handler对象,另外一个Thread是异步加载数据,同时 ...

  4. Java IO 技术之基本流类

    流式IO 流(Stream)是字节的源或目的.         两种基本的流是:输入流(Input Stream)和输出流(Output Stream).可从中读出一系列字节的对象称为输入流.而能向其 ...

  5. hdu-5701 中位数计数(中位数)

    题目链接: 中位数计数 Problem Description   中位数定义为所有值从小到大排序后排在正中间的那个数,如果值有偶数个,通常取最中间的两个数值的平均数作为中位数. 现在有nn个数,每个 ...

  6. hdu 4412 利用单调性的动态规划

    思路: 这题和1227的求法一样,只不过1227是小数据,暴力下,就能进行预处理. 这题的预处理区间期望cost[i][j]需要利用单调性. 即假使以pos位置为安排的点,那么这个区间在其左边的概率为 ...

  7. linux /etc/sysctl.conf 禁止别人ping自己

    vi /etc/sysctl.conf如果希望屏蔽别人 ping 你的主机,则加入以下代码:# Disable ping requestsnet.ipv4.icmp_echo_ignore_all = ...

  8. asp.net 之 GC (垃圾回收机制)

    今天抽时间好好整理了下GC相关知识,看了CSDN和博客园的几篇文章,有了一定的简单了解,决定根据个人理解整合一份随笔写下来,望诸位指教. 一:基础问题 1.首先需要知道了解什么是GC? GC如其名,就 ...

  9. AccessHelper类

    using System; using System.Data; using System.Configuration; using System.Data.OleDb; using System.C ...

  10. 项目经理PPT演讲意见

    1.语速 2.互动 3.平常语气,聊天的感觉去讲解 4.脱稿演讲,不要照着PPT读,PPT展示仅仅是一个重点提示,更多在于自己讲解 5.如果是验收等相关的内容,劲量多讲解用户能够得到的利益,如“钱” ...