Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю
После запуска приложения объект анимации не сможет найти подходящую цель и сгенерируется исключение. Причина в том, что свойство
CurrentNumberТеперь добавьте показанный ниже код, чтобы свойство
CurrentNumberpublic int CurrentNumber{ get => (int)GetValue(CurrentNumberProperty); set => SetValue(CurrentNumberProperty, value);}public static readonly DependencyProperty CurrentNumberProperty = DependencyProperty.Register("CurrentNumber", typeof(int), typeof(ShowNumberControl), new UIPropertyMetadata(0));Работа похожа на ту, что делалась в реализации свойства
HeightUIPropertyMetadata0FrameworkPropertyMetadataCurrentNumberДобавление процедуры проверки достоверности данных
Хотя у вас есть свойство зависимости по имени
CurrentNumberCurrentNumberДобавьте в метод
DependencyProperty.Register()ValidateValueCallbackValidateCurrentNumberЗдесь
ValidateValueCallbackboolobjectobjectValidateCurrentNumbertruefalsepublic static readonly DependencyProperty CurrentNumberProperty = DependencyProperty.Register("CurrentNumber", typeof(int), typeof(ShowNumberControl), new UIPropertyMetadata(100), new ValidateValueCallback(ValidateCurrentNumber));// Простое бизнес-правило: значение должно находиться// в диапазоне между 0 и 500.public static bool ValidateCurrentNumber(object value) => Convert.ToInt32(value) >= 0 && Convert.ToInt32(value) <= 500;Реагирование на изменение свойства
Итак, допустимое число уже есть, но анимация по-прежнему отсутствует. Последнее изменение, которое потребуется внести — передать во втором аргументе конструктора
UIPropertyMrtadataPropertyChangedCallbackDependencyObjectDependencyPropertyChangeEventArgs<b>// Обратите внимание на второй параметр конструктора UIPropertyMetadata.</b>public static readonly DependencyProperty CurrentNumberProperty = DependencyProperty.Register("CurrentNumber", typeof(int), typeof(ShowNumberControl), new UIPropertyMetadata(100, new PropertyChangedCallback(CurrentNumberChanged)), new ValidateValueCallback(ValidateCurrentNumber));Конечной целью внутри метода
CurrentNumberChamged()ContentLabelCurrentNumberCurrentNumberChanged()DependencyPropertyLabelShowNumberControlDependencyObjectContentLabelprivate static void CurrentNumberChanged(DependencyObject depObj, DependencyPropertyChangedEventArgs args){<b> // Привести DependencyObject к ShowNumberControl.</b> ShowNumberControl c = (ShowNumberControl)depObj;<b> // Получить элемент управления Label в ShowNumberControl.</b> Label theLabel = c.numberDisplay;<b> // Установить для Label новое значение.</b>