问题描述
我正在尝试使用silverlight
创建slider
,但我遇到的情况是,我必须以一定的频率拖动滑块,这是在WPF中使用TickFrequency
实现的,但我找不到使用Silverlight执行此操作的替代方法。
假设我的滑块是:
Slider slider = new Slider();
在解释中,我想做的是:
如果我有一个滑块,最大值=10,最小值=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,这样您的用户界面就可以处理用户单击或使用光标键的情况,而不仅仅是依赖于他们的拖动。
编辑:逻辑解释。
(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,而不是步长的最接近倍数-对于步长2,步长将为2。因此,要查看原始值是最接近较低倍数还是较高倍数,您应该将模数与步长的一半进行比较。
(5)从上面的示例中,13.152更接近14,而不是12。通过比较模(1.152)和步长(1)的一半,可以从数学上看出这一点。如果它大于步长的一半,则需要使用步长的较大倍数。如果它小于您要使用的较小步长的一半。(6)如果模数>半步,则从模数中减去步长将得到一个适合从原始滑块值中减去的值。
e.g.
1.152 - 2 = -0.848
13.152 - -0.848 = 14
这篇关于Silverlight中滑块的Tick频率相当于多少的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!