Silverlight中滑块的Tick频率相当于多少

What is the TickFrequency equivalent of slider in silverlight(Silverlight中滑块的Tick频率相当于多少)
本文介绍了Silverlight中滑块的Tick频率相当于多少的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用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=4slider.Min=-4step=2时,它工作得很好。但如果我执行slider.Max=4slider.Min=-4max =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的值。

您还应该将滑块上的SmallChangeLargeChange设置为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频率相当于多少的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

DispatcherQueue null when trying to update Ui property in ViewModel(尝试更新ViewModel中的Ui属性时DispatcherQueue为空)
Drawing over all windows on multiple monitors(在多个监视器上绘制所有窗口)
Programmatically show the desktop(以编程方式显示桌面)
c# Generic Setlt;Tgt; implementation to access objects by type(按类型访问对象的C#泛型集实现)
InvalidOperationException When using Context Injection in ASP.Net Core(在ASP.NET核心中使用上下文注入时发生InvalidOperationException)
LINQ many-to-many relationship, how to write a correct WHERE clause?(LINQ多对多关系,如何写一个正确的WHERE子句?)