Silverlight中的TickFrequency等价物是什么?

时间:2014-06-30 09:12:47

标签: c# .net silverlight slider silverlight-5.0

我正在尝试使用 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=4slider.Min=-4step=2时,它工作正常。但是,如果我执行slider.Max=4slider.Min=-4max =0.5,它仍会更新与上一个txtblUnits相同的结果,但这一次预计会更新滑块拖动,如{{1 }}。 如何解决这个问题?

2 个答案:

答案 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上的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,而不是步长的最接近的倍数 - 对于步长为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