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"/>