150 likes | 431 Views
Классы Windows Presentation Foundation. Ресурсы WPF. Два типа ресурсов WPF:
E N D
Ресурсы 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, чтобы скомпилировать двоичные данные в сборку как ресурс, файл с данными надо добавить в проект и для свойства BuildAction этого файла задать значение Resource. • Для доступа к файлам ресурсов, встроенных в сборку, в XAML используется относительный или абсолютный URI, в коде можно использовать статический метод GetResourceStreamкласса Application, возвращающийnull, если ресурс не найден. public static StreamResourceInfoGetResourceStream( 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 • Файл содержимого не компилируются в сборку, но в метаданных сборки есть информация о нем. При изменении файла содержимого перекомпиляция приложения не нужна. • Чтобы скомпилировать двоичные данные как файл содержимого в VisualStudio, файл надо добавить в проект и для свойства BuildAction этого файла задать значение Content. • Для доступа к файлам содержимого в XAML используется URI, в коде доступ к данным можно получить с помощью статического метода GetContentStreamклассаApplication. public static StreamResourceInfoGetContentStream( Uri uriContent );
Файлы исходного узла WPF • Файлы исходного узла - автономные файлы данных, которые не имеют связи с исполняемой сборкой WPF. Используются в следующих случаях: • файл не существует во время компиляции; • возможно обновление файла данных без перекомпиляции сборки; • файл данных имеет большой размер, и следует загружать его только по запросу. • В VisualStudio можно скомпилировать двоичные данные как файл исходного узла, если добавить его к проекту и задать значение None для его свойства BuildAction.Единственный результат – файл будет скопирован в каталог проекта. • Для доступа к файлам в XAML можно использовать URI, для доступа в коде – статический метод GetRemoteStreamклассаApplication. public static StreamResourceInfoGetRemoteStream( Uri uriRemote ); • В примереизображение из файла garden.jpg выводится в элемент управления Image. private void Site_of_Origin_Click(object sender, RoutedEventArgs e) { try{ image3.Source = new BitmapImage( newUri("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) • Фигуры (shapes) – это элементы управления. • Рисунки(drawing) – API для взаимодействия с низкоуровневым механизмом композиции. • Классы, производные от System.Windows.Shapes.Shape, • поддерживают события, как и другие элементы управления; • участвуют в системе макета, их можно разместить в любой контейнер компоновки; • автоматически перерисовываются при изменении размера, перемещении или изменении свойств. • 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) имеет значения
Класс 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> <BitmapImage x:Key="Image_Waterfall" UriSource="/WaterFall.jpg"/> <CroppedBitmap x:Key="croppedImage" Source="{StaticResourceImage_Waterfall}" SourceRect=«1020 512 384"/> </Window.Resources> <Window.Resources> <BitmapImage x:Key="Image_Waterfall" UriSource="/WaterFall.jpg"/> <CroppedBitmap x:Key="croppedImage" Source="{StaticResourceImage_Waterfall}" SourceRect=«1020 512 384"/> </Window.Resources> • Полученное изображение выводится в элемент управления Image. <Image Height="75" HorizontalAlignment="Left" Margin="29,0,0,12" Name="image4" Stretch="Uniform" Width="127" Source="{StaticResourcecroppedImage}" />
Классы Toolbar и ToolBarTray • Класс ToolBarTray представляет собой контейнер для элементов управления ToolBar,управляет расположением, изменением размеров, операциями перетаскивания и упорядочивания элементов управления ToolBar. • В классе ToolBarTrayподдерживается коллекция элементов ToolBar public Collection<ToolBar> ToolBars {get; } • Класс ToolBar является производным откласса ItemsControlи представляет собой контейнер для элементов управления. • В классе ToolBarопределены свойства, которые можно использовать для его размещения внутри контейнера ToolBarTray. public int Band { get; set; } public intBandIndex { get; set; }
Свойство OverflowMode класса Toolbar • В классе ToolBar определено присоединенное свойство OverflowMode public static void SetOverflowMode( DependencyObject element, OverflowMode mode ) ; public static OverflowMode GetOverflowMode( DependencyObject element ); • Присоединенное свойство управляет размещением элементов в панели переполнения и имеет тип OverflowMode – перечисление со значениями: • В примере элемент управления ComboBoxвсегда размещается в панели переполнения. <ToolBar > <Button> <Image Source="{StaticResourceImage_New}" /> </Button> <ComboBox Width="120" SelectedIndex="0" ToolBar.OverflowMode="Always"> <ComboBoxItem > Green </ComboBoxItem> <ComboBoxItem > Red </ComboBoxItem> </ComboBox> </ToolBar >