Книги онлайн и без регистрации » Разная литература » Язык программирования C#9 и платформа .NET5 - Эндрю Троелсен

Язык программирования C#9 и платформа .NET5 - Эндрю Троелсен

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 308 309 310 311 312 313 314 315 316 ... 407
Перейти на страницу:
когда необходимо описать в XAML класс .NET Core, определенный во внешней сборке.

Например, предположим, что было построено несколько специальных элементов управления WPF, которые упакованы в библиотеку по имени MyControls.dll. Если теперь требуется создать новый объект Window, в котором применяются созданные элементы, то можно установить специальное пространство имен XML, отображаемое на библиотеку MyControls.dll, с использованием маркеров clr-namespace и assembly. Ниже приведен пример разметки, создающей префикс дескриптора по имени myCtrls, который может применяться для доступа к элементам управления в этой библиотеке:

<Window x:Class="WpfApplication1.MainWindow"

  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

  xmlns:myCtrls="clr-namespace:MyControls;assembly=MyControls"

  Title="MainWindow" Height="350" Width="525">

  <Grid>

    <myCtrls:MyCustomControl />

  </Grid>

</Window>

Маркеру clr-namespace назначается название пространства имен .NET Core в сборке, в то время как маркер assembly устанавливается в дружественное имя внешней сборки *.dll. Такой синтаксис можно использовать для любой внешней библиотеки .NET Core, которой желательно манипулировать внутри разметки. В настоящее время в этом нет необходимости, но в последующих главах понадобится определять специальные объявления пространств имен XML для описания типов в разметке.

На заметку! Если нужно определить в разметке класс, который является частью текущей сборки, но находится в другом пространстве имен .NET Core, то префикс дескриптора xmlns определяется без атрибута assembly=:xmlns:myCtrls="clr-namespace:SomeNamespacelnMyApp"

Управление видимостью классов и переменных-членов

Многие ключевые слова вы увидите в действии в последующих главах там, где они потребуются; тем не менее, в качестве простого примера взгляните на следующее XAML-определение <Window>, в котором применяются ключевые слова ClassModifier и FieldModifier, а также x:Name и х:Class (вспомните, что редактор Kaxaml не позволяет использовать ключевые слова XAML, вовлекающие компиляцию, такие как x:Code, х:FieldModifier или х:ClassModifier):

<!-- Этот класс теперь будет объявлен как internal в файле *.g.cs —>

<Window x:Class="MyWPFApp.MainWindow" x:ClassModifier ="internal"

  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

  <!-- Эта кнопка будет объявлена как public в файле *.g.cs -->

  <Button x:Name ="myButton" x:FieldModifier ="public" Content = "OK"/>

</Window>

По умолчанию все определения типов 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 следующая задача заключается в наполнении корня дочерним элементом. В реальном приложении WPF дочерним элементом будет диспетчер компоновки (такой как Grid или StackPanel), который в свою очередь содержит любое количество дополнительных элементов, описывающих пользовательский интерфейс. Такие диспетчеры компоновки рассматриваются в главе 25, а пока предположим, что элемент <Window> будет содержать единственный элемент Button.

Как было показано ранее в главе, элементы XAML отображаются на типы классов или структур внутри заданного пространства имен .NET Core, тогда как атрибуты в открывающем дескрипторе элемента отображаются на свойства или события конкретного типа. В целях иллюстрации введите в редакторе Kaxaml следующее определение <Button>:

<Page

  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

  <Grid>

   <!-- Сконфигурировать внешний вид элемента Button -->

    <Button Height="50" Width="100" Content="OK!"

            FontSize="20" Background="Green" Foreground="Yellow"/>

  </Grid>

</Page>

Обратите внимание, что присвоенные свойствам значения представлены с помощью простого текста. Это может выглядеть как полное несоответствие типам данных, поскольку после создания такого элемента 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()

{

  ...

  // Необычная кисть для фона.

  LinearGradientBrush fancyBruch =

    new LinearGradientBrush(Colors.DarkGreen, Colors.LightGreen, 45);

  myBtn.Background = fancyBruch;

  myBtn.Foreground = new SolidColorBrush(Colors.Yellow);

}

Но можно ли представить эту сложную кисть в виде строки? Нет, нельзя! К счастью, в XAML предусмотрен специальный синтаксис, который можно использовать всякий раз, когда нужно присвоить сложный объект в качестве значения свойства; он называется синтаксисом "свойство-элемент".

Понятие синтаксиса "свойство-элемент" в XAML

Синтаксис "свойство-элемент" позволяет присваивать свойству сложные объекты. Ниже показано описание XAML элемента Button, в котором для установки свойства Background применяется объект LinearGradientBrush:

<Button Height="50" Width="100" Content="OK!"

        FontSize="20" Foreground="Yellow">

  <Button.Background>

   <LinearGradientBrush>

      <GradientStop Color="DarkGreen" Offset="0"/>

      <GradientStop Color="LightGreen" Offset="1"/>

    </LinearGradientBrush>

  </Button.Background>

</Button>

Обратите внимание, что внутри дескрипторов <Button> и </Button> определена вложенная область по имени <Button.Backgrounds>, а в ней — специальный элемент <LinearGradientBrush>. (Пока не беспокойтесь о коде кисти; вы освоите графику WPF в главе 26.)

Любое свойство может быть установлено с использованием синтаксиса "свойство-элемент", который всегда сводится к следующему шаблону:

<ОпределяющийКласс>

  <ОпределяющийКласс.СвойствоОпределяющегоКласса>

      <! -- Значение для свойства определяющего класса —>

  </ОпределяющийКласс.СвойствоОпределяющегоКласса>

</ОпределяющийКласс>

Хотя любое свойство может быть установлено с применением такого синтаксиса, указание значения в виде простой строки, когда подобное возможно, будет экономить время ввода. Например, вот гораздо более многословный способ установки свойства Width элемента Button:

<Button Height="50" Content="OK!"

FontSize="20"

1 ... 308 309 310 311 312 313 314 315 316 ... 407
Перейти на страницу:

Комментарии
Минимальная длина комментария - 20 знаков. В коментария нецензурная лексика и оскорбления ЗАПРЕЩЕНЫ! Уважайте себя и других!
Комментариев еще нет. Хотите быть первым?