Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
course_(Windows&Web).docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
4.68 Mб
Скачать

Шаг 1. Рефакторинг кода адресной формы

Превратим рассмотренную выше адресную форму в элемент управления без внешнего вида (CustomControl). Первый шаг прост — нужно всего лишь изменить объявление класса, как показано ниже:

public class AdressCustomControl: System.Windows.Controls.Control { ... }

Код внутри класса AdressCustomControl

Код точно такой же, как код из пользовательского элемента управления прошлого примера (UserControl) (за исключением того факта, что из конструктора понадобится удалить вызов InitializeComponent()).

Так же необходимо определить свойства зависимости (DependencyProperty), и добавить стандартные оболочки для свойств, которые облегчают доступ к ним и обеспечивают возможность обращения из XAML-разметки. Данный пункт можно было сделать и в версии создаваемого ранее UserControl’a, что собственно лишь еще раз подчеркивает очень тонкую грань между этими двумя понятиями.

Определение свойств зависимости

Нужно создать свойства, методы и события, которые будут поступать в наш CustomControl, и на которые будет опираться приложение, использующее его для обработки адреса. В созданном нами CustomControl будут следующие свойства определяющие адрес: Location, Adress1, Adress2, State.

Первый шаг в создании свойства зависимости — это определение статического поля для него с добавленным словом Property в конце его имени:

public static DependencyProperty LocationProperty;

Определение статических полей для свойств — лишь первый шаг. Также понадобится статический конструктор элемента управления, который зарегистрирует свойства, указывая имя свойства, тип данных и класс элемента управления, владеющий данным свойством. Это позволит воспользоваться некоторыми специфическими средствами свойств (вроде наследования значений) за счет передачи объекта FrameworkPropertyMetadata с правильно установленными флагами. Также в этот момент можно присоединить обратные вызовы для проверки достоверности, коррекции значений и уведомлений об изменении значения.

В свойстве Location мы могли бы ввести проверку значения на равенство фразе Microsoft (в случае равенства автоматически изменить значения свойств Adress1, Adress2 и State на нужные нам значения). Ниже приведен код статического конструктора, регистрирующего пять свойств зависимости для нашей адресной формы.

static AdressCustomControl () { LocationProperty = DependencyProperty.Register ( "Location", typeof(string), typeof(TextBox), new PropertyChangedCallback (OnLacationChanged));

Adress1Property = DependencyProperty.Register ( "Adress1", typeof(string), typeof(TextBox), new PropertyChangedCallback (null));

Adress2Property = DependencyProperty.Register ( "Adress2", typeof(string), typeof(TextBox), new PropertyChangedCallback (null));

StateProperty = DependencyProperty.Register ( "State", typeof(string), typeof(TextBox), new PropertyChangedCallback (null));

}

Теперь, определив свойства зависимости, можно добавить стандартные оболочки для свойств, которые облегчают доступ к ним и обеспечивают возможность обращения из XAML-разметки:

public string Location { get { return (string)GetValue(LocationProperty); } set { SetValue(LocationProperty, value); } }

...

Оболочки свойств не должны содержать никакой логики, поскольку свойства могут устанавливаться и извлекаться непосредственно с помощью методов SetValue() и GetValue() базового класса DependencyObject. Например, логика автозаполнения адреса после определения свойства Location в данном примере реализуется с использованием обратного вызова, который инициируются при изменении свойства через его оболочку, либо при прямом вызове SetValue().

private static void OnLocationChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e) { string newLocation = (string)e.NewValue; AdressCustomControl adressCustomControl = (AdressCustomControl)sender; if(newLocation.Eqals(“Microsoft”) { adressCustomControl.Adress1 = “One Microsoft Way” adressCustomControl.Adress2 = “Building 10”; adressCustomControl.State = “Redmond, WA 98052”; } }

Далее предоставим новый стиль для создаваемого CustomControl’a. Этот стиль будет обеспечен новым шаблоном элемента. (Если пропустить этот шаг, будет использован шаблон, определенный в базовом классе.)

Чтобы сообщить о том, что предоставляется новый стиль, следует вызвать метод OverrideMetadata() в статическом конструкторе класса. Этот метод вызывается на свойстве DefaultStyleKeyProperty, которое является свойством зависимости, определяющим стиль по умолчанию для элемента управления. Необходимый код выглядит так:

DefaultStyleKeyProperty.OverrideMetadata(typeof(AdressCustomControl), new FrameworkPropertyMetadata(typeof(AdressCustomControl)));

Можно предоставить другой тип, если нужно использовать шаблон другого класса элемента управления, но почти всегда для каждого из собственных пользовательских элементов управления будет создаваться специфический стиль.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]