http
Windows Presentation Foundation (WPF). Урок
5. XAML Использование типов
из других пространств имен
Это последний урок из серии "Windows Presentation
Foundation (WPF).", публикуемый в
бесплатном разделе. Начиная со следующего,
публикация уроков будет продолжена в платном
разделе. В бесплатном же разделе, возможно, иногда будут публиковать некоторые статьи,
посвященные методике программирования на WPF.
Для того, что бы использовать типы из пространств имен,
которых нет в WPF, необходимо отобразить
пространство имен .NET на пространство имен
XML. В XAML для этого
предусмотрен специальный синтаксис:
xmlns:<Префикс>="clr:namespace:<Пространство
имен>;assembly=<Имя
сборки>" |
Например, для того, что бы получить доступ к типам из пространства имен
System нужно использовать вот
такую конструкцию:
xmlns:sys="clr-namespace:System;assembly=mscorlib" |
что позволит использовать тип DateTime, например,
вот таким образом?
<sys:DateTime>05/30/2009
5:22:11 PM</sys:DateTime> |
Рассмотрим это на примере заполнения ListBox:
<Window
x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:sys="clr-namespace:System;assembly=mscorlib"
Title="MainWindow"
Height="350"
Width="525">
<Grid>
<ListBox
Height="138"
HorizontalAlignment="Left"
Margin="25,18,0,0"
Name="listBox1"
VerticalAlignment="Top"
Width="195">
<ListBoxItem
Content="Элемент
1" />
<ListBoxItem
Content="Элемент
2" />
<sys:DateTime>05/30/2009
5:22:11 PM</sys:DateTime>
</ListBox>
</Grid>
</Window> |
В результате мы получим вот такой вот макет*:

А действительно ли у нас добавилась в список именно
DateTime? Давайте проверим. Добавим еще один ListBox
и кнопочку*:

И напишем обработчик нажатия на кнопочку:
private void
button1_Click(object sender,
RoutedEventArgs e)
{
for (int
i = 0; i < listBox1.Items.Count; i++)
{
listBox2.Items.Add(listBox1.Items[i].GetType().ToString());
}
} |
Запустим нашу программу. Вот что мы увидим при нажатии на кнопку:

Как видим, все правильно, третий элемент действительно имеет типа
DateTime.
Точно так же можно добавить и строку:
<Window
x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:sys="clr-namespace:System;assembly=mscorlib"
Title="MainWindow"
Height="350"
Width="525">
<Grid>
<ListBox
Height="138"
HorizontalAlignment="Left"
Margin="25,18,0,0"
Name="listBox1"
VerticalAlignment="Top"
Width="195">
<ListBoxItem
Content="Элемент
1" />
<ListBoxItem
Content="Элемент
2" />
<sys:DateTime>05/30/2009
5:22:11 PM</sys:DateTime>
<sys:String>Это
строка</sys:String>
</ListBox>
<Button
Content="Button"
Height="23"
HorizontalAlignment="Left"
Margin="286,37,0,0"
Name="button1"
VerticalAlignment="Top"
Width="75"
Click="button1_Click"
/>
<ListBox
Height="161"
HorizontalAlignment="Left"
Margin="250,82,0,0"
Name="listBox2"
VerticalAlignment="Top"
Width="215"
/>
</Grid>
</Window> |
И проверить что добавилась действительно строка:

Аналогичным образом можно добавить и свой класс. Для этого нужно просто
подключить локальное пространство имен (сборку при этом указывать не
обязательно):
xmlns:loc="clr-namespace:WpfApplication1" |
И теперь мы можем использовать классы из этого пространства имен:
<loc:MyClass
a="23"></loc:MyClass> |
Вот полный пример XAML:
<Window
x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:sys="clr-namespace:System;assembly=mscorlib"
xmlns:loc="clr-namespace:WpfApplication1"
Title="MainWindow"
Height="350"
Width="525">
<Grid>
<ListBox
Height="138"
HorizontalAlignment="Left"
Margin="25,18,0,0"
Name="listBox1"
VerticalAlignment="Top"
Width="195">
<ListBoxItem
Content="Элемент
1" />
<ListBoxItem
Content="Элемент
2" />
<sys:DateTime>05/30/2009
5:22:11 PM</sys:DateTime>
<sys:String>Это
строка</sys:String>
<loc:MyClass
a="23"></loc:MyClass>
</ListBox>
<Button
Content="Button"
Height="23"
HorizontalAlignment="Left"
Margin="286,37,0,0"
Name="button1"
VerticalAlignment="Top"
Width="75"
Click="button1_Click"
/>
<ListBox
Height="161"
HorizontalAlignment="Left"
Margin="250,82,0,0"
Name="listBox2"
VerticalAlignment="Top"
Width="215"
/>
</Grid>
</Window> |
А вот реализация самого класса MyClass:
public class
MyClass
{
public int a
{get; set;}
public override
string ToString()
{
return a.ToString();
}
} |
Обратите внимание, что у такого класса доложены быть конструкторы без
параметров. Если конструктора нет - то система объявляет конструктор без
параметров неявно.
Теперь давайте проверим, что все это у нас работает:

Скриншоты, помеченные знаком *,
являются цитатами и иллюстрациями программного
продукта "Microsoft Visual Studio 2010 Professional", авторское
право на который принадлежит корпорации
Microsoft..
|