Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АрхитектураБиологияГеографияДругоеИностранные языки
ИнформатикаИсторияКультураЛитератураМатематика
МедицинаМеханикаОбразованиеОхрана трудаПедагогика
ПолитикаПравоПрограммированиеПсихологияРелигия
СоциологияСпортСтроительствоФизикаФилософия
ФинансыХимияЭкологияЭкономикаЭлектроника

А.А. Волосевич

Свойства зависимостейи присоединённые свойства | Маршрутизируемыесобытия | Многопоточность в WPF | Приложения на основе страниц | Работа с панелью задач Windows 7 | Размер и выравнивание | Встроенные контейнеры компоновки | Прокрутка и декорирование содержимого | Элементы управления содержимым | Списковые элементы управления |


 

WINDOWSPRESENTATIONFOUNDATION

 

Курс лекций

для студентов специальности I-31 03 04 Информатика

всех форм обучения

 

Минск 2012


 

СОДЕРЖАНИЕ

1. общая Характеристика WPF.. 4

2. Структура Приложения WPF.. 5

3. XAML.. 7

4. Базовые концепции WPF.. 13

Иерархия классов. 13

Свойства зависимостей и присоединённые свойства. 15

Маршрутизируемые события. 18

Многопоточность в WPF.. 20

5. СТРУКТУРа приложений WPF.. 21

Класс Window.. 21

Класс Application. 23

Приложения на основе страниц.. 24

Приложения XBAP.. 26

Работа с панелью задач Windows 7. 27

6. Компоновка.. 28

Размер и выравнивание. 28

Встроенные контейнеры компоновки.. 30

Прокрутка и декорирование содержимого. 37

7. Обзор ЭЛЕМЕНТов УПРАВЛЕНИЯ WPF.. 39

Элементы управления содержимым.. 40

Списковые элементы управления. 43

Прочие элементы управления. 49

12. РЕСУРСЫ... 52

Двоичные ресурсы.. 52

Логические ресурсы.. 53

13. ПРИВЯЗКА данных.. 54

Базовые концепции привязки данных. 54

Практическое использование привязки данных. 57

Конвертеры значений.. 61

Проверка данных. 62

8. Фигуры... 65

9. Цвет, кисти, прозрачность.. 72

Представление цвета в WPF.. 72

Лучшие кисти.. 73

Прозрачность. 77

10. трансформации и эффекты... 78

11. Классы drawing и visual.. 81

14. СТИЛИ И триггеры... 85

15. ПРИвязкакколлекциямиШАБЛОНЫДАННЫХ.. 91

16. представления Данных.. 97

17. ШАблоны ЭЛЕМЕНТОВ УПРАВЛЕНИЯ.. 101

Литература. 105


 

1. общая ХарактеристикаWPF

Windows Presentation Foundation (WPF) – это технологиядля построения клиентских приложений Windows, являющаяся частью платформы.NET, начиная с версии 3.0.WPF разработана как альтернатива технологии WindowsForms. Ниже перечислены основные особенности технологии WPF.

1. Собственные методы построения и рендеринга элементов. ВWindowsForms классы для элементов управления делегируют функции отображения системным библиотекам, таким как user32.dll. В WPF любой элемент управления полностью строится (рисуется) самой WPF. Для аппаратного ускорения рендеринга применяется технология DirectX (рис. 1).

Рис. 1. Рендеринг в приложениях на основе WindowsFormsи WPF.

2. Независимость от разрешения устройства вывода. Для указания размеров в WPF используетсясобственная единица измерения, равная 1/96 дюйма.Кроме этого, технология WPF ориентирована на использование не пиксельных, а векторныхпримитивов.

3. Декларативный пользовательский интерфейс. В WPFвизуальное содержимое окна можнополностью описатьна языке XAML.Это язык разметки, основанный на XML. Так как описание пользовательского интерфейса отделено от кода, дизайнеры могут использовать профессиональные инструменты[1], чтобы редактировать файлы XAML, улучшая внешний вид приложения. Применение XAML является предпочтительным, но не обязательным – приложение WPF можно конструировать, используя только код.

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

5. Стили и шаблоны. Стили стандартизируют форматирование и позволяют повторно использовать его по всему приложению. Шаблоны дают возможность изменить способ отображения любых элементов управления, даже таких основополагающих, как кнопки или поля ввода.

6. Анимация. В WPF анимация – неотъемлемая часть программного каркаса. Анимация определяется декларативными дескрипторами, и WPF запускает её в действие автоматически.

7. Приложения на основе страниц. В WPF можно строить приложения с кнопками навигации, которые позволяют перемещаться по коллекции страниц. Кроме этого, специальный тип приложенияWPF – XBAP –может быть запущен внутри браузера.

2. Структура ПриложенияWPF

Построим простейшее однооконное приложение WPF. Дляэтогосоздадим файл Program.cs и поместим в него следующий код:

using System;

using System.Windows;

 

publicclassProgram

{

[STAThread]

publicstaticvoid Main()

{

var myWindow = newWindow();

myWindow.Title = "WPF Program";

myWindow.Content = "Hello, world";

var myApp = newApplication();

myApp.Run(myWindow);

}

}

Проанализируемэтоткод. Пространство имён System.Windows содержит классы Window и Application, описывающее окно и приложение соответственно.Точка входа помечена атрибутом [STAThread]. Это обязательное условие для любого приложенияWPF, оно связано с моделью многопоточности WPF.В методе Main() создаётся и настраивается объект окна, затем создаётся объект приложения. Вызов метода Run() приводит к отображению окна и запуску цикл обработки событий (окно «ждёт» действий пользователя).Чтобы скомпилировать приложение, необходимо указать ссылки на стандартные сборки PresentationCore.dll, PresentationFramework.dll, System.Xaml.dll и WindowsBase.dll.

Отметим, что приложение допускает другую организацию. Вместо настройки объектаклассаWindow можно создать наследник этого класс и выполнить настройку в конструкторе наследника или в специальном методе:

// наследник класса Window, описывающий пользовательское окно

publicclassMainWindow: Window

{

public MainWindow()

{

Title = "WPF Program";

Content = "Hello, world";

}

}

ВVisualStudioприложениям WPFсоответствует отдельный шаблон проекта. Этот шаблон ориентирован на использование XAML, поэтому в случае однооконного приложения VisualStudioсоздаст следующий набор файлов:

· файлMainWindow.xaml.csна языке C# и MainWindow.xamlна языке XAMLописывают класс MainWindow, являющийся наследником класса Window;

· файлы App.xaml.csи App.xamlописывают класс App, наследник класса Application.

Ниже приведён файлMainWindow.xamlдля простейшего окна:

<Window x:Class="WpfApplication.MainWindow"

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

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

Title="WPF Program"Height="270" Width="400">

Hello, world

</Window>

VisualStudioвыполняеткомпиляциюпроекта, созданного по шаблонуWPF,вдваэтапа.ВначаледлякаждогофайлаXAMLгенерируетсядвафайла, сохраняемыхвподкаталогахobj\Debugилиobj\Release (взависимости от цели компиляции):

· файл с расширением *.baml – двоичное представление XAML-файла, внедряемое в сборку в виде ресурса (BAML-файл);

· файл с расширением *.g.cs – разделяемый класс, который соответствует XAML-описанию. Этот класс содержит поля для всех именованных элементов файла XAML и реализацию метода InitializeComponent(), загружающего BAML-данные из ресурсов сборки. Кроме этого, класс содержит метод, подключающий все обработчики событий.

На втором этапе сгенерированные файлы компилируются вместе с исходными файламиC# в единую сборку (рис. 2).

Рис. 2. Компиляция WPF-приложения в VisualStudio.

3. XAML

Расширяемый язык разметки приложений (eXtensibleApplicationMarkupLanguage, XAML[2]) – это язык для представления дерева объектов.NET, основанный на XML. Данные XAMLпревращаются в дерево объектов при помощи анализатора XAML (XAMLparser). Основное назначение XAML – описание пользовательских интерфейсов в приложениях WPF. Однако XAMLиспользуется и в других технологиях, в частности, в Silverlight.

Рассмотрим основные правила XAML.Документ XAMLзаписан в формате XML. Это означает, что именаэлементовXAML чувствительны к регистру,нужна правильная вложенность элементов,а некоторые символы требуют особого обозначения (например, &amp;–это символ &). Кроме этого, XAMLпо умолчанию игнорирует лишние пробельные символы. Это поведение изменяется следующей установкой: xml:space="preserve".

Объектные элементы XAML описываютобъект некоторого типа платформы.NETи задают значения открытых свойств и полей объекта.Имя элемента указывает на тип объекта. Ниже приведеноописаниеXAML для объекта класса Button (кнопка), а также эквивалентный код на языке C#:

<!-- определение объекта в XAML -->

<Button Width="100">

I am a Button

</Button>

 

// определение объекта в коде

Button b = newButton();

b.Width = 100;

b.Content = "I am a Button";

Типы.NET обычно вложены в пространства имён. В XAMLпространству имён.NETставится в соответствие пространство имён XML. Для этого используется следующий синтаксис:

xmlns: префикс ="clr-namespace: пространство-имён "

При необходимости указывается сборка, содержащая пространство имён:

xmlns: префикс ="clr-namespace: пространство-имён;assembly= имя-сборки "

Для нужд WPFзарезервировано два пространства имёнXML:

1. http://schemas.microsoft.com/winfx/2006/xaml/presentation– обычно является пространством имён по умолчанию (указывается без префикса) исоответствует набору пространств имён.NET с типами WPF (эти пространства имён имеют вид System.Windows.*).

2. http://schemas.microsoft.com/winfx/2006/xaml– отвечает пространству имён System.Windows.Markup, а также позволяет выделить директивы (указания) для анализатора XAML.Пространству имён анализатора XAMLпо традиции ставят в соответствие префикс x.

<!-- в этом фрагменте заданы три пространства имён -->

<Window

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

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

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

 

</Window>

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

<!-- задаём у кнопки красный фон -->

<ButtonBackground="Red" />

Анализатор XAML применяет для преобразования строки в значение свойства специальные конвертеры типов [3]. Приведённый выше фрагмент XAMLэквивалентен следующему коду на C#:

varb = newButton();

 

// TypeConverterиTypeDescriptorопределенывSystem.ComponentModel

TypeConverter convert = TypeDescriptor.GetConverter(typeof (Brush));

b.Background = (Brush) convert.ConvertFromInvariantString("Red");

Платформа.NETсодержит более ста стандартных конвертеров.При необходимости можно разработать собственный конвертер, используя базовый класс TypeConverter.

Элемент свойства вложен в объектный элемент и имеетвид< имя-типа.имя-свойства >. Содержимое элемента свойства рассматривается как значение свойства (при необходимости применяются конвертеры типов).Обычно элементы свойств используются для задания значений агрегируемых объектов.

<Button>

<Button.Width>100</Button.Width>

<Button.Background>Red</Button.Background>

</Button>

Тип, соответствующий объектному элементу, может быть помеченатрибутом[ContentProperty]с указанием имени свойства содержимого. В этом случае анализатор XAMLрассматриваетсодержимое объектного элемента (за исключением элементов свойств)как значение для свойства содержимого. Например, в классеContentControl (он является базовым для классаButton) свойством содержимого является Content:

[System.Windows.Markup.ContentProperty("Content")]

publicclassContentControl

{

publicobject Content { get; set; }

 

// другие элементы класса ContentControl не показаны

}

Это означает, что следующие два фрагмента XAMLэквиваленты:

<ButtonContent="Click me!"/>

 

<Button>Click me!</Button>

Если тип реализует интерфейсы IList или IDictionary, при описании объектаэтого типа в XAMLдочерние элементы автоматически добавляются в соответствующую коллекцию. Например, свойство ItemsклассаListBox имеет тип ItemCollection, а этот тип реализует IList:

<ListBox>

<ListBox.Items>

<ListBoxItem Content="Item 1"/>

<ListBoxItem Content="Item 2"/>

</ListBox.Items>

</ListBox>

Кроме этого, Items – это свойство содержимого для ListBox, а значит,XAML-описание можно упростить:

<ListBox>

<ListBoxItem Content="Item 1"/>

<ListBoxItem Content="Item 2"/>

</ListBox>

Во всех предыдущих примерах использовалось конкретное указание значения свойства. Механизм расширений разметки (markupextensions) позволяет вычислять значение свойства при преобразовании XAMLв дерево объектов. Технически, любое расширение разметки – это класс, унаследованный от System.Windows.Markup.MarkupExtension и перекрывающий функцию ProvideValue(). Встретив расширение разметки, анализатор XAMLгенерирует код, который создаёт объект расширения разметки и вызывает ProvideValue() для получения значения. Приведём пример расширения разметки:

using System;

using System.Windows.Markup;

 

namespace MarkupExtensions

{

publicclassShowTimeExtension: MarkupExtension

{

publicstring Header { get; set; }

 

public ShowTimeExtension(){}

 

publicoverrideobject ProvideValue(IServiceProvider p)

{

returnstring.Format("{0}: {1}", Header?? string.Empty,

DateTime.Now);

}

}

}

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

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

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

xmlns:local="clr-namespace:MarkupExtensions">

<StackPanel>

<Button Content="{local:ShowTime}"/>

<Button Content="{local:ShowTime Header=Time}"/>

</StackPanel>

</Window>

Расширения разметки могут применятьсякак значения элементов свойств:

<Button>

<Button.Content>

<local:ShowTime Header="Time" />

</Button.Content>

</Button>

Втабл. 1 представлены стандартные расширения разметки, доступные после подключения пространства имён System.Windows.Markup.

Таблица 1

Расширения разметкиизSystem.Windows.Markup

Имя Описание, пример использования
x:Array Представляет массив. Дочерние элементы становятся элементами массива <x:Array Type="{x:Type Button}"> <Button /> <Button /> </x:Array>
x:Null Представляет значениеnull Style="{x:Null}"
x:Reference Используется для ссылки на ранее объявленный элемент <TextBoxName="customer" /> <LabelTarget="{x:Referencecustomer}" />
x:Static Представляет статическое свойство, поле или константу Height="{x:Static SystemParameters.IconHeight}"
x:Type Аналог применения оператора typeof из языка C#

Рассмотрим некоторые директивы анализатора XAML, применяемые в WPF.Анализатор генерирует код, выполняющий по документу XAML создание и настройку объектов. Действия собъектами (в частности, обработчики событий) обычно описываются в отдельном классе. Чтобы связать этот класс с документом XAMLиспользуется директива-атрибут x:Class. Этот атрибут применяется только к корневому элементу и содержит имя класса, являющегося наследником класса корневого элемента:

<Window x:Class="WpfApplication.MainWindow"

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

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

<Buttonx:Name="btn" Content="Click me!"/>

</Window>

Чтобы сослаться на объект в коде, этот объект должен иметь имя. Для указания имени объекта используется директива-атрибутx:Name:

<Buttonx:Name="btn"Content="Click me!"/>

Заметим, что многие элементы управления WPF имеют свойство Name. Анализатор XAML использует соглашение, по которому задание свойства Name эквивалентно указанию директивы-атрибутаx:Name.

Существует возможность встроить фрагмент кода в XAML-файл. Для этого используется директива-элемент x:Code.Такой элемент должен быть непосредственно вложен в корневой элемент, у которого имеется атрибут x:Class.

<Window x:Class="WpfApplication.MainWindow"

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

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

<Button x:Name="btn" Click="btn_click" Content="Click me!" />

<x:Code>

<![CDATA[

voidbtn_click(object sender, RoutedEventArgs e)

{

btn.Content = "Inline Code Works!";

}

]]>

</x:Code>

</Window>

Директива-атрибут x:Keyприменятся при описании дочерних элементов объекта-словаря и позволяет указать ключ словаря для элемента:

<Window.Resources>

<SolidColorBrush x:Key="borderBrush" Color="Red" />

<SolidColorBrush x:Key="textBrush" Color="Black" />

</Window.Resources>

В.NETFramework 4.0 была представлена новая версия XAML, известная как XAML 2009. XAML 2009 пока не используется при описании интерфейсов WPF-приложений, поэтому только упомянём его основные особенности:

– полная поддержка универсальных типов (generics);

– работа с базовыми типами.NET (числа, строки) без подключения дополнительных пространств имён;

– создание объектов, используя вызов конструктора с параметрами;

– создание объектов путём вызова заданного фабричного метода;

– расширенное управление обработчиками событий.

Платформа.NETвключает классы, образующие программный интерфейс для работы с XAML. Большинство классов принадлежит пространству имён System.Xaml и находится в одноимённой сборке. Статический класс XamlServices содержит методы для сериализации объектов в формате XAML. КлассыXamlReader, XamlWriterи их наследники дают доступ к структуре XAML-данных. Класс System.Windows.Markup.XamlReader осуществляет загрузку XAML и порождает соответствующее дерево объектов.

publicclassBook

{

publicstring Name { get; set; }

publicint ISBN { get; set; }

}

 

// сериализация объекта класса Bookв XAML-формате

var book = newBook {Name = "First", ISBN = 123};

XamlServices.Save("book.xaml", book);

 

// создание WPF-окна на основе XAML-описания

Window window = null;

using (Stream s = File.OpenRead("MyWindow.xaml"))

{

// предполагается, что тип корневого элемента известен

window = (Window) System.Windows.Markup.XamlReader.Load(s);

}

4. Базовые концепции WPF


Дата добавления: 2015-11-14; просмотров: 42 | Нарушение авторских прав


<== предыдущая страница | следующая страница ==>
ИССЛЕДОВАНИЯ И ОПРОСЫ, ИНИЦИИРОВАННЫЕ ЕВРОПЕЙСКОЙ КОМИССИЕЙ| Иерархия классов

mybiblioteka.su - 2015-2024 год. (0.033 сек.)