正確處理WPF中Slider值改變事件的方式


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM