Классы Windows Presentation Foundation System.Object DispatcherObject Application DependencyObject NavigationService FrameworkTemplate Visual ContentElement UIElement FrameworkContentElement Style FrameworkElement Page Shape TextBlock ContentControl RangeBase TextBoxBase Frame Slider TextBox Window ProgressBar RichTextBox NavigationWindow ButtonBase Grid ItemsControl Canvas MenuBase Menu ContextMenu HeaderedItemsControl MenuItem Button Toolbar Selector RepeatButton TabControl ToggleButton CheckBox Panel ToolBarTray Control RadioButton ListBox ListView TreeView ComboBox Ресурсы WPF Два типа ресурсов WPF: • объектные ресурсы (object resource) – определенный .NET-объект, который можно использовать многократно; объектные ресурсы размещаются в словарях ресурсов ResourceDictionary, которые определены во всех элементах, производных от FrameworkElement или FrameworkContentElement. • ресурсы сборки ( assembly resource) – двоичные данные, встроенные в скомпилированную сборку. Двоичные ресурсы WPF Двоичные файлы данных приложения WPF • файлы ресурсов (Resource Files) - файлы данных, скомпилированные либо в исполняемую, либо в библиотечную сборку WPF; • файлы содержимого (Content Files) - автономные файлы данных, которые не компилируются в сборку, но метаданные скомпилированной сборки содержат информацию о них; • файлы исходного узла (Site of Origin Files) - автономные файлы данных, не имеющие связи с исполняемой сборкой WPF. Файлы ресурсов и содержимого добавляются в приложение с помощью MSBuild. WPF предоставляет для загрузки ресурсов несколько API. Файлы ресурсов WPF Данные, скомпилированные в исполняемую или библиотечную сборку WPF, всегда доступны приложению, но в случае их изменения требуется перекомпиляция приложения. В Visual Studio, чтобы скомпилировать двоичные данные в сборку как ресурс, файл с данными надо добавить в проект и для свойства Build Action этого файла задать значение Resource. Для доступа к файлам ресурсов, встроенных в сборку, в XAML используется относительный или абсолютный URI, в коде можно использовать статический метод GetResourceStream класса Application, возвращающий null, если ресурс не найден. public static StreamResourceInfo GetResourceStream( Uri uriResource ); Свойства класса StreamResourceInfo дают доступ к данным public string ContentType { get; } public Stream Stream { get; } В примере файл Tree.jpg с изображением был скомпилирован в сборку. Изображение выводится в элемент управления Image. private void Resource_Click(object sender, RoutedEventArgs e) { Uri image1_Uri = new Uri("/Tree.jpg", UriKind.Relative); image1.Source = new BitmapImage(image1_Uri); } Файлы содержимого WPF Файл содержимого не компилируются в сборку, но в метаданных сборки есть информация о нем. При изменении файла содержимого перекомпиляция приложения не нужна. Чтобы скомпилировать двоичные данные как файл содержимого в Visual Studio, файл надо добавить в проект и для свойства Build Action этого файла задать значение Content. Для доступа к файлам содержимого в XAML используется URI, в коде доступ к данным можно получить с помощью статического метода GetContentStream класса Application. public static StreamResourceInfo GetContentStream( Uri uriContent ); Файлы исходного узла WPF Файлы исходного узла - автономные файлы данных, которые не имеют связи с исполняемой сборкой WPF. Используются в следующих случаях: • файл не существует во время компиляции; • возможно обновление файла данных без перекомпиляции сборки; • файл данных имеет большой размер, и следует загружать его только по запросу. В Visual Studio можно скомпилировать двоичные данные как файл исходного узла, если добавить его к проекту и задать значение None для его свойства Build Action. Единственный результат – файл будет скопирован в каталог проекта. Для доступа к файлам в XAML можно использовать URI, для доступа в коде – статический метод GetRemoteStream класса Application. public static StreamResourceInfo GetRemoteStream( Uri uriRemote ); В примере изображение из файла garden.jpg выводится в элемент управления Image. private void Site_of_Origin_Click(object sender, RoutedEventArgs e) { try { image3.Source = new BitmapImage( new Uri("C:\\Users\\Public\\Pictures\\Sample Pictures\\garden.jpg“, UriKind.RelativeOrAbsolute)); } catch(Exception ex) { MessageBox.Show(ex.Message); } } URI (Универсальный идентификатор ресурса) URI (universal resource identifier) – строка символов, кодирующая адрес информационного ресурса. Спецификации URI определены в интернет-стандартах RFC 2396 и RFC 3986. Все элементы URI должны состоять только из символов базовой латиницы (символы из кодировок Unicode/ISO 10646). Чтобы включить в них другие символы, их необходимо преобразовать в формат UTF-8 и представить в виде %xx, где xx — шестнадцатеричный код байта. Международный код ресурса IRI (international resource identifier) позволяет применять символы Юникода. Спецификации IRI определены в стандарте RFC 3987. Класс Uri в .NET Framework версии 3.5, 3.0 с пакетом обновления 1 (SP1) и 2.0 с пакетом обновления 1 (SP1) поддерживает IRI в соответствии со стандартом RFC 3987. Полный URI имеет вид Протокол:// авторизация// путь к ресурсу на сервере ? запрос Обязательным элементом полного URI является протокол, остальные элементы зависят от протокола. Относительные URI могут использоваться, когда тем или иным способом определен базовый URI. Относительные URI ресурсов указываются относительно базового URI. Класс Uri Класс Uri обеспечивает объектное представление универсального кода ресурсов (URI), а также простой доступ к его частям. После создания объекта Uri его свойства доступны только для чтения. Создание объекта, который допускает изменение, поддерживает класс UriBuilder. Конструкторы класса (5) создают экземпляры Uri на основе строки кода URI и/или на основе базовых и относительных Uri. public Uri( string uriString ); public Uri( Uri baseUri, string relativeUri ); Конструкторы анализируют URI, выполняют преобразования в канонический формат и применяют необходимые escape-кодировки. Конструкторы бросают исключение UriFormatException, если входные данные заданы неправильно. Конструкторы не проверяют, что объект Uri ссылается на доступный ресурс. Интерфейс IUriContext Интерфейс IUriContext обеспечивает установку базового URI. public interface IUriContext { Uri BaseUri { get; set; } } Один из конструкторов класса Uri public Uri( string uriString, UriKind uriKind ); позволяет указать, является ли строка URI относительным или абсолютным URI. Перечисление UriKind имеет значения Absolute, Relative и RelativeOrAbsolute. Фигуры(shapes) и рисунки(drawings) DependencyObject Visual Freezable UIElement Animatable Фигуры (shapes) – это элементы управления. FrameworkElement Brush Shape Drawing Рисунки (drawing) – API для взаимодействия с низкоуровневым механизмом композиции. Ellipce ImageDrawing Line GeometryDrawing Path Polygon GeneralTransform Geometry Polyline LineGeometry Rectangle RectangleGeometry Image Классы, производные от System.Windows.Shapes.Shape, • поддерживают события, как и другие элементы управления; • участвуют в системе макета, их можно разместить в любой контейнер компоновки; • автоматически перерисовываются при изменении размера, перемещении или изменении свойств. … ImageSource DrawingImage BitmapSource BitmapImage CroppedBitmap … Image – элемент управления для просмотра ImageSource. Элемент управления Image Класс Image представляет элемент управления для отображения изображений. Элемент управления Image позволяет загружать изображения в форматах BMP, GIF, ICO, JPG, PNG, WDP и TIFF. public class Image : FrameworkElement, IUriContext { } Источник изображения передается элементу управления через свойство Source: public ImageSource Source { get; set; } Размерами изображения можно управлять с помощью свойств Width и/или Height, для управления растяжением изображения используются свойства Stretch и StretchDirection. Перечисление Stretch (тип свойства Stretch) имеет значения None Сохраняется исходный размер изображения. Fill Изображение растягивается(сжимается) для заполнения всего элемента управления. Uniform Изображение растягивается(сжимается) для заполнения одного измерения элемента управления с сохранением исходных пропорций. UniformToFill Изображение растягивается(сжимается) и обрезается для заполнения всего элемента управления с сохранением исходных пропорций. Класс ImageSource Класс ImageSource – абстрактный базовый класс для.DrawingImage и BitmapSource. • Класс BitmapSource предоставляет средства для работы с растровыми изображениями в форматах BMP, GIF, JPEG, PNG и TIFF. • Класс DrawingImage поддерживает вывод объектов Drawing в элемент управления Image. Класс BitmapSource имеет производный класс BitmapImage, специально определенный для поддержки XAML. В класс BitmapImage добавлены дополнительные свойства BaseUri и UriSource для загрузки растровых изображений. public Uri BaseUri { get; set; } public Uri UriSource { get; set; } Класс CroppedBitmap Класс CroppedBitmap позволяет вырезать прямоугольную область из растрового изображения. Область определяется с помощью свойства SourceRect. public Int32Rect SourceRect { get; set; } Структура Int32Rect содержит координаты X, Y левого верхнего угла , ширину и высоту прямоугольной области внутри изображения. В примере из изображения, которое находится в словаре ресурсов главного окна как элемент с ключом “Image_Waterfall”, вырезается прямоугольная область размером 512 x 384 с координатами левого верхнего угла (10, 20). <Window.Resources> <Window.Resources> <BitmapImage x:Key="Image_Waterfall" UriSource="/WaterFall.jpg"/> <BitmapImage x:Key="Image_Waterfall" UriSource="/WaterFall.jpg"/> <CroppedBitmap x:Key="croppedImage" <CroppedBitmap x:Key="croppedImage" Source="{StaticResource Image_Waterfall}" SourceRect=«10 20 512 384"/> Source="{StaticResource Image_Waterfall}" SourceRect=«10 20 512 384"/> </Window.Resources> </Window.Resources> Полученное изображение выводится в элемент управления Image. <Image Height="75" HorizontalAlignment="Left" Margin="29,0,0,12" Name="image4" Stretch="Uniform" Width="127" Source="{StaticResource croppedImage}" /> Классы Toolbar и ToolBarTray Класс ToolBarTray представляет собой контейнер для элементов управления ToolBar, управляет расположением, изменением размеров, операциями перетаскивания и упорядочивания элементов управления ToolBar. В классе ToolBarTray поддерживается коллекция элементов ToolBar public Collection<ToolBar> ToolBars { get; } Класс ToolBar является производным от класса ItemsControl и представляет собой контейнер для элементов управления. В классе ToolBar определены свойства, которые можно использовать для его размещения внутри контейнера ToolBarTray. public int Band { get; set; } public int BandIndex { get; set; } Свойство OverflowMode класса Toolbar В классе ToolBar определено присоединенное свойство OverflowMode public static void SetOverflowMode( DependencyObject element, OverflowMode mode ) ; public static OverflowMode GetOverflowMode( DependencyObject element ); Присоединенное свойство управляет размещением элементов в панели переполнения и имеет тип OverflowMode – перечисление со значениями: AsNeeded Размещение элемента в панели переполнения зависит от доступного пространства. Always Элемент всегда размещается в панели переполнения. Never Элемент никогда не размещается в панели переполнения. В примере элемент управления ComboBox всегда размещается в панели переполнения. <ToolBar > <Button> <Image Source="{StaticResource Image_New}" /> </Button> <ComboBox Width="120" SelectedIndex="0" ToolBar.OverflowMode="Always"> <ComboBoxItem > Green </ComboBoxItem> <ComboBoxItem > Red </ComboBoxItem> </ComboBox> </ToolBar >