Содержание
На данный момент мы знаем какие пространства имен используются в XAML и каким пространствам имен C# они соответствуют, а также научились получать доступ к элементам управления, созданным в XAML из файлов отделенного кода и создавать с помощью этих файлов элементы управления, используя код C#. При этом, могут возникать ситуации, когда нам необходимо из кода XAML получить доступ к какому-либо объекту, созданному с использованием кода C#.
Пространства имен .NET C# в XAML
При создании нового проекта WPF Visual Studio по умолчанию добавляет в код XAML пространство имен текущего проекта. Вот, например, как выглядит это пространство имен для нашего первого приложения WPF:
<Window ....
xmlns:local="clr-namespace:HelloWpf"
...
<Grid>
</Grid>
</Window>
Если открыть файл отделенного кода, то можно увидеть, что в коде C# пространство имен имеет как раз то самое название — HelloWpf. Таким образом, используя префикс local: мы можем получать доступ к объектам, созданным в коде C#. Например, создадим в C# новый класс:
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
public override string ToString()
{
return $"{Name} - {Age}";
}
}
У этого класса переопределен метод ToString(). Теперь можно воспользоваться объектом этого класса в коде XAML, например, следующим образом:
<Window x:Class="HelloWpf.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:HelloWpf"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<Grid Name="grid">
</TextBox>
<Button Width="200" Height="60" VerticalAlignment="Bottom" Margin="5,5,5,5" Click="Button_Click" x:Name="button">
<Button.Content>
<local:Person Name="Вася Пупкин" Age="20"/>
</Button.Content>
</Button>
</Grid>
</Window>
Так как пространство имен проекта (HelloWpf) проецируется на пространство имен XAML с префиксом local, то все классы проекта используются в XAML в виде local:Название_Класса. Так в данном случае объект Person устанавливается в качестве содержимого кнопки через свойство Content. Для сложных объектов это свойство принимает их строковое представление, которое как раз и возвращается переопределенным методом ToString(). Теперь можно запустить приложение и увидеть результат:
Похожим образом мы можем подключать и другие пространства имен .NET для доступа к объектам, которые мы хотим использовать при работе с XAML. При этом, общие синтаксис подключения пространств имен выглядит следующим образом:
xmlns:префикс=»clr-namespace:пространство_имен;assembly=имя_сборки«
например, нам необходимо создать в XAML хэш-таблицу. Сделать это можно следующим образом:
<Window ....
xmlns:dict="clr-namespace:System.Collections;assembly=mscorlib"
xmlns:sys="clr-namespace:System;assembly=mscorlib"
...
<Window.Resources>
<dict:Hashtable x:Key="table">
<sys:Int32 x:Key="key1">7</sys:Int32>
<sys:Int32 x:Key="key2">23</sys:Int32>
</dict:Hashtable>
</Window.Resources>
<Grid>
....
</Grid>
</Window>
Здесь мы определили два дополнительных пространства имен:
xmlns:dict="clr-namespace:System.Collections;assembly=mscorlib" xmlns:sys="clr-namespace:System;assembly=mscorlib"
и, благодаря этому, можем использовать все объекты, входящие в это пространство имен. В данном случае, мы создали хэш-таблицу состоящую из двух элементов у которых ключом является строка, а значением целое число.
Итого
При необходимости мы можем использовать объекты из пространств имен .NET непосредственно в коде XAML, подключив эти пространства имен с использованием синтаксиса, показанного выше.
