xmlns:myCtrls="clr-namespace:MyControls;assembly=MyControls"
Title="MainWindow" Height="350" Width="525">
Маркеру clr-namespace
назначается название пространства имен .NET Core в сборке, в то время как маркер assembly
устанавливается в дружественное имя внешней сборки *.dll
. Такой синтаксис можно использовать для любой внешней библиотеки .NET Core, которой желательно манипулировать внутри разметки. В настоящее время в этом нет необходимости, но в последующих главах понадобится определять специальные объявления пространств имен XML для описания типов в разметке.
На заметку! Если нужно определить в разметке класс, который является частью текущей сборки, но находится в другом пространстве имен .NET Core, то префикс дескриптора xmlns
определяется без атрибута assembly=:xmlns:myCtrls="clr-namespace:SomeNamespacelnMyApp"
Управление видимостью классов и переменных-членов
Многие ключевые слова вы увидите в действии в последующих главах там, где они потребуются; тем не менее, в качестве простого примера взгляните на следующее XAML-определение
, в котором применяются ключевые слова ClassModifier
и FieldModifier
, а также x:Name
и х:Class
(вспомните, что редактор Kaxaml не позволяет использовать ключевые слова XAML, вовлекающие компиляцию, такие как x:Code
, х:FieldModifier
или х:ClassModifier
):
По умолчанию все определения типов C#/XAML являются открытыми (public
), а члены — внутренними (internal
). Однако для показанного выше определения XAML результирующий автоматически сгенерированный файл содержит внутренний тип класса с открытой переменной-членом Button
:
internal partial class MainWindow : System.Windows.Window,
System.Windows.Markup.IComponentConnector
{
public System.Windows.Controls.Button myButton;
...
}
Элементы XAML, атрибуты XAML и преобразователи типов
После установки корневого элемента и необходимых пространств имен XML следующая задача заключается в наполнении корня Grid
или StackPanel
), который в свою очередь содержит любое количество дополнительных элементов, описывающих пользовательский интерфейс. Такие диспетчеры компоновки рассматриваются в главе 25, а пока предположим, что элемент
будет содержать единственный элемент Button
.
Как было показано ранее в главе, :
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
FontSize="20" Background="Green" Foreground="Yellow"/>
Обратите внимание, что присвоенные свойствам значения представлены с помощью простого текста. Это может выглядеть как полное несоответствие типам данных, поскольку после создания такого элемента Button
в коде C# данным свойствам будут присваиваться не строковые объекты, а значения специфических типов данных. Например, ниже показано, как та же самая кнопка описана в коде:
public void MakeAButton()
{
Button myBtn = new Button();
myBtn.Height = 50;
myBtn.Width = 100;
myBtn.FontSize = 20;
myBtn.Content = "OK!";
myBtn.Background = new SolidColorBrush(Colors.Green);
myBtn.Foreground = new SolidColorBrush(Colors.Yellow);
}
Оказывается, что инфраструктура WPF поставляется с несколькими классами
Тем не менее, нередко возникает потребность в присваивании атрибуту XAML намного более сложного значения, которое невозможно выразить посредством простой строки. Например, пусть необходимо построить специальную кисть для установки свойства Background
элемента Button
. Создать кисть подобного рода в коде довольно просто:
public void MakeAButton()
{