Главная » Разработка для Windows Phone 7 » Элементы и элементы управления Windows Phone 7

0

ApplicationBar существует абсолютно независимо от обычной иерархии классов Silverlight в особом разделе Silverlight для Windows Phone. Далее в данной главе мы вернемся к более привычному царству классов.

Большинство визуальных объектов, обсуждаемых до сих пор в данной книге, часто называют элементами, главным образом потому, что в иерархии классов они наследуются от FrameworkElement:

Object

DependencyObject (абстрактный) UIElement (абстрактный)

FrameworkElement (абстрактный)

К этим производным от FrameworkElement относятся TextBlock, Image, Border, MediaElement, Shape (который является родительским классом для Rectangle и Ellipse) и Panel, который является родителем для Grid, StackPanel и Canvas.

Далее в данной главе я собираюсь сосредоточиться на некоторых классах, которые наследуются от Control:

Object

DependencyObject (абстрактный) UIElement (абстрактный)

FrameworkElement (абстрактный) Control (абстрактный)

Большинство производных от Control описываются в пространстве имен System.Windows.Controls, но некоторые из них скрываются в пространстве имен System. Windows. Controls.Primitives.

Для разработчиков, имеющих опыт работы в графических средах, термин элемент управления более привычен, чем элемент. И здесь возникает вопрос: если визуальные объекты, которые обычно называют элементами управления, в Silverlight более правильно называть элементами, в чем разница между элементами и визуальными объектами, которые действительно являются элементами управления Silverlight?

Важным отличием между этими концепциями является то, что элементы обычно относятся к представлению, тогда как элементы управления предназначены для взаимодействия. В Silverlight Control является родителем таких классов, как Button, Slider и TextBox, т.е. такое объяснение кажется вполне убедительным. Можно также заметить, что класс Control реализует свойство IsEnabled, а также три свойства, участвующих в навигации с использованием клавиши табуляции: IsTabStop (Является позицией табуляции), TabIndex (Индекс позиции табуляции) и TabNavigation (Навигация табуляцией).

С другой стороны, события пользовательского ввода для клавиатуры, мыши, стилуса и касания описываются классом UIElement, так что элементы, такие как TextBlock и Image, могут получать пользовательский ввод и – с соответствующей поддержкой в разметке или коде – отвечать на него.

Возможно, более существенным различием является то, что элементы управления образованы элементами. Элементы можно рассматривать как визуальные примитивы. Элементы управления составлены из этих элементов и других элементов управления. Например, Button это не что иное, как Border с некоторым содержимым. Как правило, в роли этого содержимого выступает TextBlock, но этим список не ограничивается. Slider это не что иное, как пара элементов Rectangle и несколько специальных элементов управления RepeatButton (Кнопка повтора).

Визуальные элементы, производные от Control, всегда определяются деревом производных от FrameworkElement. Это дерево также может включать объекты, которые тоже наследуются от Control, но описываются деревом других производных от FrameworkElement и Control.

Несмотря на то что визуальные элементы Control всегда входят в состав дерева производных от FrameworkElement, это дерево не является неизменным. Его можно заменить и полностью переопределить визуальные элементы элемента управления. Класс Control описывает свойство Template (Шаблон) типа ControlTemplate (Шаблон элемента управления). В главе 16 мы рассмотрим, как заменять шаблон.

Переопределение визуальных элементов с помощью шаблонов – мощный инструмент для настройки элементов управления. Однако сложно себе представить, как можно переопределить визуальные элементы производного от FrameworkElement класса. Конечно, внешний вид TextBlock будет разным в зависимости от значений свойств Text, FontFamily FontSize и Foreground, но какой-либо целесообразности в том, чтобы делать TextBlock визуально отличным по каким-то иным параметрам, нет. Напротив, вспомним, как сильно менялся внешний вид базовой кнопки в различных версиях Windows.

В Silverlight невозможно унаследовать класс от FrameworkElement. (Вообще фактически можно, но сделать что-либо полезное в унаследованном классе не получится.) И, кроме Panel, большинство производных от FrameworkElement являются запечатанными. Shape не запечатанный, но наследоваться от него нельзя, а все производные от Shape классы запечатанные.

Но можно наследоваться от Control и многих его производных. Один из производных от Control классов, UserControl, существует исключительно в целях создания пользовательских классов. Он позволяет не только настраивать визуальные элементы существующего элемента управления с помощью шаблонов, но и создавать собственные элементы. Однако независимо от метода реализации визуальные элементы элемента управления всегда будут определены как дерево элементов и других элементов управления.

В документации для Control можно увидеть, что этот класс значительно расширяет FrameworkElement удобными свойствами. Среди них несколько свойств шрифта, которые ассоциированы с TextBlock: FontSize, FontFamily, FontStyle, FontWeight и FontStretch. Также Control вводит несколько свойств из класса Border – BorderBrush, BorderThickness, Background и Padding – и еще два свойства, касающихся содержимого элемента управления – HorizontalContentAlignment и VerticalContentAlignment. Сам класс Control не использует эти свойства, они определены исключительно для удобства классов, наследуемых от Control.

Аналогично Control определяет ряд защищенных виртуальных методов, соответствующих событиям пользовательского ввода, описанным в UIElement. Для разработчиков на платформе Windows Phone 7 самое большое значение имеют, безусловно, те из этих методов, которые участвуют в обработке мультисенсорного ввода: OnManipulationStarted, OnManipulationDelta и OnManipulationCompleted.

Источник: Чарльз Петзольд, Программируем Windows Phone 7, Microsoft Press, © 2011.

По теме:

  • Комментарии