Wpf, usercontrol

Призначені для користувача елементи пропонують досить-таки безболісний, але в деякому відношенні обмежений спосіб створення спеціальних елементів управління. Щоб зрозуміти - чому, давайте придивимося до того, як функціонує UserControl.

"За лаштунками" клас UserControl працює багато в чому подібно класу ContentControl, від якого він успадкований. Насправді ключових відмінностей небагато:

Клас UserControl змінює деякі значення за замовчуванням. А саме: встановлює IsTabStop і Focusable в false (так що він не займає окремого місця в послідовності обходу по клавіші ), А також встановлює HorizontalAlignment і VerticalAlignment в Stretch (замість Left і Тор), в результаті заповнюючи весь доступний простір.

Клас UserControl застосовує новий шаблон елемента управління, що складається з елемента Border, який упаковує ContentPresenter. Елемент ContentPresenter зберігає в собі інформацію, яку додається за допомогою коду розмітки.

Клас UserControl змінює джерело маршрутизованих подій. Коли подія поширюється бульбашкою або туннелируют від елемента управління, що знаходиться всередині призначеного для користувача елементу, до елементу, що знаходиться поза ним, джерело змінюється і вказує на призначений для користувача елемент управління замість початкового елемента. Це трохи підвищує ступінь інкапсуляції.

Наприклад, при обробці події UIElement.MouseLeftButtonDown в контейнері компонування, що містить в собі створений раніше покажчик кольору, буде отримано подія, коли виконується клацання кнопкою миші всередині Rectangle. Однак джерелом цієї події буде не Rectangle, а об'єкт ColorPicker, що містить цей Rectangle. Якщо створити той же самий покажчик кольору як звичайний елемент з вмістом, то цього не буде - в даному випадку на вас покладається обов'язок перехоплювати подія в елементі управління, обробляти його і порушувати повторно.

Найбільш істотна відмінність призначених для користувача елементів від інших типів спеціальних елементів управління полягає в способі їх проектування. Як і всі елементи управління, призначені для користувача елементи мають шаблон. Однак цей шаблон змінюється рідко. Замість цього створюється код розмітки як частина класу спеціального призначеного для користувача елементу управління, і цей код розмітки обробляється із застосуванням методу InitializeComponent () при створенні елемента. З іншого боку, елемент управління, який не має зовнішнього вигляду, не має і розмітки. Все, що йому потрібно - це шаблон.

Звичайний ContentControl має наступний спрощений шаблон:

Цей шаблон всього лише наповнює отриманим вмістом і застосовує необов'язковий шаблон вмісту. Властивості начебто Padding, Background, HorizontalAlignment і VerticalAlignment не дають ніякого ефекту, якщо тільки явно не прив'язати їх.

UserControl має схожий шаблон, але з кількома додатковими тонкощами. Найбільш очевидним є те, що він додає елемент Border і прив'язує його властивості до властивостей BorderBrush, BorderThickness, Background і Padding призначеного для користувача елементу управління, щоб вони що-небудь робили. До того ж ContentPresenter всередині прив'язується до властивостей вирівнювання.

Формально шаблон для користувача елементу управління може бути змінений. Насправді можна перемістити весь код розмітки в шаблон, лише злегка видозмінивши її. Але насправді робити це нема чого: якщо необхідний більш гнучкий елемент управління, в якому зовнішній вигляд відділений від інтерфейсу, що надається класом цього елемента, то краще створити власний елемент управління, позбавлений зовнішнього вигляду, як описано в наступній статті.

Схожі статті