滑块的行为取决于最小 - 最大范围

时间:2014-07-13 08:40:19

标签: c# xaml windows-runtime windows-phone-8.1

我正在使用Windows Phone 8.1 Runtime,我遇到了一个奇怪的问题。

让我们定义两个几乎相同的 Silders

<Slider Header="Values 0.1-0.9" Grid.Row="0" HorizontalAlignment="Stretch" TickFrequency="0.05" TickPlacement="Inline"
        Minimum="0.1" Maximum="0.9" Value="0.2"/>
<Slider Header="Values 1.0-9.0" Grid.Row="1" HorizontalAlignment="Stretch" TickFrequency="0.5"  TickPlacement="Inline"
        Minimum="1" Maximum="9" Value="2"/>

正如您所看到的,第二个滑块仅区分第一个滑块(10次)。但事实证明第一个没有正常工作(参见附图) - 值似乎从0开始(认为你不能将它设置在设定的最小值0.1以下 - 你总是从0开始有很少的水平轨迹)。

这似乎是一个小错误(可能在某处将最小值四舍五入?),但也许我错过了一些东西。有没有办法让它的值小于1.0(不使用转换器)?

sliders

1 个答案:

答案 0 :(得分:1)

你在那里发现了一个有趣的问题。问题为+1。

我检查了它们,当最小值和最大值不是整数时,内置滑块看起来确实不能很好地工作。我可以想出3种方法来解决这个问题。

<强> 1。将包装器属性添加到VM类(我假设您要绑定值,因为您提到了转换器)

我们的想法是将另一个属性添加到您绑定的VM中,如下所示:

//Lets assume that the original property that ranges from 0.1 to 0.9 is called MyProp
public double MyPropBinding {
    get {
        return this.MyProp * 10.0;
    }
    set {
        this.MyProp = value / 10.0;
    }
}

这基本上非常简单,不需要额外的课程,这是转换器最大的问题。但是,如果你有10个需要这样做的VM类,它可能并不完美。

<强> 2。使用转换器

是的,我知道你要求没有转换器的选项,但我想说它实际上是一个非常好的选择。不是很酷,因为你需要另一个类和更长的绑定文本,但不需要任何研究。时间很珍贵!基本上你可以在几分钟内以非黑客的方式解决你的问题。

第3。修复滑块(以这种或那种方式)

我认为您可以扩展Slider并为其添加一些属性,这将解决它。例如:Scale(在您的情况下为10)和ValueScaled,它们将是Value / Scale。因此,您将使用自定义Slider,Min和Max将为1和9,Scale将为10,并且您将拥有ValueScaled,这将是您实际需要的值。

P.S。我还没有对它进行过多次研究,因为我认为其中至少有一项应该适合你(以及其他所有人)。那里可能有更酷的解决方案。 :)