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

Суворов С. "Танк Т-64. Первенец танков 2-го поколения " (Военная промышленность)

Нестеров В.А. "Основы проэктирования ракет класса воздух- воздух и авиационных катапульных установок для них" (Военная промышленность)

Фогль Б. "101 вопрос, который задала бы ваша кошка своему ветеринару если бы умела говорить" (Ветеринария)

Яблоков Н.П. "Криминалистика" (Юриспруденция)
Реклама

Windows presentation foundation with - MacDonald M.

MacDonald M. Windows presentation foundation with — Вильямс , 2008. — 928 c.
ISBN 978-5-8459-1429-3
Скачать (прямая ссылка): wpfwindowspresente2008.pdf
Предыдущая << 1 .. 267 268 269 270 271 272 < 273 > 274 275 276 277 278 279 .. 473 >> Следующая

Шаблоны и выбор
В текущем примере имеется одна небольшая, но очень раздражающая особенность. Проблема состоит в том, что ни в одном из показанных шаблонов не учитывается выбор.
Если в списке выбирается какой-нибудь элемент, WPF автоматически устанавливает значения для свойств Foreground и Background содержащего этот элемент контейнера (каковым в данном случае является объект ListBoxItem). Для свойства Foreground в качестве значения устанавливается белый цвет, а для свойства Background — голубой. Свойство Foreground подразумевает использование функции наследования свойств, из-за чего любые элементы, которые были добавлены в шаблон, автоматически получают новый белый цвет, если только явно не был указан какой-то другой цвет. Свойство Background не предполагает использования такой функции, но по умолчанию имеет значение Transparent. Из-за этого, при наличии, например, прозрачной границы, новый голубой фон проглядывает сквозь нее. В противном случае продолжает применяться тот цвет, который был указан.
Эта смесь может изменить все форматирование самым неожиданным образом. На рис. 17.6 показан пример.
Рис. 17.6. Нечитаемый текст в выделенном элементе
Book_Pro_WPF-2.mdb 538 19.05.2008 18:10:50
Шаблоны данных, представления данных и поставщики данных 539
Конечно, можно было бы жестко закодировать все цвета, дабы избежать этой проблемы, но тогда возникнет другая проблема. Единственным показателем того, что элемент выбран, будет служить отображаемый вокруг изогнутой границы голубой фон.
Очевидно, что более правильным решением будет изменить шаблон или предоставить для выбранных элементов совершенно новый шаблон. В конце концов, при выборе элемента вполне может потребоваться произвести различные изменения (например, добавить дополнительную информацию и расширить список так, чтобы пользователю не приходилось заглядывать в другой элемент управления для получения всех деталей по данному элементу, или же вообще заменить привязанные элементы редактируемыми элементами управления наподобие ТехЪБох, так чтобы пользователь мог при необходимости сразу же приступить к редактированию).
К сожалению, изменение шаблона выбранного элемента является не столь простой задачей, можно было бы ожидать. Класс 1ГетзСопГго1 не предоставляет свойства Зе1есГеС1Гет0аГаТетр1аГе. Класс 0акаТетр1аГеЗе1есЬог, о котором рассказывалось в предыдущем разделе, здесь тоже не поможет, поскольку он генерирует шаблоны только тогда, когда список привязывается впервые, и, следовательно, непригоден для изменения шаблона на этапе, когда пользователь выбирает элемент или отменяет свой выбор.
Как же решить эту проблему? В списке без шаблонов для изменения выбранного элемента можно использовать триггеры стилей. Эти стили могут изменять внешний вид контейнера, в котором содержатся все элементы списка. (В случае элемента управления ЫзЪБох таким контейнером является ЫзЪБохХУет, в случае элемента управления СотЬоБох — это СотЬоБохГГет и т.д.)
Эти стили можно применить двумя способами. Можно применить их по типу ко всем элементам управления ЫзЪБохХУет, а можно воспользоваться свойством ЫзЪБох. 16етСопУа1пегБ6у1е (как показано в следующем примере), которое позволяет устанавливать применяемый стиль так, чтобы он влиял на каждый объект ЫзЪБохХУет, который создается для этого списка. Оба подхода работают одинаково хорошо.
<ЫзкБох Ыате="1зкРгоСискз" Ног1зопка1СопкепкА11дптепк="БкгексЬ"> <Ъ1зкБох.1кетСопка1пегБку1е>
<ББу1е>
<БеББег РгорегБу="СопБго1.РаСС1пд" Уа1ие="0"></БеББег>
<ББу1е.Тг1ддегз>
<Тг1ддег РгорегБу="Ь1зББох1Бет.1зБе1есБеС" Уа1ие="Тгие">
<БеББег РгорегБу="Ь1зББох1Бет.БаскдгоипС" Уа1ие="БагкБеС" />
</Тг1ддег>
</ББу1е.Тг1ддегз>
</ББу1е>
</ЫзкБох.1кетСопка1пегБку1е>
</ЫзкБох>
Этот триггер применяет к выбранному элементу темно-красный фон. К сожалению, в случае списка, использующего шаблоны, данный код не дает желаемого эффекта. Дело в том, что эти шаблоны включают элементы с разным цветом фона, который отображается поверх темно-красного фона. Если не сделать все прозрачным (и не разрешить красному цвету просачиваться по всему шаблону), отображаться будет только красная каемка вокруг области поля шаблона.
Возможное решение состоит в явной привязке фон в части шаблона к значению свойства ЫзГБох1Гет.БаскдгоипС. В этом есть смысл, поскольку теперь мы перешли к выбору правильного цвета фона для выделения выбранного элемента. Главное — удостовериться в том, что он будет появляться именно в нужном месте.
Требуемая для реализации этого решения разметка является несколько запутанной. Все дело в том, что использовать обычное выражение привязки и просто реализовать
Book_Pro_WPF-2.mdb 539 19.05.2008 18:10:50
540 Глава 17
привязку к свойству в текущем объекте данных (каковым в данном случае является объект Product) нельзя. Вместо этого необходимо извлечь фон из контейнера элемента (каковым в данном случае является ListBoxItem). Это подразумевает использование свойства Binding.RelativeSource для поиска в дереве элементов первого подходящего объекта ListBoxItem. Как только такой элемент будет найден, можно извлечь цвет его фона и использовать его соответствующим образом.
Предыдущая << 1 .. 267 268 269 270 271 272 < 273 > 274 275 276 277 278 279 .. 473 >> Следующая