Ajuste fino do componente Slider

Trabalhando em um projeto WPF sofri um monte para tentar fazer com que o valor selecionado em um controle Slider se ajustasse apenas a valores inteiros. Sim, estou iniciando – um pouco tarde é verdade– no uso do WPF, mas chego lá!

O XAML básico é o seguinte:

<Page xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation' xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml'>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="auto" />
<RowDefinition Height="auto" />
</Grid.RowDefinitions>
<TextBlock Text="Hello"
Padding="10"/>
<Slider x:Name="mySlider"
Grid.Row="1"
Maximum="100"
Minimum="0" />
</Grid>
</Page
>


Este código pode ser feito em um editor básico como o bloco de notas do Windows. Salve-o com a extensão Xaml. Com um clique duplo no arquivo, o mesmo é exibido dentro do browser como a figura 1 demonstra.


image

A ideia básica é fazer com que a medida que o slider seja movido, o texto seja alterado para representar o valor selecionado. Para isso altere o código do controle TextBlock para vincular o seu binding com o Slider:



		<TextBlock Text="{Binding ElementName=mySlider, Path=Value, Mode=TwoWay}"
Padding="10"
/>


Com isto, o ressultado passa ser o que se vê na figura 2.



image



Porém, tem um efeito indesejado que mostrar os valores decimais. Para evitar isto, uma solução é primeiramente ajustar os intervalos com as propriedades TickFrequency e TickPlacement configuradas como abaixo.



		<Slider x:Name="mySlider" Grid.Row="1"
Maximum="100"
TickFrequency="5"
TickPlacement="TopLeft"
Minimum="0"
/>


Com isso, passam a ser exibidas marcas para cada intervalo configurado:



image



E para fazer com que o slider se mova obedecendo as marcas, configure a propriedade IsSnapToTickEnabled para True, desta forma, somente será possível mover o slider dentro dos valores estabelecidos.



image



WPF e XAML são muito versáteis. Talvez você, assim como eu, tenha alguma dificuldade em encontrar as informações necessárias, mas, com um pouco de persistência os resultados são compensadores.