Содержание
На данный момент мы знаем какие пространства имен используются в 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, подключив эти пространства имен с использованием синтаксиса, показанного выше.