我想制作一个这样的滑块:
注意有一点“|”在每个滑块值之间,用户只能选择那些值。
但我发现设置SmallChange和LargeChange是没用的。
<TextBlock FontSize="44" Text="{Binding ElementName=ColorDarknessStepsSlider, Path=Value}"/>
<Slider x:Name="ColorDarknessStepsSlider" Margin="-12,0" Minimum="3" Maximum="5"
SmallChange="1" LargeChange="1" />
我希望用户只能选择3,4,5,但它给了我这个:
我不知道是什么问题。没有“|”我没事在值之间标记,但至少用户必须只选择整数值3,4,5。我该怎么做?
答案 0 :(得分:5)
你可以使用xaml [编辑:仅存在于WPF,appologies] :
<Slider x:Name="ColorDarknessStepsSlider" Margin="-12,0" Minimum="3" Maximum="5"
SmallChange="1" LargeChange="1" TickFrequency="1" />
或通过C# [编辑:一个好方法]
private void ColorDarknessStepsSlider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
{
double roundedValue = Math.Round(ColorDarknessStepsSlider.Value, 0);
//Check if it is a rounded value
if(ColorDarknessStepsSlider.Value != roundedValue )
ColorDarknessStepsSlider.Value = roundedValue ;
}
希望它可以提供帮助;)
答案 1 :(得分:3)
private void Slider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
{
int step = 40;
(sender as Slider).Value = (e.NewValue % step != 0) ? (step - e.NewValue % step) + e.NewValue : e.NewValue;
}
和xaml
<Slider Minimum="400" Maximum="2000" ValueChanged="Slider_ValueChanged"/>
希望有所帮助;)
答案 2 :(得分:0)
对于步长,请使用Minimum
,Maximum
,SmallChange
对于那些&#34;刻度线&#34;,尝试使用TickFrequency
和TickPlacement
答案 3 :(得分:0)
尝试使用转换器 - 就是我这样做的。
xaml更改
<Slider x:Name="durationSlider" Margin="-12,0" Minimum="1" Maximum="12"
SmallChange="1" Value="{Binding Settings.Duration, Mode=TwoWay, Converter={StaticResource DoubleToIntConverter}}"/>
public class DoubleToIntConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
int rval = (int)value;
if (value != null)
{
return rval;
}
return 0;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
double val = (double)value;
return (int)val;
}
}
绑定字段
private int _duration;
public int Duration
{
get
{
return _duration;
}
set
{
if (value != _duration)
{
_duration = value;
}
// Do this everytime because the initial input is a float converted down to an int
NotifyPropertyChanged("Duration");
}
}