Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > WPF, UWP, WinRT, XAML
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.08.2010, 17:54   #1
Casper-SC
Форумчанин
 
Регистрация: 04.07.2007
Сообщений: 549
По умолчанию NumericUpDown на WPF. MinValue и MaxValue, сделать изменяемыми.

Здравствуйте. Вот поделился со мной 1 человек компонентом NumericUpDown для WPF. Выглядит убого (самостоятельно нужно делать шаблон), но зато работает как надо. Вот я не могу никак сделать так, чтобы можно было менять MinValue и MaxValue.

Код:
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;

namespace CustomControlLibrary
{
    public partial class NumericUpDown : Control
    {

        public NumericUpDown()
        {
            InitializeCommands();
        }

        static NumericUpDown()
        {
            DefaultStyleKeyProperty.OverrideMetadata(typeof(NumericUpDown), 
               new FrameworkPropertyMetadata(typeof(NumericUpDown)));
        }

        public static decimal Value
        {
            get { return (decimal)GetValue(ValueProperty); }
            set { SetValue(ValueProperty, value); }
        }

        public static readonly DependencyProperty ValueProperty =
            DependencyProperty.Register(
                "Value", typeof(decimal), typeof(NumericUpDown),
                new FrameworkPropertyMetadata(MinValue, new PropertyChangedCallback(OnValueChanged),
                                              new CoerceValueCallback(CoerceValue)));

        private static object CoerceValue(DependencyObject element, object value)
        {
            decimal newValue = (decimal)value;
            NumericUpDown control = (NumericUpDown)element;

            newValue = Math.Max(MinValue, Math.Min(MaxValue, newValue));

            return newValue;
        }

        private static void OnValueChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args)
        {
            NumericUpDown control = (NumericUpDown)obj;

            RoutedPropertyChangedEventArgs<decimal> e = new RoutedPropertyChangedEventArgs<decimal>(
                (decimal)args.OldValue, (decimal)args.NewValue, ValueChangedEvent);
            control.OnValueChanged(e);
        }

        public static readonly RoutedEvent ValueChangedEvent = EventManager.RegisterRoutedEvent(
            "ValueChanged", RoutingStrategy.Bubble,
            typeof(RoutedPropertyChangedEventHandler<decimal>), typeof(NumericUpDown));

        public event RoutedPropertyChangedEventHandler<decimal> ValueChanged
        {
            add { AddHandler(ValueChangedEvent, value); }
            remove { RemoveHandler(ValueChangedEvent, value); }
        }

        protected virtual void OnValueChanged(RoutedPropertyChangedEventArgs<decimal> args)
        {
            RaiseEvent(args);
        }

        #region Commands

        public static RoutedCommand IncreaseCommand
        {
            get
            {
                return _increaseCommand;
            }
        }
        public static RoutedCommand DecreaseCommand
        {
            get
            {
                return _decreaseCommand;
            }
        }

        private static void InitializeCommands()
        {
            _increaseCommand = new RoutedCommand("IncreaseCommand", typeof(NumericUpDown));
            CommandManager.RegisterClassCommandBinding(typeof(NumericUpDown), new CommandBinding(_increaseCommand, OnIncreaseCommand));
            CommandManager.RegisterClassInputBinding(typeof(NumericUpDown), new InputBinding(_increaseCommand, new KeyGesture(Key.Up)));

            _decreaseCommand = new RoutedCommand("DecreaseCommand", typeof(NumericUpDown));
            CommandManager.RegisterClassCommandBinding(typeof(NumericUpDown), new CommandBinding(_decreaseCommand, OnDecreaseCommand));
            CommandManager.RegisterClassInputBinding(typeof(NumericUpDown), new InputBinding(_decreaseCommand, new KeyGesture(Key.Down)));
        }

        private static void OnIncreaseCommand(object sender, ExecutedRoutedEventArgs e)
        {
            NumericUpDown control = sender as NumericUpDown;
            if (control != null)
            {
                control.OnIncrease();
            }
        }
        private static void OnDecreaseCommand(object sender, ExecutedRoutedEventArgs e)
        {
            NumericUpDown control = sender as NumericUpDown;
            if (control != null)
            {
                control.OnDecrease();
            }
        }

        protected virtual void OnIncrease()
        {
            Value++;
        }
        protected virtual void OnDecrease()
        {
            Value--;
        }

        private static RoutedCommand _increaseCommand;
        private static RoutedCommand _decreaseCommand;
        #endregion

        private const decimal MinValue = 0, MaxValue = 100;
    }
}
Надо, чтобы для каждого экземпляра этого объекта задавались свои значения. Потом выложу сюда готовый компонент. Главное помогите кто нибудь.

Последний раз редактировалось Casper-SC; 01.08.2010 в 17:58.
Casper-SC вне форума Ответить с цитированием
Старый 03.08.2010, 20:54   #2
akasex
Форумчанин Подтвердите свой е-майл
 
Аватар для akasex
 
Регистрация: 31.03.2008
Сообщений: 179
По умолчанию

private const decimal MinValue = 0, MaxValue = 100;
akasex вне форума Ответить с цитированием
Старый 03.08.2010, 21:36   #3
Casper-SC
Форумчанин
 
Регистрация: 04.07.2007
Сообщений: 549
По умолчанию

Цитата:
Сообщение от akasex Посмотреть сообщение
private const decimal MinValue = 0, MaxValue = 100;
Я имел ввиду, как сделать в виде свойства, а так я видел, что это константа. Ну всё равно попробую ещё раз. Если не получится напишу сюда.

Вот UserControl numericUpDown. Если кому будет нужно и кто может решить эту проблему, отпишите пожалуйста тут. Ну не как не делаются там свойства.

Последний раз редактировалось Casper-SC; 04.08.2010 в 09:00.
Casper-SC вне форума Ответить с цитированием
Старый 07.08.2010, 12:13   #4
Casper-SC
Форумчанин
 
Регистрация: 04.07.2007
Сообщений: 549
По умолчанию

Нельзя просто убрать слово const. А как переписать, чтобы были свойства не знаю. Просто пока я не совсем понимаю все эти DependencyProperty и т.д. Может всё-таки кто нибудь подскажет?

Ладно, если никто не понимает проблемы, то может у кого есть рабочий контрол?

Последний раз редактировалось Casper-SC; 08.08.2010 в 02:45.
Casper-SC вне форума Ответить с цитированием
Старый 09.08.2010, 18:15   #5
akasex
Форумчанин Подтвердите свой е-майл
 
Аватар для akasex
 
Регистрация: 31.03.2008
Сообщений: 179
По умолчанию

Код:
public partial class NumericUpDown : Control
{
static DependencyProperty MinValueProperty;

public decimal MinValue
{
        get { return (decimal)base.GetValue(MinValueProperty); }
        set { base.SetValue(MinValueProperty, value); }
}

static NumericUpDown()
{
        MinValueProperty = DependencyProperty.Register("MinValue",
            typeof(decimal), typeof(NumericUpDown));
}
}
akasex вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
класс Screen в WPF. Есть ли такой? [?] Не добавлять же сборку Forms в WPF Casper-SC Общие вопросы .NET 2 30.07.2010 15:10
WPF datagridview Cpluser Общие вопросы .NET 0 03.06.2010 11:53
wpf listbox Cpluser Общие вопросы .NET 0 06.04.2010 19:58
вoпрoc про NumericUpDown (С#) m0nax Общие вопросы .NET 2 19.01.2010 02:13
Окно в WPF Xanex Общие вопросы .NET 8 27.08.2009 20:57