Главная » Разработка для Windows Phone 7 » Концепция свойства Content

0

Button наследуется от класса Control, но также и от ContentControl (Элемент управления содержимым). ContentControl – это класс, описывающий свойство Content кнопки. Свойство Content можно вынести как свойство-элемент:

<Button>

<Button.Content>

</Button.Content> </Button>

Но вот что странно – в него невозможно вставить текст:

<!– Не работает! –> <Button>

<Button.Content>

Click this button! </Button.Content> </Button>

В этом синтаксисе нет никакой ошибки, но Silverlight не допускает его. Для того чтобы действительно сделать возможным вставку текста, необходимо включить описание пространства имен XML для пространства имен System (Система):

xmlns:system="clr-namespace:System;assembly=mscorlib"

После этого можно вставлять строку между тегами, которые явно указывают синтаксическому анализатору XAML на то, что строка на самом деле типа String:

<Button>

<Button.Content>

<system:String>Click this button[11]</system:String> </Button.Content> </Button>

Как и в любом производном от ContentControl, мы можем опустить теги свойства-элемента для Content:

<Button>

<system:String>Click this button</system:String> </Button>

Свойство Content типа object, и мы на самом деле можем использовать в качестве значения Content практически все, что угодно:

<Button>

<system:Double>1E5</system:Double> </Button>

То что данное значение интерпретируется как число, можно понять, когда в Button будет отображено 10000. Попробуем следующее:

<Button>

<system:DateTime>0ctober 1, 2010, 9:30 PM</system:DateTime> </Button>

Это будет отображено как 10/1/2010 9:30:00 PM. Сначала метод Parse для Double или DateTime выполняет синтаксический разбор текста, который должен быть отображен объектом Button. Затем метод ToString полученного объекта Double или DateTime обеспечивает его текстовое визуальное представление.

В Button можно поместить объект типа Color:

<Button>

<Color>Cyan</Color> </Button>

Но на кнопке будет выведено шестнадцатеричное представление значения этого цвета: «#FF00FFFF». Можно попробовать задать SolidColorBrush:

<Button>

<SolidColorBrush Color="Cyan" /> </Button>

Но этот варианта даже еще хуже. Теперь будет выведен текст:

«System.Windows.Media.SolidColorBrush». SolidColorBrush не определяет метода ToString, поэтому на экран выводится полное имя класса. SolidColorBrush может использоваться как значение свойств Foreground, Background или BorderBrush (Кисть рамки) кнопки, но не для Content.

Тем не менее существует вполне определенная причина того, что свойство Content кнопки типа object. В главе 16 я покажу, как создать DataTemplate (Шаблон данных) для отображения объектов, таких как SolidColorBrush. А до тех пор, если хотите, чтобы Button отображал что-то отличное от просто текста, задавайте в качестве свойства Content объект, наследуемый от FrameworkElement. Например, чтобы вывести на кнопке форматированный текст, явно задайте в качестве значения Content объект TextBlock:

<Button>

<TextBlock>

Click <Run FontStyle="Italic">this</Run> button! </TextBlock> </Button>

Или можно вставить элемент Image:

<Button HorizontalAlignment="Center" VerticalAlignment="Center"> <Image Source="Images/BuzzAldrinOnTheMoon.png" Stretch="None" />

</Button>

На экран будет выведено следующее:

Свойство Content типа object, поэтому в качестве его значения не может быть задано множество объектов, но это может быть одна из панелей (Panel):

<Button HorizontalAlignment="Center" VerticalAlignment="Center"> <StackPanel>

<Image Source="Images/BuzzAldrinOnTheMoon.png"

Stretch="None" /> <TextBlock Text="Click this button!"

TextAlignment="Center" />

</StackPanel> </Button>

На рисунке показана получаемая кнопка, на которой выведены и изображение, и текст:

И да, в кнопку можно вставить другую кнопку или ползунок, вот только как пользователи отнесутся к этому?

Мы уже рассматривали производные от ContentControl: ScrollViewer, который обсуждался в прошлой главе, наследуется от ContentControl. В качестве значения свойства Content класса ScrollViewer часто используют StackPanel, но можно также задать Image большего, чем кнопка, размера. PhoneApplicationFrame также наследуется от ContentControl через Frame, но обычно этот класс используется несколько иначе, чем все остальные производные от ContentControl, потому что должен реализовывать навигацию по страницам.

ContentControl не единственный класс, имеющий свойство Content. UserControl – класс, от которого наследуется PhoneApplicationPage через Page – также описывает свойство Content. Естественно предположить, что ContentControl и UserControl каким-то образом взаимосвязаны. Как показывает данная иерархия классов, они являются элементами одного уровня:

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

PhoneApplicationFrame

UserControl Page

PhoneApplicationPage

Свойство Content в ContentControl типа object, свойство Content в UserControl типа UIElement, т.е. оно несколько менее универсальное.

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

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

По теме:

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