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=-4
和step=2
。但是如果我做slider.Max=4
, slider.Min=-4
和max =0.5
,它仍然更新与之前的txtblUnits
相同的结果,但这次期待像-4->-3.5->3.....->4
一样更新滑块拖动。如何解决这个问题?
你的滑块只拖动一次就会右移到最后的原因是你正在处理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倍的值。
你也应该设置SmallChange
和LargeChange
在你的滑块为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();
}