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

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

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 309 310 311 312 313 314 315 316 317 ... 407
Перейти на страницу:
Foreground="Yellow">

  ...

  <Button.Width>

    100

  </Button.Width>

</Button>

Понятие присоединяемых свойств XAML

В дополнение к синтаксису "свойство-элемент" в XAML поддерживается специальный синтаксис, используемый для установки значения присоединяемого свойства. По существу присоединяемое свойство позволяет дочернему элементу устанавливать значение свойства, которое определено в родительском элементе. Общий шаблон, которому нужно следовать, выглядит так:

<РодительскийЭлемент>

  <ДочернийЭлемент РодительскийЭлемент.СвойствоРодительскогоЭлемента

= "Значение">

</РодительскийЭлемент>

Самое распространенное применение синтаксиса присоединяемых свойств связано с позиционированием элементов пользовательского интерфейса внутри одного из классов диспетчеров компоновки (Grid, DockPanel и т.д.). Диспетчеры компоновки более подробно рассматриваются в главе 25, а пока введите в редакторе Kaxaml следующую разметку:

<Page

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

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

  <Canvas Height="200" Width="200" Background="LightBlue">

    <Ellipse Canvas.Top="40" Canvas.Left="40" Height="20"

        Width="20" Fill="DarkBlue"/>

  </Canvas>

</Page>

Здесь определен диспетчер компоновки Canvas, который содержит элемент Ellipse. Обратите внимание, что с помощью синтаксиса присоединяемых свойств элемент Ellipse способен информировать свой родительский элемент (Canvas) о том, где располагать позицию его левого верхнего угла.

В отношении присоединяемых свойств следует иметь в виду несколько моментов. Прежде всего, это не универсальный синтаксис, который может применяться к любому свойству любого родительского элемента. Скажем, приведенная далее разметка XAML содержит ошибку:

<!-- Попытка установки свойства Background в Canvas

     через присоединяемое свойство. Ошибка! -->

<Canvas Height="200" Width="200">

  <Ellipse Canvas.Background="LightBlue"

           Canvas.Top="40" Canvas.Left="90"

           Height="20" Width="20" Fill="DarkBlue"/>

</Canvas>

Присоединяемые свойства являются специализированной формой специфичной для WPF концепции, которая называется свойством зависимости. Если только свойство не было реализовано в весьма специальной манере, то его значение не может быть установлено с использованием синтаксиса присоединяемых свойств. Свойства зависимости подробно исследуются в главе 25.

На заметку! В Visual Studio имеется средство IntelliSense, которое отображает допустимые присоединяемые свойства, доступные для установки заданным элементом.

Понятие расширений разметки XAML

Как уже объяснялось, значения свойств чаще всего представляются в виде простой строки или через синтаксис "свойство-элемент". Однако существует еще один способ указать значение атрибута XAML — применение расширений разметки. Расширения разметки позволяют анализатору XAML получать значение для свойства из выделенного внешнего класса. Это может обеспечить большие преимущества, поскольку для получения значений некоторых свойств требуется выполнение множества операторов кода.

Расширения разметки предлагают способ аккуратного расширения грамматики XAML новой функциональностью. Расширение разметки внутренне представлено как класс, производный от MarkupExtension. Следует отметить, что необходимость в построении специального расширения разметки возникает крайне редко. Тем не менее, некоторые ключевые слова XAML (вроде х:Array, x:Null, х:Static и х:Туре) являются замаскированными расширениями разметки!

Расширение разметки помещается между фигурными скобками:

<Элемент УстанавливаемоеСвойство = "{ РасширениеРазметки }" />

Чтобы увидеть расширение разметки в действии, введите в редакторе Kaxaml следующий код:

<Page

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

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

  xmlns:CorLib="clr-namespace:System;assembly=mscorlib">

  <StackPanel>

    <!-- Расширение разметки Static позволяет получать значение

        статического члена класса -->

    <Label Content ="{x:Static CorLib:Environment.OSVersion}"/>

    <Label Content ="{x:Static CorLib:Environment.ProcessorCount}"/>

    <!-- Расширение разметки Type - это версия XAML

         операции typeof языка C# —>

    <Label Content ="{x:Type Button}" />

    <Label Content ="{x:Type CorLib:Boolean}" />

    <! — Наполнение элемента ListBox массивом строк -- >

    <ListBox Width="200" Height="50">

      <ListBox.ItemsSource>

        <x:Array Type="CorLib:String">

          <CorLib:String>Sun Kil Moon</CorLib:String>

          <CorLib:String>Red House Painters</CorLib:String>

          <CorLib:String>Besnard Lakes</CorLib:String>

        </x:Array>

      </ListBox.ItemsSource>

    </ListBox>

  </StackPanel>

</Page>

Прежде всего, обратите внимание, что определение <Page> содержит новое объявление пространства имен XML, которое позволяет получать доступ к пространству имен System сборки mscorlib.dll. После установления этого пространства имен XML первым делом с помощью расширения разметки х:Static извлекаются значения свойств OSVersion и ProcessorCount класса System.Environment.

Расширение разметки х:Туре обеспечивает доступ к описанию метаданных указанного элемента. Здесь содержимому элементов Label просто присваиваются полностью заданные имена типов Button и System.Boolean из WPF.

Наиболее интересная часть показанной выше разметки связана с элементом ListBox. Его свойство Itemsourсе устанавливается в массив строк, полностью объявленный в разметке. Взгляните, каким образом расширение разметки х:Array позволяет указывать набор подэлементов внутри своей области действия:

<x:Array Type="CorLib:String">

  <CorLib:String>Sun Kil Moon</CorLib:String>

  <CorLib:String>Red House Painters</CorLib:String>

  <CorLib:String>Besnard Lakes</CorLib:String>

</x:Array>

На заметку! Предыдущий пример XAML служит только для иллюстрации расширения разметки в действии. Как будет показано в главе 25, существуют гораздо более простые способы наполнения элементов управления ListBox.

На рис. 24.3 представлена разметка этого элемента <Page> в редакторе Kaxaml.

Вы уже видели многочисленные примеры, которые демонстрировали основные аспекты синтаксиса XAML. Вы наверняка согласитесь, что XAML интересен своей возможностью описывать деревья объектов .NET в декларативной манере. Хотя это исключительно полезно при конфигурировании графических пользовательских интерфейсов, не забывайте о том, что с помощью XAML можно описывать любой тип из любой сборки при условии, что он является неабстрактным и содержит стандартный конструктор.

Построение приложений WPF с использованием Visual Studio

Давайте выясним, как Visual Studio может упростить создание приложений WPF. Хотя строить приложения WPF можно и с применением Visual Studio Code, в Visual Studio Code отсутствует поддержка соответствующих визуальных конструкторов. С другой стороны, благодаря развитой поддержке XAML среда Visual Studio обеспечивает более высокую продуктивность при создании приложений WPF.

На заметку! Далее будут представлены основные особенности применения Visual Studio для построения приложений WPF. В последующих главах при необходимости будут иллюстрироваться дополнительные аспекты этой IDE-среды.

Шаблоны проектов WPF

В диалоговом окне New Project (Новый проект) среды Visual Studio определен набор проектов приложений WPF, в том числе WPF Арр (Приложение WPF), WPF Custom Control Library (Библиотека специальных элементов управления WPF) и WPF User Control Library (Библиотека пользовательских элементов управления WPF). Создайте новый проект WPF Арр (.NET) по имени WpfTesterApp.

На заметку! При выборе шаблона проектов приложений WPF удостоверьтесь в том, что выбираете шаблон,

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

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