Скачать презентацию
Идет загрузка презентации. Пожалуйста, подождите
Презентация была опубликована 9 лет назад пользователемВячеслав Мосолов
1 Литература 1. Мэтью Мак-Дональд. Windows Presentation Foundation в.NET 3.5 с примерами на C# 2008 для профессионалов - Изд. Вильямс, Крис Андерсон. Основы Windows Presentation Foundation. – ДМК Пресс, СПб, Петцольд Ч. Microsoft Windows Presentation Foundation. Базовый курс. - Изд. Microsoft Press. Русская редакция, СПб.: Питер, 2008.
2 Программные модели пользовательского интерфейса 1985 Windows API ( Windows 1.0) 1990 Windows API ( Windows 3.0) 1992 MFC (Microsoft Foundation Classes) – библиотека классов C Windows Forms в.NET Framework WPF (Windows Presentation Foundation) в.NET Framework 3.0
3 Цели разработки Windows Presentation Foundation Основная цель разработки WPF – создать новую унифицированную платформу, которая заменила бы всю инфраструктуру создания приложений на стороне клиента и использовала бы лучшее из Win32 и Web. В начале 2000-х Microsoft поддерживала четыре платформы для создания пользовательского интерфейса User32/GDI32, Ruby (формы Visual Basic), Trident (отображение web-страниц в приложениях) и Windows Forms, в основе которых лежали разные модели программирования. Цели при проектировании WPF: создать платформу для развитой презентации; создать платформу, поддерживающую взаимодействие кода и декларативной модели программирования; стереть границы между Windows и Web.
4 WPF- Windows Presentation Foundation Весь вывод происходит через DirectX – интерфейс аппаратно-ускоренной графики. Common Language Runtime Windows 7 Windows Vista Windows XP Windows Server 2003 DirectX Windows Presentation Foundation PresentationFrameworkPresentationCoremilcore WindowsForms
5 Windows Forms и Win32 API WindowsForms - управляемый API в.NET Framework 1.0, 2.0, 3. x для создания пользовательского интерфейса локальных приложений. WindowsForms - это фактически управляемый слой над User32 и GDI+. Классы WindowsForms поддерживают все элементы пользовательского интерфейса Win32. Некоторые классы описывают элементы управления, работающие только в.NET Framework. Большая часть типов WindowsForms определена в пространстве имен System.Windows.Forms и во вложенных пространствах имен.
6 Иерархия классов Windows Forms System.Object MarshalByRefObject Component Control ScrollableControl ContainerControl Form ButtonBase ButtonCheckButtonRadioButton TextBoxBase TextBoxRichTextBox ListControl ListBoxComboBox ListView TreeView DataGrid DateTimePicker CommonDialog FolderBrowserDialog ColorDialog FontDialog PrintDialog PageSetupDialog FileDialog OpenFileDialogSaveFileDialog Menu ContextMenu MainMenu MenuItem
7 Классы Windows Presentation Foundation System.Object DispatcherObject ApplicationDependencyObject Visual UIElement FrameworkElement Page Shape TextBlock Control ContentControl Frame Window NavigationWindow ButtonBase Button RepeatButton ToggleButton CheckBoxRadioButton RangeBase Slider ProgressBar TextBoxBase TextBox RichTextBox ItemsControl MenuBase MenuContextMenu HeaderedItemsControl MenuItemToolbar Selector TabControl ListBox ListView ComboBox TreeView Panel GridCanvas ContentElement FrameworkContentElement FrameworkTemplateStyle NavigationService
8 WPF и XAML Одна из задач, которая была решена при проектировании и реализации WPF, - разделение работы между дизайнерами и программистами. Решение состоит в разделении исходного кода WPF-приложения на две части: декларативное описание пользовательского интерфейса с использованием языка разметки XAML (EXtensible Application Markup Language ); код на языке программирования, например C#, содержащий обработку событий. Для компиляции WPF-приложений обычно используется Microsoft Build Engine (MSBuild) – технология, включенная в.NET Framework 3. x в виде набора сборок.
9 Компиляция WPF приложений При компиляции XAML файлы разбираются (parsed) и преобразуются в коды на языке BAML ( Binary Application Markup Language), которые встраиваются как ресурс в исполняемый файл. Код BAML компактнее исходного XAML кода и при выполнении его загрузка выполняется быстрее, чем загрузка XAML файла. При компиляции для каждого XAML файла создается файл с кодом на языке программирования, содержащий частичное (partial) объявление класса для элемента верхнего уровня в файле разметки. В общем случае компиляция XAML файлов осуществляется в два прохода. Сначала компилируются только те XAML файлы, которые не содержат ссылки на локально-определенные типы (типы, определенные в данном проекте), так как они существуют только в виде исходного кода и еще не были скомпилированы. XAML файлы со ссылками на локально-определенные типы компилируются при втором проходе компилятора. Вся необходимая для работы MSBuild информация об исходных файлах, ссылках на зависимые сборки и конфигурация приложения находится в файлах проекта MSBuild - XML файлах, подчиняющихся схеме MSBuild.
10
Элементы XAML Элементы XAML отображаются на типы Microsoft.NET, атрибуты элементов XAML на члены этих типов. Начальное состояние объекта ( object instance) базируется на поведении конструктора без параметров (default constructor). В примере 1 фрагмент кода XAML содержит элемент Button, отвечающий классу System.Windows.Controls.Button. С использованием синтаксиса атрибутов XAML свойствам Height, HorizontalAlignment, Margin и Name элемента Button присвоены значения. Get
11
Пространства имен XAML Два пространства имен – пространство имен XAML и пространство имен WPF - присутствуют во всех WPF документах:
12
Пространства имен XAML и WPF Использование двух пространств имен объясняется тем, что XAML – это стандарт языка, а WPF – одна из реализаций, которая использует XAML как язык. Реализация WPF резервирует пространство имен по умолчанию для собственного API. Есть соглашение использовать префикс x: для общих конструкций XAML. Пространству имен, определенному в любой сборке CLR, можно поставить в соответствие имя пространства имен в разметке. В примере пространству имен Labs, определенному в сборке UserLibrary, ставится в соответствие пространство имен в разметке с префиксом my: xmlns:my="clr-namespace:Labs;assembly=UserLibrary Классы, определенные в сборке LabsLibrary, можно использовать в разметке, указав их с префиксом my:
13
Правила обработки пробелов в XAML В XAML(как и в XML) символами-пробелами (whitespace) считаются пробел(Unicode 0020), символ перевода строки (\n - Unicode 000A) и символ табуляции (\t - Unicode 0009). По умолчанию синтаксический анализатор XAML сначала все символы-пробелы заменяет пробелами, а затем все подряд идущие пробелы заменяет одним пробелом. Можно отказаться от обработки пробелов по умолчанию, указав атрибут xml:space="preserve в элементах, для которых необходимо сохранить символы-пробелы. В примере текст на кнопке button1 выводится в одну строку с одним пробелом между словами Test и Button, а текст на кнопке button2 в две строки с сохранением всех пробелов.
14 Код(code-behind) и XAML Обычно WPF-приложение содержит как разметку( XAML код), так и код C# (code-behind). Обычно XAML полностью описывает интерфейс пользователя, а обработчики событий находятся в коде C#, их имена указываются в разметке как значения атрибутов. Обработчики вызываются на стадии выполнения, когда возникают события. Соответствие разметки и кода C# устанавливается путем указания в корневом элементе XAML пространства имен и класса в атрибуте x:Class. С объектами, которые создаются на основе определений в XAML, по умолчанию не связывается переменная. Для этой цели определен атрибут x:Name, с помощью которого с объектом можно связать переменную и использовать ее в коде C#. Некоторые WPF-классы имеют свойство Name, которое можно использовать как эквивалент атрибута x:Name. Класс XamlReader с методом Load дает возможность загрузить код XAML во время выполнения. В результате компиляции будет создано дерево объектов, которое можно использовать как значение свойства ранее созданного в приложении объекта. Это возможно только в full-trust приложениях.
15 Атрибуты XAML и значения свойств объектов WPF Значением атрибута XAML должна быть строка символов, заключенная в двойные кавычки. Значение обрабатывается XAML-процессором и определяется типом свойства CLR. для примитивных типов используется принятое по умолчанию преобразование типа string к данному типу; для свойства, которое имеет тип перечисление(enumeration), строка трактуется как имя элемента перечисления; в остальных случаях значение атрибута должно быть обработано преобразователем типа (type converter). Get В разметке свойству Height типа double присвоено значение 23, а свойству VerticalAlignment, которое имеет тип перечисления VerticalAlignment, присвоено значение перечисления Bottom. public double Height { get; set; } public VerticalAlignment VerticalAlignment { get; set; } Пример. В классе Button определены свойства
16 Преобразователи типов (TypeConverters) Преобразователь типа (type converter) определяется либо для конкретного свойства класса CLR, которому присваивается значение, либо для типа этого свойства. Преобразователь принимает строку и как результат возвращает объект типа, который имеет свойство CLR. Get public Thickness Margin { get; set; } Свойство Margin класса Button имеет тип Thickness. Со структурой Thickness связан преобразователь ThicknessConverter, который преобразует строку к типу Thickness.
17 Преобразователи типов (TypeConverters) в WPF Преобразователь типа связывается с типом или конкретными свойствами типа с помощью атрибута CLR TypeConverterAttribute, которому передается как параметр имя типа, который будет использоваться как преобразователь. Так структура Thickness объявлена с атрибутом CLR TypeConverterAttribute, в котором в качестве преобразователя указан класс ThicknessConverter. [TypeConverterAttribute(typeof(ThicknessConverter))] public struct Thickness : IEquatable Класс-преобразователь типа должен быть производным от класса TypeConverter и может переопределять методы, выполняющие преобразования, ( например, ConvertTo и ConvertFrom) и булевские свойства CanConvertTo и CanConvertFrom, предоставляющие информациею о том, возможны ли преобразования. public Object ConvertFrom( Object value ); public bool CanConvertTo( Type destinationType ); public bool CanConvertFrom( Type sourceType ); public bool CanConvertTo( Type destinationType );
18 Элемент-свойство (property element) Для установки значений свойств, которые являются ссылками на объекты ( возможно имеющие свой набор свойств) может использоваться синтаксис элемент-свойство (property element). Синтаксис элемента-свойство: content Обычно content – это объект, который принимается как значение свойства. В примере синтаксис элемент-свойство используется для установки значения свойства ContextMenu класса ListBox. В разметке как значение свойства ContextMenu используется элемент. public ContextMenu ContextMenu { get; set; }
19 Синтаксис элемент-свойство для коллекций Для свойства, которое является коллекцией, тип коллекции в разметке не указывается. Элементы коллекции размещаются как один или несколько дочерних элементов. В процессе загрузки каждый элемент инициализируется (конструктором без параметров) и добавляется в коллекцию с помощью метода Add. XAML–процессор для WPF поддерживает коллекции, реализующие интерфейсы IList и IDictionary. Расширения XAML поддерживают работу с массивами. В примере свойство Items класса ContextMenu, представляющее собой коллекцию ItemCollection элементов типа MenuItem, инициализируется с использованием синтаксиса элемент-свойство для коллекций.
20
Обработчики событий Обычно WPF-приложение содержит как XAML код, так и код на C#( code-behind). Обработчики событий обычно находятся в коде C#, их имена указываются в разметке как значения атрибутов. В примере в разметке с событием Closing для окна связан обработчик Window_Closing, а с событием Click для кнопки - обработчик button1_Click.
21 Расширения языка разметки (Markup extentions) По умолчанию XAML-процессор интерпретирует значения атрибутов как литеральные строки и выполняет преобразование строк в объекты с помощью преобразователей типов. Расширения языка разметки (markup extentions ) позволяют выполнить более сложную инициализацию: использовать ссылку на ранее созданный или статический объект; указать в конструкторе объекта значения параметров, отличные от значений по умолчанию; отложить обработку значений до времени выполнения, передав ее классу (backing class). Расширения разметки заключаются в фигурные скобки. Наиболее часто используемые расширения языка разметки в WPF - Binding, StaticResource и DynamicResource.
22
Расширения языка разметки. Пример В следующем примере контекстное меню определено как ресурс с ключом MyContextMenu_1 и затем используется как значение для свойства ContextMenu элемента ListBox
23 Контентный синтаксис (Content Syntax) в XAML Контентный синтаксис XAML допустим только для классов CLR, имеющих атрибут ContentPropertyAttribute в объявлении. В параметре атрибута ContentPropertyAttribute указывается имя свойства класса CLR, которое XAML-процессор трактует как содержимое (content) для данного класса ( включая производные классы). Например, класс Button имеет атрибут ContentPropertyAttribute, унаследованный от базового класса ContentControl. XAML-процессор любой дочерний элемент или внутренний текст между открывающим и закрывающим тэгом элемента трактует как содержимое элемента. Исключение составляют тэги элементов-свойств, которые обрабатываются в первую очередь и не рассматриваются как содержимое элемента. Контентное свойство объекта имеет конкретный тип. Контентным типом может быть тип- коллекция, но в любом случае содержимое -это единственный объект. [ContentPropertyAttribute("Content")] public class ContentControl : Control, IAddChild [ContentPropertyAttribute("Items")] public class ItemsControl : Control, IAddChild Класс ListBox имеет атрибут ContentPropertyAttribute, унаследованный от базового класса ItemsControl.
24 Контентный синтаксис в XAML. Пример Green White Red Значение контентного свойства XAML дожно быть непрерывным, то есть должно находиться целиком до или целиком после любого другого элемента-свойства. В примере сначала инициализруется свойство ContextMenu объекта ListBox. В классе ContextMenu контентным является свойство Items, представляющее собой коллекцию. Затем инициализируетя контентное свойство Items класса ListBox, также представляющее собой коллекцию. Каждый элемент коллекции является объектом типа ListBoxItem, который наследует контентное свойство Content от базового класса ContentControl.
Еще похожие презентации в нашем архиве:
© 2024 MyShared Inc.
All rights reserved.