我正在尝试使用 slider
创建一个silverlight
,我遇到的情况是我必须以特定频率拖动滑块,并且使用wpf实现TickFrequency
但我找不到使用silverlight这样做的替代方案。
假设我的滑块是:
Slider slider = new Slider();
在解释我想要做的是:
如果我是一个滑块,其max = 10和min = 1,我的滑块frequncy = 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
相同的结果,但这一次预计会更新滑块拖动,如{{1 }}。
如何解决这个问题?
答案 0 :(得分:1)
您可以这样做,获取您的sliderValueChanged事件以保存当前值,然后为每个更改添加2。或使用滑块的LargeChange和SmallChange属性。
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();
}
答案 1 :(得分:1)
滑块只需一次拖动即可直接移动到最后的原因是您正在处理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
中显示值:它只会有一个因素此方法运行后的-of-2值。
此外,您应该将Slider上的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,而不是步长的最接近的倍数 - 对于步长为2,这将是2。所以对于看原始值是否最接近较低倍数或较高倍数,您应该将模数与步长的一半进行比较。
(5)从上面的例子中,13.152更接近于14而不是12.您可以通过将模数(1.152)与步长的一半(1)进行比较来数学地看到这一点。如果它大于步长的一半,那么您想要使用步长的较高倍数。如果它小于步长的一半,则要使用较低的步长。
(6)如果是模数&gt; halfstep然后从模数中减去步长将给出一个适合从原始滑块值中减去的值。
e.g.
1.152 - 2 = -0.848
13.152 - -0.848 = 14