Главная » Silverlight » Составные свойства

0

Преобразователи типов довольно удобны, однако не во всех ситуациях. Например, некоторые свойства являются полнофункциональными объектами, обладающими соб­ственными наборами свойств. В принципе для них можно создать строковое представ­ление, распознаваемое преобразователем типов, однако их синтаксис весьма сложный, и, кроме того, такой подход чреват коварными ошибками.

К счастью, спецификация XAML предоставляет возможность задавать составные свойства. В этом синтаксисе дочерний элемент имеет имя в форме имя_родительского_ элемента.имя_свойства. Например, объект Grid имеет свойство Background, позво­ляющее задать кисть для прорисовки фона элемента. Если нужно применить более сложную кисть, а не просто залить элемент одним цветом, нужно добавить дочерний дескриптор Grid.Background, как в приведенной ниже разметке.

<Grid x:Name="gridl"> <Grid.Background>

</Grid.Background>

</Grid>

Ключевая деталь, благодаря которой вся конструкция работает, — точка в имени элемента. Она позволяет отличить составное свойство от вложенного содержимого других типов.

Как присвоить значение составному свойству? Трюк состоит в добавлении во вло­женный элемент другого дескриптора для создания экземпляра класса. В приложении EightBall (см. рис. 2.1) фон заполняется градиентом. Для определения градиента соз­дан объект LinearGradientBrush.

<Grid x:Name="gridl"> <Grid.Background> <LinearGradientBrush> </LinearGradientBrush> </Grid.Background>

</Grid>

Имя LinearGradientBrush входит в пространство имен Silverlight, поэтому в де­скрипторах можно использовать пространство имен XML, установленное по умолчанию.

Однако создать объект LinearGradientBrush недостаточно. Кроме этого, нужно задать цвета градиента. Это делается путем заполнения свойства LinearGradientBrush. GradientStops коллекцией объектов GradientStop. Свойство GradientStops слишком сложное, чтобы его можно было установить только с помощью атрибута. Вместо этого необходимо применить составное свойство.

<Grid x:Name="gridl"> <Grid.Background> <LinearGradientBrush> <LinearGradientBrush.GradientStops> </LinearGradientBrush.GradientStops> </LinearGradientBrush> </Grid.Background>

</Grid>

Коллекцию GradientStops можно заполнить набором объектов GradientStop. Каждый объект GradientStop обладает свойствами Offset и Color. Два этих значения можно установить с помощью обычных атрибутов.

<Grid x:Name="gridl"> <Grid.Background> <LinearGradientBrush> <LinearGradientBrush.GradientStops> <GradientStop 0ffset="0.00" Color="Yellow" /> <GradientStop 0ffset="0.50" Color="White" /> <GradientStop Offset="l.00" Color="Purple" /> </LinearGradientBrush.GradientStops> </LinearGradientBrush> </Grid.Background>

</Grid>

Примечание. Описанный выше синтаксис составных свойств можно применить для любого свойства, однако в большинстве случаев используется более простой, обычный, синтаксис на основе значений атрибутов (если для свойства есть подходящий преобразователь типов). Использование синтаксиса на основе атрибутов делает код компактнее.

Любой набор дескрипторов XAML можно заменить набором операторов кода С#, вы­полняющих те же операции. Например, приведенные выше дескрипторы, заполняющие фон заданным градиентом, эквивалентны следующему коду.

LinearGradientBrush brush = new LinearGradientBrush();

GradientStop gradientStopl = new GradientStop();

gradientStopl.Offset = 0;

gradientStopl.Color = Colors.Yellow;

brush.GradientStops.Add(gradientStopl);

GradientStop gradientStop2 = new GradientStop();

gradientStop2.Offset = 0.5;

gradientStop2.Color = Colors.White;

brush.GradientStops.Add(gradientStop2);

GradientStop gradientStop3 = new GradientStop();

gradientStop3.Offset = 1;

gradientStop3.Color = Colors.Purple;

brush.GradientStops.Add(gradientStop3);

gridl .Background = brush;

Источник: Мак-Дональд, Мэтью. Silverlight 3 с примерами на С# для профессионалов. : Пер. с англ. —- М. : ООО «И.Д. Вильяме», 2010. — 656 с. : ил. — Парал. тит. англ.

По теме:

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