Содержание
ListBox
— это элемент управления, представляющий собой список элементов. Каждый элемент коллекции представляет собой объект класса ListBoxItem и является типичным элементом управления содержимым. В этой статье рассмотрим некоторые типовые вопросы использования ListBox в WPF, а также разберем несколько вопросов, связанных с работой этого элемента управления с внешними данными.
Примеры создания ListBox в WPF (XAML)
Пример 1. ListBox, содержащий простые строки
Для начала, создадим ListBox, содержащий обычные строки (string
). В XAML такой список может выглядеть следующим образом:
<ListBox> <ListBoxItem>Элемент 1</ListBoxItem> <ListBoxItem>Элемент 2</ListBoxItem> <ListBoxItem>Элемент 3</ListBoxItem> <ListBoxItem>Элемент 4</ListBoxItem> <ListBoxItem>Элемент 5</ListBoxItem> </ListBox>
Соответственно, внешний вид запущенного приложения WPF будет следующим:
Элементы ListBoxItem
могут содержать в себе и другие вложенные элементы. Рассмотрим пример посложнее.
Пример 1. ListBox, содержащий другие элементы управления
Создадим ListBox
, в котором каждый элемент будет состоять из двух элементов TextBlock
.
<ListBox> <ListBoxItem> <StackPanel> <TextBlock FontSize="16" FontStyle="Italic" FontFamily="Arial Black" FontWeight="Bold" >Элемент 1</TextBlock> <TextBlock FontSize="12" FontWeight="Light">Подзаголовок</TextBlock> </StackPanel> </ListBoxItem> <ListBoxItem> <StackPanel> <TextBlock FontSize="16" FontStyle="Italic" FontFamily="Arial Black" FontWeight="Bold" >Элемент 2</TextBlock> <TextBlock FontSize="12" FontWeight="Light">Подзаголовок</TextBlock> </StackPanel> </ListBoxItem> <ListBoxItem> <StackPanel> <TextBlock FontSize="16" FontStyle="Italic" FontFamily="Arial Black" FontWeight="Bold" >Элемент 3</TextBlock> <TextBlock FontSize="12" FontWeight="Light">Подзаголовок</TextBlock> </StackPanel> </ListBoxItem> </ListBox>
В этом примере мы создали ListBox
, в котором каждый элемент — это StackPanel
, содержащая по два элемента TextBlock
и, при этом, один TextBlock
выступает в качестве заголовка элемента, а второй — содержит обычный текст. В запущенном приложении этот ListBox
будет выглядеть следующим образом:
Также, мы можем менять и другие свойства элементов, например, делать заливку элементов другим цветом, добавлять другие элементы управления и так далее. Теперь рассмотрим примеры доступа к элементам в ListBox
.
Доступ к элементам в ListBox
Пример 3. Получение строки из ListBoxItem
Попробуем получить строки из элементов ListBox
, который мы создавали в примере №1. Допустим, нам необходимо вывести сообщение (MessageBox
) с текстом элемента при клике мышкой по нему. Доработаем наш ListBox
следующим образом:
<ListBox x:Name="simpleList"> <ListBoxItem Content="Элемент 1"/> <ListBoxItem Content="Элемент 2"/> <ListBoxItem Content="Элемент 3"/> <ListBoxItem Content="Элемент 4"/> <ListBoxItem Content="Элемент 5"/> </ListBox>
Теперь создадим обработчик события MouseUp
у ListBox
:
private void simpleList_MouseUp(object sender, MouseButtonEventArgs e) { if (simpleList.SelectedItem != null) { ListBoxItem li = (ListBoxItem)simpleList.Items[simpleList.SelectedIndex];//получаем доступ к элементу MessageBox.Show((string)li.Content);//получаем текст } }
Итоговый код ListBox
в XAML должен получиться вот таким:
<ListBox x:Name="simpleList" MouseUp="simpleList_MouseUp"> <ListBoxItem Content="Элемент 1"/> <ListBoxItem Content="Элемент 2"/> <ListBoxItem Content="Элемент 3"/> <ListBoxItem Content="Элемент 4"/> <ListBoxItem Content="Элемент 5"/> </ListBox>
Результат работы программы показан на рисунке ниже:
Теперь рассмотрим второй
ListBox
и попробуем добраться до текста элементов, состоящих из отдельных TextBlock
.
Пример 4. Получение доступа к элементам ListBox
Основная сложность заключается в том, чтобы правильно добраться до нужного нам TextBlock
. Для ListBox
приведенного в примере 2 это можно сделать следующим образом:
if (!(sender is ListBox)) return; ListBox list = (ListBox)sender; //получаем ListBox ListBoxItem item = (ListBoxItem)list.Items[list.SelectedIndex];//получаем доступ к выделенному элементу StackPanel panel = (StackPanel)item.Content; //получаем доступ к панели string result = ""; foreach (UIElement element in panel.Children) { if (element is TextBlock block) //проверяем, является ли текущий элемент панели текстовым блоком { result += block.Text; result += "."; } } MessageBox.Show(result);
Результат работы программы представлен на рисунке ниже:
Загрузка данных в ListBox из XML-файла
Довольно часто необходимо подгружать данные в ListBox
из внешних источников данных, например из XML-файла. Рассмотрим пример того, как можно получить данные в ListBox из внешнего файла.
Создаем XML-файл
В принципе, XML-файл может быть какой угодно, главное, чтобы вы сами знали, какие именно данные необходимо из него получить. Например, создадим XML-файл, содержащий информацию по людям:
<?xml version="1.0" encoding="utf-8" ?> <people> <person> <fullName>Пупкин Вася</fullName> <position>Дворник</position> <phone>+1(123)23345678</phone> </person> <person> <fullName>Иванов Петя</fullName> <position>Программист</position> <phone>+1(123)55545678</phone> </person> <person> <fullName>Петров Вова</fullName> <position>Директор</position> <phone>+1(123)55545999</phone> </person> </people>
В нашем проекте этот файл будет лежать в корневой папке и в обозревателе решений он будет выглядеть следующим образом:
Выделите в обозревателе решений файл peoples.xml
и в свойствах установите следующие его свойства, как показано на рисунке:
Теперь мы можем подгружать из этого файла данные в ListBox
.
Загружаем данные из XML-файла в ListBox (XmlDataProvider)
Класс XmlDataProvider
используется для подключения к xml-документам. При этом xml-документ может быть как локальным xml-файлом, так и и xml-данными из Сети. Для связи с источником данных XmlDataProvider
использует следующие свойства:
Source
: устанавливает источник данныхXPath
: задает путь внутри документа xml к целевому набору данныхDocument
: устанавливает ссылку на xml-документIsAsynchronous
: при значенииtrue
загружает данные асинхронно
Теперь обратимся к нашему XML-файлу, используя XmlDataProvider. Для этого в XAML добавим следующий код:
<Window.Resources> <XmlDataProvider x:Key="peopleProvider" Source="peoples.xml" XPath="people" /> </Window.Resources>
XmlDataProvider
определяется в XAML как ресурс, а его свойству Source
присваивается путь к xml-файлу. Свойство XPath
указывает, что все данные для провайдера в файле будут расположены в рамках элемента <people>
.
Теперь загрузим данные в ListBox
. Для этого у ListBox
допишем следующие свойства:
<ListBox x:Name="xmlList" ItemsSource="{Binding Source={StaticResource peopleProvider}, XPath=person}" DisplayMemberPath="fullName" />
Таким образом, мы указали, что данные для каждого элемента ListBox
будут браться из узла person
в XML-файле и отображаться будет значение из узла fullName
. В рабочем приложении это будет выглядеть следующим образом:
Итого
Сегодня мы узнали основные моменты по работе с ListBox
в WPF, научились создавать ListBox
, содержащий строки, а также другие элементы управления. Также мы рассмотрели вопрос того, каким образом можно загрузить данные из XML-файла в ListBox
, используя возможности XAML.