WPF的Slider控件繼承自RangeBase類型,同繼承自RangeBase的控件還有ProgressBar和ScrollBar,這類控件都是在一定數值范圍內表示一個值的用途。
首先注意而RangeBase是基於浮點double類型的,不是基於整數int的,WPF中的許多度量單位都是基於浮點的。
對於Slider來說,RangeBase的Minimum(最小值)默認是0,Maximum(最大值)默認是10,Value(當前值)默認是0。
接下來就是RangeBase的剩余兩個變量,SmallChange和LargeChange。SmallChange用來當Slider有焦點時,使用鍵盤的左右箭頭來改變值的大小,而LargeChange則是點擊Slider條的空白部分造成值的改變大小(和滾動條類似)。
SmallChange默認是0.1,LargeChange默認是1。
注意由於浮點數的表示涉及到精度的問題,某些值的表示無法准確而只能存儲成近似值,所以一個空空的默認Slider會有如下問題:
首先XAML,一個默認Slider,下面一個TextBlock綁定Value屬性來顯示當前值:
<Slider Name="slider"/>
<TextBlock Text="{Binding ElementName=slider,Path=Value}"/>
運行程序,如果你從左往右按住右箭頭(這樣是SmallChange:0.1),結果會是:
而如果把值先設置成最右的10,然后按住左箭頭從右往左滑動,結果會是:
問題看到了吧,Slider不僅把內部丑陋的冗長小數顯示出來,而且還由於浮點數精度問題顯示的值還不一樣,上面兩個圖本來顯示的都是8.3這個數。
由於Slider是基於RangeBase的,后者又是基於浮點數的,所以滑動值時作出的改變肯定是按浮點數的方式改變的,改變后的結果不一定是整數,為此我們可以吧Slider分成一段一段的,然后每一個段代表一個整數,讓Slider僅在這些段中滑動,這個段就是Slider中所謂的”Tick”。具體每段的間隔可以用TickFrequency來設置,這個TickFrequency默認已經是1的,但是為了讓Slider在Tick中移動,還需要設置IsSnapToTickEnabled屬性。
這樣的話:
<Slider Name="slider" IsSnapToTickEnabled="True"/>
<TextBlock Text="{Binding ElementName=slider,Path=Value}"/>
結果就是無論怎樣移動Slider的位置,值都會是整數。
不過Slider的Tick默認是不顯示的,TickPlacement默認是None,通過調節TickPlacement,我們可以讓Slider的Tick顯示出來:
<Slider Name="slider" IsSnapToTickEnabled="True" TickPlacement="Both"/>
結果:可以看到由於TickPlacement設置成了Both,Slider上下出現了兩列小點代表Tick。
上面都是按照TickFrequency均勻分布的Tick,Slider還有一個Ticks屬性(類型是DoubleCollection)可以完全自定義所有Tick,Ticks被定義后,TickFrequency就沒有意義了,如下代碼:
<Slider Name="slider" IsSnapToTickEnabled="True" TickPlacement="Both" Ticks="0.5 1.0 1.5 3.0"/>
仔細觀察Slider,它的Tick會按照Ticks屬性的定義變成這樣:
有了上述知識,我們可以把WPF得Slider控件調整地再人性化一些,如下代碼:
<StackPanel>
<UniformGrid Columns="3" Rows="1" Margin="1">
<TextBlock Text="{Binding ElementName=slider,Path=Minimum}"
TextAlignment="Left"/>
<TextBlock Text="{Binding ElementName=slider,Path=Value}"
TextAlignment="Center"/>
<TextBlock Text="{Binding ElementName=slider,Path=Maximum}"
TextAlignment="Right"/>
</UniformGrid>
<Slider Name="slider"
IsSnapToTickEnabled="True"
TickPlacement="TopLeft"
/>
</StackPanel>
運行結果:
最后WPF的Slider還支持把一部分范圍的選項高亮化(也就是所謂的SelectionRange:選擇范圍),沒有什么實際意義,僅僅是界面上的高亮,不過還是很有意思的。實現需要設置Slider的IsSelectionRangeEnabled為True,接着設置SelectionStart和SelectionEnd來標記具體范圍。
如下代碼:
<Slider Name="slider" IsSnapToTickEnabled="True" TickPlacement="Both"
IsSelectionRangeEnabled="True"
SelectionStart="2" SelectionEnd="5"/>
<TextBlock Text="{Binding ElementName=slider,Path=Value}"/>
運行結果:
另外Slider控件還有Direction屬性可以調節顯示方向,IsDirectionReversed屬性反轉方向,Delay屬性控制內部RepeatButton的重復時段還有一些關於提示框的顯示設置,這些屬性相對使用上比較少見(或者較好理解)這里就不多講了,讀者可以根據需求瀏覽MSDN。