Книги
чёрным по белому
Главное меню
Главная О нас Добавить материал Поиск по сайту Карта книг Карта сайта
Книги
Археология Архитектура Бизнес Биология Ветеринария Военная промышленность География Геология Гороскоп Дизайн Журналы Инженерия Информационные ресурсы Искусство История Компьютерная литература Криптология Кулинария Культура Лингвистика Математика Медицина Менеджмент Металлургия Минералогия Музыка Научная литература Нумизматика Образование Охота Педагогика Политика Промышленные производства Психология Путеводители Религия Рыбалка Садоводство Саморазвитие Семиотика Социология Спорт Столярное дело Строительство Техника Туризм Фантастика Физика Футурология Химия Художественная литература Экология Экономика Электроника Энергетика Этика Юриспруденция
Новые книги
Янин В.Л. "Новгородские акты XII-XV Хронологический комментарий" (История)

Майринк Г. "Белый доминиканец " (Художественная литература)

Хусаинов А. "Голоса вещей. Альманах том 2" (Художественная литература)

Петров Г.И. "Отлучение Льва Толстого " (Художественная литература)

Хусаинов А. "Голоса вещей. Альманах том 1 " (Художественная литература)
Реклама

Windows presentation foundation with - MacDonald M.

MacDonald M. Windows presentation foundation with — Вильямс , 2008. — 928 c.
ISBN 978-5-8459-1429-3
Скачать (прямая ссылка): wpfwindowspresente2008.pdf
Предыдущая << 1 .. 23 24 25 26 27 28 < 29 > 30 31 32 33 34 35 .. 473 >> Следующая

Этот фокус удается потому, что TextBox наследуется от базового класса DependencyObject, как и все элементы управления WPF. И как вы узнаете из главы 6, класс DependencyObject предназначен для хранения практически неограниченной коллекции свойств зависимости. (Прикрепленные свойства, о которых мы говорили ранее — это специальный тип свойства зависимости.)
Фактически метод Grid.SetRow() — это на самом деле сокращение, эквивалентное вызову метода DependencyObject.SetValue() , как показано ниже:
txtQuestion.SetValue(Grid.RowProperty, 0);
Прикрепленные свойства — центральный ингредиент WPF. Они действуют как система расширения общего назначения. Например, определяя свойство Row как прикрепленное, вы гарантируете его применимость с любым элементом управления. Другой вариант — сделать его частью базового класса, такого как FrameworkElement, однако это усложнит жизнь. Это не только засорит общедоступный интерфейс свойствами, которые понадобятся только при определенных условиях (в данном случае — когда элемент
Book_Pro_WPF-2.mdb 59 19.05.2008 18:09:40
60 Глава 2
используется внутри Grid), но также сделает невозможным добавление новых типов контейнеров, которые потребуют новых свойств.
На заметку! Прикрепленные свойства очень похожи на поставщики расширений в приложении Windows Forms. И те, и другие позволяют вам добавлять “виртуальные” свойства для расширения другого класса. Отличие в том, что вы должны создавать экземпляр поставщика расширений перед тем, как сможете использовать его, и значение расширенного свойства сохраняется в поставщике расширений, а не в расширяемом элементе управления. Дизайн прикрепленного свойства — наилучший выбор для WPF, потому что позволяет избежать проблем управления жизненным циклом (например, решая, когда следует уничтожать поставщика расширений).
Вложенные элементы
Как вы уже видели, документы XAML представляют собой дерево элементов с высокой степенью вложенности. В данном примере элемент Window содержит элемент Grid, который содержит элементы TextBox и Button.
XAML позволяет каждому элементу решать, как ему следует поступать с вложенными элементами. Это взаимодействие осуществляется при посредничестве одного из четырех механизмов, запускаемых в описанном ниже порядке.
• Если родитель реализует IList, то анализатор вызывает IList.Add(), передавая ему дочерний элемент.
• Если родитель реализует IDictionary, анализатор вызывает IDictionary.Add() и передает ему дочерний элемент. При использовании коллекции-словаря вы должны также устанавливать атрибут x:Key, чтобы дать ключевое имя каждому элементу.
• Если родитель оснащен атрибутом ContentProperty, то анализатор использует дочерний элемент, чтобы установить это свойство.
Например, ранее в этой главе вы уже видели, как LinearGradientBrush может содержать коллекцию объектов GradientStop, используя синтаксис вроде следующего:
<LinearGradientBrush>
<LinearGradientBrush.GradientStops>
<GradientStop Offset="0.00" Color="Red" />
<GradientStop Offset="0.50" Color="Indigo" />
<GradientStop Offset="l.00" Color="Violet" /> </LinearGradientBrush.GradientStops>
</LinearGradientBrush>
Анализатор XAML распознает элемент LinearGradientBrush.GradientStops как сложное свойство, потому что оно включает точку. Однако ему нужно обработать внутренние дескрипторы (три элемента GradientStop) слегка по-другому. В этом случае анализатор распознает, что свойство GradientStops возвращает объект GradientStopCollection, а GradientStopCollection реализует интерфейс IList. Поэтому он предполагает (грубо), что каждый GradientStop должен быть добавлен к коллекции с использованием метода IList.Add():
GradientStop gradientStopl = new GradientStop();
gradientStopl.Offset = 0;
gradientStopl.Color = Colors.Red;
IList list = brush.GradientStops;
list.Add(gradientStopl);
Book_Pro_WPF-2.mdb 60 19.05.2008 18:09:40
XAML 61
Некоторые свойства могут поддерживать более одного типа коллекций. В этом случае вы должны добавить дескриптор, специфицирующий класс коллекции как здесь:
<ЬіпеагСгаДіепББгивЬ>
<ЬіпеагСгаДіепББгивЬ.СгаДіепБББорв>
<GradientStopCollection>
<СгаДіепБББор ОІБвеБ="0.00" Соіог="БеД" />
<СгаДіепБББор ОІБвеБ="0.50" Соіог="ІпДідо" />
<СгаДіепБББор ОББзеБ="1.00" Соіог="УіоіеБ" />
</GradientStopCollection>
</ЬіпеагСгаДіепББгивЬ.СгаДіепБББорв>
</ЬіпеагСгаДіепББгивЬ>
На заметку! Если по умолчанию коллекция установлена в null, вы должны включить дескриптор, специфицирующий класс коллекции, тем самым создавая объект коллекции. Если имеется экземпляр коллекции по умолчанию, и вы должны просто заполнить ее, то можете опустить эту часть.
Вложенное содержимое не всегда обозначает коллекцию. Например, рассмотрим элемент Grid, который содержит несколько других элементов управления:
<Grid Name="grid1">
<TextBox Name="txtQuestion" ... >
</TextBox>
<Button Name="cmdAnswer" ... >
</Button>
<TextBox Name="txtAnswer" ... >
</TextBox>
</Grid>
Эти вложенные дескрипторы не соответствуют сложным свойствам, поскольку не включают точки. Более того, элемент Grid не является коллекцией и потому не реализует IList или IDictionary. Что Grid действительно поддерживает — так это атрибут ContentProperty, указывающий свойство, которое должно принимать любое вложенное содержимое. Технически атрибут ContentProperty применяется к классу Panel, от которого унаследован Grid, и выглядит он так:
Предыдущая << 1 .. 23 24 25 26 27 28 < 29 > 30 31 32 33 34 35 .. 473 >> Следующая