2016-08-10 6 views
0

У меня есть задача, чтобы я сделал числовое числовое число, которое также проходит через значения max min, если флажок установлен, полученный из расширенного набора инструментов WPF Toolkit's doubleUpDown. Есть ли способ, которым я могу понять, что нажата кнопка увеличения приращения или нажата кнопка уменьшения уменьшения? Чтобы я мог предоставить необходимые элементы управления моему счетчику числа?Как создать looping doubleUpDown из расширенного набора инструментов WPF?

Documentation of DoubleUpDown

Я сделал номер блесну, но только с помощью WPF, я должен сделать один с расширенным инструментарием.

enter image description here

ответ

0

Кажется 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; 
} 
+0

Можем ли мы использовать spinner.Increment вместо 1? Мне очень понравился ваш ответ, я не думал устанавливать значения max и min для невидимых значений. Ну, на моем рабочем месте это требовалось, я очень доволен тем, что использовал только wpf. –

+0

Да, вы всегда можете изменить минимальное и максимальное значение пользователя + - приращение, которое решило бы проблему для значений меньше 1, но все равно будут проблемы: допустим, у вас минимум 10 максимум 100 и инкремент 15, текущее значение равно 20 - если вы нажмете декремент сейчас, он будет установлен в 100, но для реального цикла это должно быть 95 –

+0

У меня есть другая идея, я отредактирую свой ответ, как только я подготовил фрагмент кода –