Кажется DoubleUpDown не обеспечивает события за клики на повышающей/понижающей кнопке. Но (от Documentation you linked):
ValueChanged: Поднимается при изменении значения. (Унаследовано от UpDownBase)
Значение измененного события может помочь вам. В этом случае вы можете попытаться установить минимальный минимум на 1 нижний и максимум 1 выше, чем пользователь, введенный в текстовые поля, и проверить эти значения в событии ValueChanged для достижения «цикла». Не самое приятное решение.
Я создал небольшой пример. Соответствующий 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, yo может пойти ниже вашего минимума, пока инкремент не достигнет 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? Мне очень понравился ваш ответ, я не думал устанавливать значения max и min для невидимых значений. Ну, на моем рабочем месте это требовалось, я очень доволен тем, что использовал только wpf. –
Да, вы всегда можете изменить минимальное и максимальное значение пользователя + - приращение, которое решило бы проблему для значений меньше 1, но все равно будут проблемы: допустим, у вас минимум 10 максимум 100 и инкремент 15, текущее значение равно 20 - если вы нажмете декремент сейчас, он будет установлен в 100, но для реального цикла это должно быть 95 –
У меня есть другая идея, я отредактирую свой ответ, как только я подготовил фрагмент кода –