TickFrequency相当于silverlight中的slider是什么?

本文关键字:是什么 slider 中的 相当于 silverlight TickFrequency | 更新日期: 2023-09-27 18:10:43

我试图使用 silverlight 创建一个slider,我的情况是我必须以一定的频率拖动滑块,这是在使用TickFrequency的wpf中实现的,但我找不到使用silverlight的替代方法。

假设我的滑块是:

Slider slider = new Slider();

在解释我想做的是:如果我有一个滑块它的max= 10 min=1我的滑块频率=2那么我想要的是当我拖动滑块时,它必须通过0->2>4>6>8>10拖动。不像:0->1>2>3>4>5>6>7>8>9>10

现在,有人能帮我一下吗?

我试过了:

slider.LostMouseCapture += (o, e) =>
        {
            double distanceFromFactor = slider.Value % 2;
            if (distanceFromFactor > 1)
                distanceFromFactor = distanceFromFactor - step; //This step is decided dynamically rather 2/0.5/3 or whatever..
            slider.Value -= distanceFromFactor;
            txtblUnits.Text = Math.Round(slider.Value).ToString() + " units";
        };

但问题是,当它的工作很好,当我有slider.Max=4, slider.Min=-4step=2。但是如果我做slider.Max=4, slider.Min=-4max =0.5,它仍然更新与之前的txtblUnits相同的结果,但这次期待像-4->-3.5->3.....->4一样更新滑块拖动。如何解决这个问题?

TickFrequency相当于silverlight中的slider是什么?

你的滑块只拖动一次就会右移到最后的原因是你正在处理ValueChanged事件,并改变其中滑块的值,这会引发ValueChanged事件,这会改变滑块的值,从而引发ValueChanged事件……重复,直到厌烦为止。

相反,您可以使用LostMouseCapture事件来检测鼠标何时被释放,然后将值量化为所需的增量。像这样:

private void MySlider_OnLostMouseCapture(object sender, MouseEventArgs e)
        {
            var step = 2;
            var halfStep = step/2;
            var distanceFromFactorOfStep = MySlider.Value % step;
            if (distanceFromFactorOfStep > halfStep)
                distanceFromFactorOfStep = distanceFromFactorOfStep - step;
            MySlider.Value -= distanceFromFactorOfStep;
        }

注意:这只会在鼠标被释放时改变Value,所以你不能使用实时绑定来显示TextBox中的值:在这个方法运行后,它只会有一个2倍的值。

你也应该设置SmallChangeLargeChange在你的滑块为2,这样你的UI可以应付用户点击或使用光标键,而不仅仅是依靠他们拖动。

编辑:逻辑解释

(1)要增加/减少步长值,您需要将slider.Value限制为步长的倍数。(2)对原始滑块值取模,可以得到与步长最近、最低的因子之间的"距离"。

E.g. With a step size of 2 and a raw slider value of 2.532,
the modulo will be 0.532 (2.532%2 = 0.532). 
With a raw slider value of 13.152 the modulo will be 1.152. 

(3)你可以取这个模值,从你的原始值中减去它,得到一个新的滑块值,它是你的步长的倍数。

e.g. 
2.532 - 0.532 = 2.
13.152 - 1.152 = 12

(4)但是这种四舍五入意味着原始滑块值1.99999(例如)将被转换为0,而不是step的最接近倍数-对于步长为2,这将是2。因此,要查看原始值是最接近低倍数还是更高倍数,您应该将模量与步长的一半进行比较。

(5)从上面的例子来看,13.152更接近14而不是12。通过将模(1.152)与步长(1)的一半进行比较,你可以在数学上看到这一点。如果模(1.152)大于步长(1)的一半,那么你想使用较大的步长倍数。如果它小于步长的一半,则使用较低的。

(6)如果模>半步,那么从模中减去步长将得到一个适合从原始滑块值中减去的值。

e.g.
1.152 - 2 = -0.848
13.152 - -0.848 = 14

你可以这样做,让你的sliderValueChanged事件保存当前,然后添加2到每一个变化。或使用滑块的大改变和小改变属性。

Slider slid = new Slider(); 
public MainPage() 
{ 
InitializeComponent(); 
slid.LargeChange = 2.0; 
slid.SmallChange = 0.0; 
LayoutRoot.Children.Add(slid); 
slid.ValueChanged += new RoutedPropertyChangedEventHandler<double>(sldr_ValueChanged); 
} 
void sldr_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e) 
{ 
slid.Value = Math.Round(e.NewValue * 2) / 2; 
txtBox1.Text = slid.Value.ToString(); 
}