
- •Введение в wpf
- •Разметка
- •Код программной части
- •Автономные приложения
- •Приложения, размещенные в браузере
- •Класс приложения
- •Безопасность
- •Элементы управления wpf по функциям
- •Двухмерные формы
- •Двухмерная геометрия
- •Двухмерные эффекты
- •Трехмерная визуализация
- •Изображения
- •Видео и аудио
- •Документы нефиксированного формата
- •Документы фиксированного формата
- •Документы xps
- •Заметки
- •Упаковка
- •Модель содержимого
- •Триггеры
- •Шаблоны элементов управления
- •Шаблоны данных
- •Ресурсы
- •Темы и обложки
- •Пользовательские элементы управления
- •Разделы общих сведений
- •Примеры
- •Основные понятия
- •Архитектура wpf
- •Основные понятия
- •Новые возможности wpf версии 4
- •Основные понятия
- •Объектные элементы xaml
- •Синтаксис атрибутов (свойства)
- •Синтаксис элемента свойства
- •Синтаксис коллекции
- •Свойства содержимого xaml
- •Текстовое содержимое
- •Объединение свойств содержимого и синтаксиса коллекции
- •Синтаксис атрибутов (события)
- •Префикс "X:"
- •Маршрутизируемые события
- •Основные понятия
- •Другие ресурсы
- •Изменение значения свойства элемента управления
- •Создание стиля для элемента управления
- •Создание ControlTemplate
- •Основные понятия
- •Другие ресурсы
- •Двухмерные формы
- •Двухмерная геометрия
- •Двухмерные эффекты
- •Изображения
- •Видео и аудио
- •Основные понятия
- •Другие ресурсы
- •Направление потока данных
- •Что инициирует обновления источника
- •Указание источника привязки
- •Указание пути к значению
- •Связывание и выражение привязки
- •Способы реализации коллекций
- •Представления коллекций
- •Понятие о представлениях коллекций
- •Создание представления
- •Использование представления по умолчанию
- •Использование представлений коллекций с таблицами данных ado.Net
- •Сортировка
- •Фильтрация
- •Группировка
- •Указатели на текущий элемент
- •Скрипт привязки "основной/подробности"
- •Связь проверочных правил и привязки
- •Предоставление визуального отклика
- •Процесс проверки
- •Основные понятия
- •Другие ресурсы
Текстовое содержимое
Небольшое количество элементов XAML могут непосредственно обрабатывать текст как содержимое.Это происходит в одной из следующих ситуаций.
Класс должен объявить свойство содержимого, а это свойство содержимого должно принадлежать к типу, присваиваемому строке (тип может быть Object).Например, любой класс ContentControl использует свойство Content как свойство содержимого, принадлежащее к типу Object, и поддерживает следующее использование в практическом классе ContentControl, например Button:
<Button>Hello</Button>
.Тип должен объявлять преобразователь типов, при этом текстовое содержимое используется как текст инициализации для данного преобразователя типов.Например,
<Brush>Blue</Brush>
.Этот случай на практике встречается реже.Тип должен быть известным типом-примитивом языка XAML.
Объединение свойств содержимого и синтаксиса коллекции
Рассмотрим следующий пример.
XAML
Копировать
<StackPanel>
<Button>First Button</Button>
<Button>Second Button</Button>
</StackPanel>
Здесь каждый Button является дочерним элементом StackPanel.Это рациональная и интуитивно понятная разметка, в которой опущены два тега по двум разным причинам.
Опущен элемент свойства StackPanel.Children:StackPanel наследуется от Panel.Panel определяет Panel.Children как свойство содержимого XAML.
Опущен объектный элемент UIElementCollection: свойство Panel.Children принимает тип UIElementCollection, реализующий IList.Тег элемента коллекции можно опустить на основании правил XAML, касающихся обработки коллекций, например IList.(В этом случае UIElementCollection фактически не может быть создан, поскольку он не предоставляет конструктор по умолчанию, и поэтому объектный элемент UIElementCollection показан закомментированным.)
XAML
Копировать
<StackPanel>
<StackPanel.Children>
<!--<UIElementCollection>-->
<Button>First Button</Button>
<Button>Second Button</Button>
<!--</UIElementCollection>-->
</StackPanel.Children>
</StackPanel>
Синтаксис атрибутов (события)
Синтаксис атрибутов также можно использовать для элементов, которые являются событиями, а не свойствами.В этом случае имя атрибута является именем события.События для языка XAML реализованы в WPF таким образом, что значение атрибута является именем обработчика, реализующего делегат этого события.Например, в следующей разметке назначается обработчик для события Click класса Button, созданного в разметке.
XAML
Копировать
<Page
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="ExampleNamespace.ExamplePage">
<Button Click="Button_Click" >Click Me!</Button>
</Page>
Помимо
этого примера синтаксиса атрибутов
имеется больше информации по событиям
и XAML в WPF.Например, может возникнуть
вопрос, что представляет и как определяется
указанный здесь атрибут ClickHandler
.Ответ
на этот вопрос можно найти в следующем
подразделе данного раздела.
Чувствительность к регистру и пробелам в XAML
Вообще говоря, в языке XAML учитывается регистр символов.При разрешении резервных типов в WPF XAML регистр учитывается по тем же правилам, что и для CLR.Объектные элементы, элементы свойств и имена атрибутов должны быть указаны с учетом регистра символов при сравнении по имени с базовым типом в сборке или с элементом типа.В ключевых словах и примитивах в языке XAML также учитывается регистр.В значениях регистр учитывается не всегда.Учет регистра для значений будет зависеть от типа преобразователя поведения, связанного со свойством, которое принимает значение, или с соответствующим типом значения свойства.Например, свойства, принимающие тип Boolean, могут принимать значения true и True как эквивалентные, но только потому, что синтаксический анализатор WPF XAML для преобразования из строкового формата в тип Boolean уже рассматривает их как эквиваленты.
Обработчики и сериализаторы WPF XAML игнорируют или удаляют все незначимые пробелы и выполняют нормализацию всех значимых пробелов.Эти принципы соответствуют стандартным рекомендациям по использованию пробелов, представленных в спецификации языка XAML.Данное поведение типично только при задании строк в свойствах содержимого XAML.Проще говоря, XAML преобразует пробелы, символы табуляции и перевода строки в пробелы, а затем сохраняет один пробел, если таковой найден с любого конца непрерывной строки.Полное описание обработки пробелов в XAML в этом разделе не рассматривается.Дополнительные сведения см. в разделе Обработка пробелов в XAML.
Расширения разметки
Расширения разметки являются понятием языка XAML.При использовании для предоставления значения синтаксиса атрибутов фигурные скобки ({ и }) указывают на использование расширения разметки.При обработке XAML расширения разметки обрабатываются иначе, чем значения атрибутов, обычно рассматриваемые как литеральная строка или как значение, которое может быть преобразовано в строку.
Наиболее распространенными расширениями разметки, используемыми при программировании приложений WPF, являются Binding, используемое для сохранения выражений привязки данных, и ссылки на ресурсы StaticResource и DynamicResource.Используя расширения разметки можно использовать синтаксис атрибутов для указания значений свойств, которые в целом не поддерживают синтаксис атрибутов.В расширениях разметки часто используются промежуточные типы выражений для включения функций, которые присутствуют только во время выполнения, например, откладывание значений или ссылка на другие объекты.
Например, в следующей разметке значение свойства Style задается с помощью синтаксиса атрибутов.Свойство Style принимает экземпляр класса Style, который невозможно создать по умолчанию с помощью строки синтаксиса атрибутов.Но в этом случае атрибут ссылается на определенное расширение разметки, StaticResource.Когда это расширение разметки обрабатывается, оно возвращает ссылку на стиль, экземпляр которого был ранее создан в качестве ключевого ресурса в словаре ресурсов.
XAML
Копировать
<Page.Resources>
<SolidColorBrush x:Key="MyBrush" Color="Gold"/>
<Style TargetType="Border" x:Key="PageBackground">
<Setter Property="Background" Value="Blue"/>
</Style>
...
</Page.Resources>
<StackPanel>
<Border Style="{StaticResource PageBackground}">
...
</Border>
</StackPanel>
Список всех расширений разметки для XAML, реализованных в WPF, см. в разделе Расширения XAML WPF.Список расширений разметки, определенных в сборке System.Xaml и более доступных для реализаций XAML платформы .NET Framework, см. в разделе Возможности пространства имен языка XAML (x:).Дополнительные сведения о понятиях расширений разметки см. в разделе Расширения разметки и XAML WPF.
Преобразователи типов
В разделе было отмечено, что должна быть предоставлена возможность задать значение атрибута строкой.Основная собственная обработка преобразования строк в другие типы объектов или простые значения основана на самом типе String, помимо некоторой собственной обработки для определенных типов, например DateTime или Uri.Но многие типы WPF или элементы этих типов расширяют основное поведение обработки атрибутов строк таким образом, что экземпляры более сложных типов объектов могут быть заданы как строки и атрибуты.
Структура Thickness является примером типа, для которого включено преобразование типа для использования XAML.Класс Thickness указывает измерения в рамках вложенного прямоугольника и используется как значение для свойств, таких как Margin.Если поместить преобразователь типов в Thickness, все свойства, использующие Thickness, легче указать в XAML, поскольку их можно указать как атрибуты.В следующем примере преобразование типов и синтаксис атрибутов используются для присвоения значения свойству Margin:
XAML
Копировать
<Button Margin="10,20,10,30" Content="Click me"/>
Предыдущий пример синтаксиса атрибутов эквивалентен следующему более подробному примеру синтаксиса, где свойство Margin задается с помощью синтаксиса элемента свойства, содержащего объектный элемент Thickness.Четыре ключевых свойства объекта Thickness заданы как атрибуты нового экземпляра.
XAML
Копировать
<Button Content="Click me">
<Button.Margin>
<Thickness Left="10" Top="20" Right="10" Bottom="30"/>
</Button.Margin>
</Button>
|
Кроме того, существует ограниченное количество объектов, для которых преобразование типов является единственным открытым способом присвоения свойству значения нужного типа без использования подкласса, так как у самого типа отсутствует конструктор по умолчанию.Например, Cursor. |
Дополнительные сведения о поддержке преобразователя типов для синтаксиса атрибутов см. в разделе TypeConverters и XAML.
Корневые элементы XAML и пространства имен XAML
Файл XAML должен иметь только один корневой элемент, чтобы одновременно быть файлом XML с правильным форматом и допустимым файлом XAML.Обычно при работе с WPF используется корневой элемент, наиболее значимый в модели приложения WPF (например, Window или Page для страницы, ResourceDictionary для внешнего словаря или Application для определения приложения).В следующем примере показан корневой элемент обычного файла XAML для страницы WPF с корневым элементом Page.
XAML
Копировать
<Page
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
...
</Page>
Корневой элемент также содержит атрибуты xmlns и xmlns:x.Эти атрибуты указывают обработчику XAML, какие пространства имен XAML содержат определения типов для резервных типов, на которые будет ссылаться разметка в качестве элементов.Атрибут xmlns специально указывает пространство имен XAML по умолчанию.В пределах пространства имен XAML по умолчанию объектные элементы в разметке можно указывать без префикса.Для большинства сценариев приложения WPF и практически для всех примеров, приведенных в разделах SDK WPF, пространство имен XAML по умолчанию сопоставлено с пространством имен http://schemas.microsoft.com/winfx/2006/xaml/presentation WPF.Атрибут xmlns:x указывает дополнительное пространство имен XAML, которое сопоставлено пространству имен языка XAML http://schemas.microsoft.com/winfx/2006/xaml.
Это использование атрибутов xmlns для определения области использования и сопоставления области видимости имен согласовано со спецификацией XML 1.0.Области видимости имен XAML отличаются от областей видимости имен XML только тем, что область видимости имен XAML также подразумевает некоторую информацию о резервном копировании элементов области видимости имен по типам в случае разрешения типов и анализа XAML.
Обратите внимание, что атрибуты xmlns строго необходимы только для корневого элемента каждого XAML-файла.Определения xmlns будут применяться ко всем элементам-потомкам корневого элемента (такое поведение также соответствует спецификации XML 1.0 для xmlns). Атрибуты xmlns также разрешены для других элементов ниже корня и будут применены ко всем элементам-потомкам определяющего элемента.Впрочем, частое определение или повторное определение пространств имен XAML может сделать стиль разметки XAML трудным для человеческого восприятия.
В WPF реализация обработчика XAML включает инфраструктуру, содержащую информацию о ключевых сборках WPF.Ключевые сборки WPF содержат типы, поддерживающие сопоставления WPF с пространством имен XAML по умолчанию.Это осуществляется за счет конфигурации, являющейся частью файла построения проекта, построения WPF и систем проекта.Таким образом, объявление пространства имен XAML как xmlns по умолчанию — это все, что нужно, чтобы ссылаться на элементы XAML, полученные из сборок WPF.