Windows Phone 8 Slider控制步长

时间:2014-04-11 13:14:26

标签: silverlight xaml windows-phone-8 slider

我想制作一个这样的滑块: Windows Phone Setting Page Slider

注意有一点“|”在每个滑块值之间,用户只能选择那些值。

但我发现设置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,但它给了我这个:

My Slider

我不知道是什么问题。没有“|”我没事在值之间标记,但至少用户必须只选择整数值3,4,5。我该怎么做?

4 个答案:

答案 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)

对于步长,请使用MinimumMaximumSmallChange

对于那些&#34;刻度线&#34;,尝试使用TickFrequencyTickPlacement

答案 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");
        }
    }