【问题标题】:How to create a looping doubleUpDown from extended WPF Toolkit?如何从扩展的 WPF 工具包创建循环 doubleUpDown?
【发布时间】:2016-08-10 10:35:26
【问题描述】:

我有一个任务,我应该制作一个数字微调器,如果选中了一个复选框,它也会循环通过最大最小值,从扩展的 WPF 工具包的 doubleUpDown 派生。有没有办法我可以理解增量旋转按钮或减量旋转按钮被按下?这样我就可以为我的数字微调器提供所需的控制了吗?

Documentation of DoubleUpDown

我制作了一个数字微调器,但只使用 WPF,我应该使用扩展工具包制作一个。

【问题讨论】:

    标签: c# wpf wpf-extended-toolkit


    【解决方案1】:

    似乎 DoubleUpDown 不提供点击向上/向下按钮的事件。但是(来自Documentation you linked):

    ValueChanged:当值改变时引发。 (继承自UpDownBase)

    值改变事件可以帮助你。在这种情况下,您可以尝试将最小值设置为始终低于 1,将最大值设置为高于用户在文本框中输入的值,并在 ValueChanged 事件中检查这些值以实现“循环”。不过,这不是最漂亮的解决方案。

    我创建了一个小例子。相关的xml:

    <xctk:DoubleUpDown x:Name="Spinner" ClipValueToMinMax="True" Minimum="9" Maximum="21" Value="15" Increment="{Binding ElementName=Increment, Path=Text}" ValueChanged="UpDownBase_OnValueChanged"/>
    <TextBox x:Name="Min" TextChanged="Min_OnTextChanged" Text="10"/>
    <TextBox x:Name="Max" TextChanged="Max_OnTextChanged" Text="20"/>
    <TextBox x:Name="Increment" Text="1"/>
    

    以及后面的代码(xaml.cs):

    private void UpDownBase_OnValueChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
    {
        if ((double) e.NewValue == Spinner.Minimum)
            Spinner.Value = Spinner.Maximum - 1;
        else if ((double) e.NewValue == Spinner.Maximum)
            Spinner.Value = Spinner.Minimum + 1;
    }
    
    private void Min_OnTextChanged(object sender, TextChangedEventArgs e)
    {
        double minimum;
        if (double.TryParse(Min.Text, out minimum))
            Spinner.Minimum = minimum - 1;
    }
    
    private void Max_OnTextChanged(object sender, TextChangedEventArgs e)
    {
        double maximum;
        if (double.TryParse(Max.Text, out maximum))
            Spinner.Maximum = maximum + 1;
    }
    

    然而,最大的问题是它不适用于1 以外的增量值。例如,如果您处于最小值并且想要减少超过一,它仍然会达到最大值。更糟糕的是,当使用小于 1 的增量时,您可能会低于最小值,直到增量达到我们用来检查的minimum - 1。所以如果你想允许双精度数而不仅仅是整数,这个解决方案根本不适合你。

    我认为最好的解决方案是像您一样创建自己的 UserControl,因为您正试图显着改变原始功能。为什么需要使用 DoubleUpDown?


    另一种方法是根本不使用最小值和最大值属性,并在每次发生 ValueChanged 事件时自行处理计算 - 这将解决上述解决方案的问题。

    XAML:

    <xctk:DoubleUpDown x:Name="Spinner" Value="15" Increment="{Binding ElementName=Increment, Path=Text}" ValueChanged="UpDownBase_OnValueChanged"/>
    <TextBox x:Name="Min" TextChanged="Min_OnTextChanged"/>
    <TextBox x:Name="Max" TextChanged="Max_OnTextChanged"/>
    <TextBox x:Name="Increment" Text="1"/>
    

    xaml.cs

    public MainWindow()
    {
        InitializeComponent();
        Min.Text = _currentMinimum.ToString();
        Max.Text = _currentMaximum.ToString();
    }
    
    private double _currentMinimum = 10;
    private double _currentMaximum= 100;
    
    private void UpDownBase_OnValueChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
    {
        if ((double) e.NewValue < _currentMinimum)
            Spinner.Value = (double)e.NewValue + (_currentMaximum - _currentMinimum);
        else if ((double) e.NewValue > _currentMaximum)
            Spinner.Value = (double)e.NewValue - (_currentMaximum - _currentMinimum);
    }
    
    private void Min_OnTextChanged(object sender, TextChangedEventArgs e)
    {
        double minimum;
        if (double.TryParse(Min.Text, out minimum))
            _currentMinimum = minimum;
    }
    
    private void Max_OnTextChanged(object sender, TextChangedEventArgs e)
    {
        double maximum;
        if (double.TryParse(Max.Text, out maximum))
            _currentMaximum= maximum;
    }
    

    【讨论】:

    • 我们不能用 spinner.Increment 代替 1 吗?我真的很喜欢你的回答,我没想过将最大值和最小值设置为看不见的值。好吧,我的工作场所需要这个,我对我只使用 wpf 所做的事情感到非常满意。
    • 是的,您可以随时将最小值和最大值更改为用户值 +- 增量,这将解决小于 1 的值的问题,但仍然存在问题:假设您有最小值10 最大 100 和增量 15,当前值为 20 - 如果你现在点击减量,它将设置为 100,但对于真正的循环,它应该是 95
    • 我有另一个想法,我会在准备好代码 sn-p 后立即编辑我的答案
    • 看起来更干净更实用。我只尝试理解 Spinner.Value 部分,只有那部分。 1 仍然可以随 Increment 变化吗?
    • +/-1 部分使它“更好”,因为这样,最小值和最大值不一样(如果你在 10 上,减 1 会变为 100),但它可以'不能简单地与增量交换。更好的是,只计算没有 +/- 1(现在最小值和最大值之间的距离为 0,所以基本上它们是相同的,只是你接近的方向不同)。我会编辑我的答案
    猜你喜欢
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-12
    • 1970-01-01
    相关资源
    最近更新 更多