Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
course_(Windows&Web).docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
4.68 Mб
Скачать

Xaml – текущая поддержка

Итак, для разделения труда программиста и разработчика нам нужны соответствующие интегрированные средства для работы с XAML в IDE и в графических редакторах. Таким средства есть:

  • Visual Designer for the Windows Presentation Foundation (ранее известный как Cider) – это то, с чем работает программист в Visual Studio при разработке. Visual Designer для WPF станет частью Visual Studio в ее следующей версии, Orcas, поддерживающей Vista. Orcas планируется выпустить в 2007 году

  • Expression Graphic Designer (бывшая Acrylic), программа для работы с 2D-графикой, – это то, с чем работает дизайнер вне всяких IDE. В Graphic Designer сделан упор на внешний вид приложений

  • Expression Interactive Designer (ранее известный как Sparkle) – инструмент для создания 3D-анимации и графики. Interactive Designer уделяет внимание "поведению и взаимодействию"

  • Expression Web Designer (бывший Quartz) – инструмент для разработки веб-страниц. По сути новая и улучшенная версия FrontPage, предназначенная для разработки пользовательского интерфейса и верстки веб-страниц и Windows-приложений. Тесно интегрируется с ASP .NET 2.0 (в частности, «знает» о контролах ASP.NET, смарт-тэгах и т.п.)

  • XAMLPAD – названный, видимо, по аналогии с NotePad, несложный инструмент редактирования XAML.

Семейство Expression-редакторов работает как с векторной графикой (напомним, что движок WPF – векторный), так и с растровыми изображениями.

Модель программирования xaml

Язык XAML обладает дополнительной по сравнению с XML семантикой, которая допускает единую интерпретацию. Слегка упрощая, можно сказать, что XAML - это основанный на XML сценарный язык для создания объектов CLR. Имеется соответствие межу XML-тегами и типами CLR, а также между XML-атрибутами и свойствами и событиями CLR. В следующем примере показано, как создать объект и присвоить значение его свойству на языках XAML и C#:

<!— версия на XAML —> <MyObject SomeProperty='1' />

// версия на C# MyObject obj = new MyObject(); obj.SomeProperty = 1;

XML-теги всегда определяются в контексте некоторого пространства имен, которое и описывает, какие теги являются допустимыми. В XAML пространства имен в смысле XML отображаются на наборы пространств имен и сборок в смысле CLR. Чтобы приведенный выше простой пример заработал, необходимо установить соответствие между требуемыми пространствами имен. В XML для определения новых пространств имен применяется атрибут xmlns:

<!— версия для XAML —> <MyObject xmlns='clr-namespace:Samples' SomeProperty='1' />

// версия для C# using Samples; MyObject obj = new MyObject(); obj.SomeProperty = 1;

В C# перечень сборок, в которых находятся используемые типы, всегда задается в файле проекта или с помощью аргументов командной строки для запуска компилятора csc.exe. В XAML можно определить местоположение исходной сборки для каждого пространства имен:

<!— версия для XAML —> <MyObject xmlns='clr-namespace:Samples; assembly=samples.dll' SomeProperty='1'/>

// версия для C# csc /r:samples.dll test.cs using Samples; MyObject obj = new MyObject(); obj.SomeProperty = 1;

В XML мир разбит на две половины: элементы и атрибуты. Модель XAML более тесно связана с CLR, поскольку апеллирует к объектам, свойствам и событиям. Значения свойств можно представлять в виде атрибутов или дочерних элементов. Предыдущий пример допустимо записать и так:

<MyObject xmlns='clr-namespace:Samples, assembly=samples.dll'> <MyObject.SomeProperty> </MyObject.SomeProperty> </MyObject>

Каждый элемент, соответствующий свойству, квалифицируется типом, которому это свойство принадлежит. Предположим, например, что есть еще одно свойство, значением которого является объект типа Person со свойствами FirstName и LastName. На XAML можно было бы легко выразить это соотношение, воспользовавшись элементами для описания свойств:

<MyObject xmlns='clr-namespace:Samples, assembly=samples.dll'> <MyObject.Owner> <Person FirstName='Chris' LastName='Anderson' /> </MyObject.Owner> </MyObject>

XAML проектировался как язык разметки, тесно интегрированный с CLR и обеспеченный развитой инструментальной поддержкой. Дополнительно ставилась цель создать такой формат, который было бы легко читать и записывать. Может показаться, что проектировать свойство платформы, которое оптимизировано прежде всего для инструментов, а лишь потом для людей, не слишком вежливо, но команда WPF полагала, что приложения для WPF как правило будут создавать с помощью таких программ визуального конструирования, как Microsoft Visual Studio или Microsoft Expression. Чтобы граница между инструментами и людьми не была непроходимой, WPF позволяет автору типу определить одно свойство как контентное.1

В примере выше, если сделать свойство Owner типа MyObject контентным2, то в разметке можно будет опустить тег элемента, соответствующего этому свойству:

<MyObject xmlns='clr-namespace:Samples; assembly=samples.dll'> <Person FirstName='Megan' LastName='Anderson' /> </MyObject>

Чтобы воспринимать текст было еще удобнее, в XAML есть возможность расширения разметки. Это общий способ расширить синтаксический анализа­тор языка с целью создания более простой разметки. Расширения реализуются в виде типов CLR и работают почти так же, как атрибуты CLR. Они заключаются в фигурные скобки { }. Например, чтобы присвоить свойству специаль­ное значение null, можно воспользоваться встроенным расширением разметки Null:

<MyObject xmlns='clr-namespace:Samples; assembly=samples.dll'> <Person FirstName='Megan' LastName='{x:Null}'/> </MyObject>

В таблице 1.1 перечислены все встроенные расширения XAML.

Таблица 1.1. Встроенные расширения XAML

Пространство имен XAML

Назначение

Пример

x:Array

Создает массив CLR

<x:Array Type='{x:Type Button}'>

<Button />

<Button />

</x:Array>

x:Class

Задает имя определяемого типа (используется только при компиляции разметки)

<Window

x:Class = 'MyNamespace.MyClass '>

...

</Window>

X:ClassModifier

Задает модификаторы определяемого типа («public» «intemal» и т.д.) (используется только при компиляции разметки)

<Window x:Class='...'

x:ClassModifier='Public'>

</Window>

x:Code

Ограничивает блок встроенного кода (используется только при компиляции разметки)

<Window x:Class='...'>

<x:Code>

public void DoSomething()

{

}

</x:Code>

</Window>

x:Key

Задает ключ элемента (поддерживается только для элементов, содержащихся в словарях)

<Button>

<Button.Resources>

<Style x:Key='Hi'>...</Style>

</Button.Resources>

</Button>

x:Name

Задает имя элемента для ссылки на него в программе (обычно используется, когда у элемента нет встроенного свойства name)

<sys:Int32

xmlns:sys = 'clr-namespace: System;...'

x:Name = '_myIntegerValue'> 5 </sys:Int32>

x:Null

Создает значение

null. <Button Content = '{x:Null}' />

x:Static

Создает значение путем доступа к статическому полю или свойству типа.

<Button

Command = '{x:Static

ApplicationCommands.Close}' />

x:Subclass

Предоставляет базовый тип для компиляции разметки на язык, в котором не поддерживаются частичные типы.

x:Type

Предоставляет тип CLR (эквивалент

Type.GetType).

<ControlTemplate

TargetType='{x:Type Button}'>

</ControlTemplate>

x:TypeArguments

Задает обобщенные аргументы типа для создания экземпляра обобщенного типа.

<gc:List xmlns:gc='clrnamespace:

System.Collections.Generic;...'

x:TypeArguments ='{x:Type Button}'/> x:XData

Ограничивает блок встроенного XML; может использоваться только для свойств типа IXmlSerializable.

<XmlDataSource>

<x:XData>

<Book xmlns=" Title='...' />

</x:XData>

</XmlDataSource>

Расширения разметки ищутся точно так же, как теги объектов, то есть необходи­мо объявить XML-префикс «x», иначе синтаксический анализатор выдаст ошибку. В языке XAML определено специальное пространство имен для встроенных типов:

<MyObject xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml' xmlns='clr-namespace:Samples,-asserrbly=samples.dll'> <Person FirstName='Megan' LastName='{x:Null}' /> </MyObject>

Кроме того, для любой сборки CLR (или набора таких сборок) можно опреде­лить имя, построенное по принципу URI и соответствующее пространствам имен и сборок CLR. Это можно считать эквивалентом старого доброго предложения #include 'windows.h', которое хорошо известно программистам на C/C++. В сбор­ках WPF этот механизм применяется, поэтому для импорта WPF в XAML-файл можно использовать любой формат:

<!— вариант 1: импорт по пространству имен CLR —> <Window xmlns:x='http://schemas.microsoft.com/winfx/2 0 06/xaml' xmlns='clr-namespace:System.Windows;assembly=presentationframework.dll'> </Window> <!— вариант 2: импорт по URI —> <Window xmlns:x='http://schemas.microsoft.com/winfx/2 0 06/xaml' xmlns='http://schemas.microsoft.com/winfx/2 006/xaml/presentation'> </Window>

Метод с применением синтаксиса URI хорош тем, что импортируются сразу несколько пространств имен и сборок CLR, а, значит, разметка получается более компактной и работать с ней проще.

В завершении лекции, нужно сказать о такой возможности XAML, как способность расширять типы за счет свойств, предоставляемых другими типами. Такие присоединенные свой­ства - это просто безопасный относительно типов вариант добавленных свойств (expando properties) в языке JavaScript. В версии XAML, предназначенной для WPF, присоединенные свойства работают только, если и тип, в котором свойство определено, и тип, к которому оно присоединяется, наследуют классу DependencyObject. Однако в общей спецификации XAML такого требования нет.

В следующем примере свойство Dock определено в типе DockPanel. Присое­диненному свойству всегда предшествует имя предоставляющего его типа, даже если такое свойство употребляется в качестве атрибута:

<Window xmlns:x='http://schemas.microsoft.com/winfx/2 0 06/xaml' xmlns='http://schemas.microsoft.com/winfx/2 006/xaml/presentation'> <DockPanel> <Button DockPanel.Dock='Top'>Top</Button> <Button> <DockPanel.Dock>Left</DockPanel.Dock> Left </Button> <Button>Fill</Button> </DockPanel> </Window>

XAML - довольно простой язык, в нем не очень много правил. В версии, ко­торая поставляется в составе .NET Framework 3.0 (4.0), все определения тегов XAML реализованы в виде типов CLR. Поэтому все, что можно сделать с помощью раз­метки, можно написать и в виде компилируемой программы.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]