Silverlight Windows Phone 8滑块控制步长

Silverlight Windows Phone 8滑块控制步长,silverlight,xaml,windows-phone-8,slider,Silverlight,Xaml,Windows Phone 8,Slider,我想做一个这样的滑块: 请注意,每个滑块值之间几乎没有|,用户只能选择这些值 但是我发现设置小零钱和大零钱是没有用的 <TextBlock FontSize="44" Text="{Binding ElementName=ColorDarknessStepsSlider, Path=Value}"/> <Slider x:Name="ColorDarknessStepsSlider" Margin="-12,0" Minimum="3" Maximum="5"

我想做一个这样的滑块:

请注意,每个滑块值之间几乎没有|,用户只能选择这些值

但是我发现设置小零钱和大零钱是没有用的

<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。我怎样才能做到这一点?

您可以使用xaml[编辑:仅存在于WPF中,命名]:

或者通过C[编辑:一种好方法]

希望能有所帮助

对于步长,请使用最小值、最大值和最小更改


对于那些滴答声,试着用滴答声频率和滴答声位置播放

试着使用转换器-我就是这样做的

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;
    }

}
和xaml

<Slider Minimum="400" Maximum="2000" ValueChanged="Slider_ValueChanged"/>

希望能有所帮助

谢谢你的回答,但我相信Windows Phone的滑块控件中没有TickFrequency属性…@EdiWang,你可能是对的,你只想要xaml解决方案吗?此C代码将挂起应用程序-这是一个无限循环-一个更改将导致下一个更改。添加一个可防止此类行为的标志。@Error418正如我现在所想,它可能在没有标志的情况下工作。如果新值与当前值相同,则不会触发某些事件-使用调试模式是一种尝试,因为它没有明确说明如何工作。然而,这是一件值得检查的事情。您可以在操纵完成的事件处理程序中获取值并对其进行取整。然后拇指不会捕捉到整数位置,直到用户放开它。我知道在手机上“易访问”滑块并不能做到这一点,但值得一提的是,Windows应用商店应用程序中的滑块在放开拇指之前不会按刻度线对齐。如果您不希望由于此方法/函数中的值更改而发生多个ValueChanged事件,请在舍入之前删除处理程序,然后在将值设置为新值后再次设置处理程序。请添加一些详细信息,说明如何帮助解决问题
                <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");
        }
    }
  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;
  }
<Slider Minimum="400" Maximum="2000" ValueChanged="Slider_ValueChanged"/>