- •А.А. Волосевич
- •1. Общее описание wpf
- •2. ПРостейшее Приложение wpf
- •4. Базовые концепции wpf Иерархия классов
- •Свойства зависимостей и присоединённые свойства
- •Маршрутизируемые события
- •Многопоточность в wpf
- •5. СтруктуРа Оконного приложения wpf
- •Класс Window
- •Класс Application
- •6. Компоновка
- •Размер и выравнивание
- •Основные контейнеры компоновки
- •Прокрутка и декорирование содержимого
- •7. Обзор элеменТов управления
- •Цвета и окантовка:
- •Шрифт содержимого:
- •Элементы управления содержимым
- •Списковые элементы управления
- •Прочие элементы управления
- •8. Фигуры
- •9. Цвет, кисти, прозрачность Представление цвета в wpf
- •Лучшие кисти
- •Прозрачность
- •10. Трансформации и эффекты
- •11. Классы drawing и visual
- •12. Ресурсы
- •Двоичные ресурсы
- •Логические ресурсы
- •13. Привязка данных Базовые концепции привязки данных
- •Практическое использование привязки данных
- •Конвертеры значений
- •Проверка данных
- •14. Стили и триггеры
- •15. ПрИвязка к коллекциям и шаблоны данных
- •16. Представления Данных
- •17. ШАблоны элементов управления
Списковые элементы управления
Списковые элементы управления (кратко – списки) могут хранить и представлять коллекцию элементов списка. Для большинства списков доступна гибкая настройка внешнего вида, а также функции фильтрации, группировки и сортировки данных, однако в данном параграфе рассматриваются только простейшие аспекты работы со списками.
Все списки наследуются от класса ItemsControl, который определяет несколько полезных свойств:
-
Items – коллекция ItemCollection, сохраняющая элементы списка (свойство доступно только для чтения).
-
ItemsSource – свойство позволяет связать список с коллекцией данных. Свойство доступно для установки во время выполнения приложения.
-
HasItems – булево свойство только для чтения. Показывает, имеются ли элементы в списке.
-
DisplayMemberPath – строковое свойство, определяющее отображаемое значение для элемента списка. DisplayMemberPath поддерживает синтаксис, который называется путь к свойству. Путь к свойству напоминает запись свойства агрегированного объекта, но без операций приведения типа. Например, если у кнопки btn задать в качестве содержимого строку, путь к свойству в виде "btn.Content[0]" будет означать первый символ строки.
В разметке XAML дочерние объекты списка автоматически рассматриваются как элементы списка. Правила отображения отдельного элемента аналогичны правилам, применяемым при показе содержимого ContentControl.
Списковые элементы управления можно разделить на три подгруппы:
-
Селекторы.
-
Меню.
-
Списки без категории.
Селекторы допускают индексацию и выбор элементов списка. К селекторам относятся элементы управления ComboBox, ListBox, ListView, DataGrid и TabControl. Все селекторы наследуются от абстрактного класса Selector, который предоставляет следующие свойства и события:
-
SelectedIndex – целочисленный индекс (первого) выбранного элемента (или -1, если ничего не выбрано).
-
SelectedItem – (первый) выбранный элемент списка.
-
SelectedValue – значение выбранного элемента. Если не используется SelectedValuePath, значение совпадает с SelectedItem.
-
SelectedValuePath – путь к свойству, определяющий значение выбранного элемента.
-
SelectionChanged – событие, генерируемое при изменении SelectedItem.
В классе Selector определены два присоединяемых булевых свойства, используемых с элементами списка, – IsSelected и IsSelectionActive. Второе свойство является свойством только для чтения и позволяет узнать, установлен ли на выделенном элементе фокус. Кроме этого, класс Selector имеет два присоединяемых события – Selected и Unselected.
Элемент управления ListBox отображает список и допускает множественный выбор элементов. Эта возможность настраивается при помощи свойства SelectionMode, принимающего значения из одноимённого перечисления:
-
Single (по умолчанию) – можно выбрать только один элемент списка.
-
Multiple – можно выбрать несколько элементов. Щелчок по невыбранному элементу выбирает его, и наоборот.
-
Extended – можно выбрать несколько элементов, используя клавиши SHIFT и CTRL.
У ListBox имеется коллекция SelectedItems, содержащая выбранные элементы списка. Каждый элемент в ListBox представлен объектом класса ListBoxItem, в котором определено булево свойство IsSelected и события Selected и Unselected. В разметке XAML ListBoxItem можно не использовать. Анализатор XAML выполняет самостоятельное «оборачивание» дочерних элементов в объекты ListBoxItem (замечание справедливо и для других списков).
<ListBox SelectionMode="Multiple">
<TextBlock>First Item</TextBlock>
<TextBlock>Second Item</TextBlock>
<Button>Third Item</Button>
</ListBox>
Рис. 15. Элемент управления ListBox.
Класс ComboBox позволяет выбрать один элемент из списка, отображая текущий выбор и раскрывая список элементов по требованию. Отдельный элемент ComboBox представлен объектом ComboBoxItem (унаследованным от ListBoxItem).
<Canvas>
<ComboBox Name="cbx" SelectedIndex="0" Width="134">
<ComboBoxItem>First Item</ComboBoxItem>
<ComboBoxItem>Second Item</ComboBoxItem>
<ComboBoxItem>Third Item</ComboBoxItem>
</ComboBox>
<Button Padding="10,3" Canvas.Right="5" Canvas.Bottom="5"
Content="Enter" Click="Button_Click" />
</Canvas>
private void Button_Click(object sender, RoutedEventArgs e)
{
MessageBox.Show(cbx.SelectionBoxItem.ToString(), "Selected");
}
Рис. 16. Элемент управления ComboBox.
Для описания состояния списка служит булево свойство IsDropDownOpen и связанные события DropDownOpened/DropDownClosed. Свойства IsEditable и IsReadOnly могут использоваться, чтобы подсвечивать и отображать элемент списка при вводе текстовой информации, связанной с элементом. Текстовая информация определяется в элементе списка при помощи свойства TextSearch.Text или в самом ComboBox при помощи свойства TextSearch.TextPath.
Элемент управления ListView унаследован от ListBox. Этот список позволяет настроить свой внешний вид при помощи свойства View с типом ViewBase. В WPF имеется один наследник абстрактного класса ViewBase – класс GridView. При помощи GridView элемент управления ListView отображает данные в виде таблицы с колонками. Каждая колонка таблицы GridView – это объект класса GridViewColumn, помещённый в коллекцию GridView.Columns. У колонки настраивается ширина, заголовок, отображаемые в колонке значения. GridView поддерживает изменение размеров колонок и их перетаскивание во время работы приложения.
<ListView xmlns:sys="clr-namespace:System;assembly=mscorlib">
<ListView.View>
<GridView>
<GridViewColumn Header="Date" Width="70"/>
<GridViewColumn Header="Day of Week"
DisplayMemberBinding="{Binding DayOfWeek}"/>
<GridViewColumn Header="Year"
DisplayMemberBinding="{Binding Year}"/>
</GridView>
</ListView.View>
<sys:DateTime>1/1/2010</sys:DateTime>
<sys:DateTime>1/2/2010</sys:DateTime>
<sys:DateTime>1/3/2010</sys:DateTime>
</ListView>
Рис. 17. Элемент управления ListView.
Элемент управления TabControl – это простой набор страниц с закладками:
<TabControl SelectedIndex="2">
<TabItem Header="Tab 1">Content for Tab 1</TabItem>
<TabItem Header="Tab 2">Content for Tab 2</TabItem>
<TabItem Header="Tab 3">Content for Tab 3</TabItem>
</TabControl>
Рис. 18. Элемент управления TabControl.
По умолчанию закладки в TabControl расположены вверху. Их положение можно изменить, используя свойство TabStripPlacement. Каждая страница в TabControl – это объект класса TabItem. Класс TabItem – контейнер с заголовком (подобно элементам GroupBox или Expander).
Перейдем к рассмотрению элементов управления из категории меню – Menu и ContextMenu. Класс Menu может содержать коллекцию любых объектов, но ожидается, что будут использованы объекты MenuItem и Separator. Separator – простой элемент, представляющий разделитель пунктов меню. MenuItem – это контейнер с заголовком (наследник HeaderedItemsControl). В случае MenuItem заголовок определяет отображаемый пункт меню, а свойство содержимого Items может содержать элементы подменю. MenuItem поддерживает «горячие клавиши». Этот класс также содержит свойства Icon и IsCheckable и определяет события Checked, Unchecked, SubmenuOpened, SubmenuClosed, Click.
<DockPanel LastChildFill="False">
<Menu DockPanel.Dock="Top">
<MenuItem Header="_File">
<MenuItem Header="_New..."/>
<MenuItem Header="_Open..."/>
<Separator/>
<MenuItem Header="Sen_d To">
<MenuItem Header="Mail Recipient"/>
<MenuItem Header="My Documents"/>
</MenuItem>
</MenuItem>
<MenuItem Header="_Edit"></MenuItem>
<MenuItem Header="_View"></MenuItem>
</Menu>
</DockPanel>
Рис. 19. Пример меню.
Класс ContextMenu служит для представления контекстного меню некоторого элемента. Объект ContextMenu нельзя поместить в дерево элементов, а следует задавать как значение одноимённого свойства, определённого в классе FrameworkElement.
<ListBox>
<ListBox.ContextMenu>
<ContextMenu> <!-- пункты меню --> </ContextMenu>
</ListBox.ContextMenu>
</ListBox>
ContextMenu – это контейнер объектов MenuItem. В классе ContextMenu определено несколько свойств для настройки места появления контекстного меню относительно элемента, с которым оно связано.
Рассмотрим списковые элементы без категории. Элемент управления TreeView отображает иерархию данных в виде дерева с узлами, которые могут быть свернуты и раскрыты. Каждый элемент в TreeView является объектом TreeViewItem. Класс TreeViewItem напоминает MenuItem – это тоже контейнер с заголовком Header и коллекцией дочерних элементов Items. TreeViewItem содержит булевы свойства IsExpanded и IsSelected, а также события Expanded, Collapsed, Selected, Unselected.
<TreeView>
<TreeViewItem Header="Desktop">
<TreeViewItem Header="Computer" />
<TreeViewItem Header="Recycle Bin" />
<TreeViewItem Header="Control Panel">
<TreeViewItem Header="Programs" />
<TreeViewItem Header="Security" />
<TreeViewItem Header="User Accounts" />
</TreeViewItem>
<TreeViewItem Header="Network" />
</TreeViewItem>
</TreeView>
Рис. 20. Простой TreeView.
Элемент управления ToolBar представляет панель инструментов. Он просто группирует кнопки, разделители (Separator) и другие дочерние элементы на одной панели1. Хотя ToolBar можно разместить в произвольном месте, обычно один или несколько таких объектов размещают внутри элемента ToolBarTray, что позволяет перетаскивать и переупорядочить панели инструментов. Элемент управления SatusBar группирует элементы подобно ToolBar или Menu. Обычно элемент SatusBar размещается в нижней части окна.