如何从扩展的 WPF 工具包创建循环 doubleUpDown?
How to create a looping doubleUpDown from extended WPF Toolkit?
我有一个任务,我应该制作一个数字微调器,如果复选框被选中,它也会循环最大最小值,从扩展的 WPF 工具包的 doubleUpDown 派生。有没有办法让我理解递增旋转按钮或递减旋转按钮被按下?这样我就可以为我的数字微调器提供所需的控件?
我做了一个数字微调器,但只使用 WPF,我应该用扩展工具包做一个。
DoubleUpDown 似乎没有提供点击 Up-/Down-Buttons 的事件。但是(来自Documentation you linked):
ValueChanged: Raised when the Value changes. (Inherited from UpDownBase)
值更改事件可以帮助您。在这种情况下,您可以尝试将最小值始终设置为低于用户在文本框中输入的值,将最大值设置为高于用户在文本框中输入的值,并在 ValueChanged 事件中检查这些值以实现 "loop"。不过,这不是最漂亮的解决方案。
我创建了一个小例子。相关xaml:
<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;
}
我有一个任务,我应该制作一个数字微调器,如果复选框被选中,它也会循环最大最小值,从扩展的 WPF 工具包的 doubleUpDown 派生。有没有办法让我理解递增旋转按钮或递减旋转按钮被按下?这样我就可以为我的数字微调器提供所需的控件?
我做了一个数字微调器,但只使用 WPF,我应该用扩展工具包做一个。
DoubleUpDown 似乎没有提供点击 Up-/Down-Buttons 的事件。但是(来自Documentation you linked):
ValueChanged: Raised when the Value changes. (Inherited from UpDownBase)
值更改事件可以帮助您。在这种情况下,您可以尝试将最小值始终设置为低于用户在文本框中输入的值,将最大值设置为高于用户在文本框中输入的值,并在 ValueChanged 事件中检查这些值以实现 "loop"。不过,这不是最漂亮的解决方案。
我创建了一个小例子。相关xaml:
<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;
}