URI типа "pack" в WPF

В Windows Presentation Foundation (WPF) uniform resource identifiers (URIs) используются для идентификации и загрузки файлов несколькими способами, включая следующие:

  • Указание отобразить user interface (UI) при первом запуске приложения.

  • Загрузка изображений.

  • Переход по страницам.

  • Загрузка неисполняемых файлов данных.

Кроме того, URIs может использоваться для идентификации и загрузки файлы из различных мест, включая следующие:

  • Текущая сборка.

  • Сборка, на которую указывает ссылка.

  • Расположение относительно сборки.

  • Начальный веб-узел приложения.

Для обеспечения согласованного механизма идентификации и загрузки этих типов файлов из указанных мест WPF использует расширяемость схемы URI типа "pack". Этот раздел содержит обзор данной схемы, описывает создание URIs типа "pack" для различных скриптов, показывает абсолютное и относительное разрешение URIs и URI, а также описывает использование URIs типа "pack" из разметки и кода.

В этом разделе содержатся следующие подразделы.

  • Схема URI типа "pack"
  • URI типа "pack" для файлов ресурса
  • URI типа "pack" для файлов содержимого
  • URI типа "pack" для начального узла
  • Файлы страницы
  • Абсолютныеи относительные URI типа "pack"
  • Разрешение URI типа "pack"
  • Программирование с использованием URI типа "pack"
  • Связанные разделы

Схема URI типа "pack"

Схема URI типа "pack" используется спецификацией Open Packaging Conventions (OPC), которая описывает модель для организации и определения содержимого. Основными элементами этой модели являются пакеты и части. При этом пакет представляет собой логический контейнер для одной или нескольких логических частей. Эта структура показана на следующем рисунке.

Схема пакета и частей

Чтобы идентифицировать части, спецификация OPC использует расширяемость RFC 2396 (Uniform Resource Identifiers (URI): Generic Syntax) для определения схемы URI типа "pack".

Схема, заданная URI, определяется по его префиксу, например http, ftp или file. Схема URI типа "pack" использует "пакет" в качестве схемы и содержит два компонента: полномочия и путь. Ниже приведен формат для URI типа "pack".

пакет://полномочия/путь

Полномочия указывают тип пакета, в котором содержится часть, а путь указывает расположение части внутри пакета.

Эта структура продемонстрирована на следующем рисунке.

Отношение между пакетом, сертификацией и путем

Пакеты и части являются аналогами для приложений и файлов. При этом приложение (пакет) может включать в себя один или несколько файлов (частей), например, следующие:

  • Файлы ресурсов, скомпилированные в локальную сборку.

  • Файлы ресурсов, скомпилированные в сборку, на которую указывает ссылка.

  • Файлы ресурсов, скомпилированные в ссылающуюся сборку.

  • Файлы содержимого.

  • Файлы исходного узла.

Для доступа к этим типам файлов WPF поддерживает два вида полномочий: application:/// и siteoforigin:///. Полномочия application:/// идентифицируют файлы данных приложения, известные на момент компиляции, в том числе файлы ресурсов и содержимого. Полномочия siteoforigin:/// определяют файлы исходного узла. Области полномочий показаны на следующем рисунке.

Схема URI типа “pack”

ПримечаниеПримечание

Компонент полномочий URI типа "pack" является встроенным URI, указывающим на пакет, и должен соответствовать стандарту RFC 2396.Кроме того, символ "/" должен быть заменен символом ",", а зарезервированные символы (например, "%" и "?") необходимо заменять escape-последовательностями.Подробности см. в OPC.

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

URI типа "pack" для файлов ресурса

Файлы ресурсов настраиваются как элементы MSBuild Resource и компилируются в сборки. WPF поддерживает конструирование пакета URIs, который может использоваться для идентификации файлов ресурсов, компилируемых в локальную сборку или в сборку, на которую ссылается локальная сборка.

Файл ресурсов локальной сборки

URI типа "pack" для файла ресурсов, который компилируется в локальную сборку, использует следующие полномочия и путь:

  • Полномочия: application:///.

  • Путь: имя файла ресурсов, включая его путь относительно корня папки проекта локальной сборки.

В следующем примере показан URI типа "pack" для файла ресурсов XAML, расположенного в корне папки проекта локальной сборки.

pack://application:,,,/ResourceFile.xaml

В следующем примере показан пакет URI для файла ресурсов XAML, расположенного во вложенной папке проекта локальной сборки.

pack://application:,,,/Subfolder/ResourceFile.xaml

Файл ресурсов ссылочной сборки.

URI типа "pack" для файла ресурсов, который компилируется в ссылочную сборку, использует следующие полномочия и путь:

  • Полномочия: application:///.

  • Путь: имя файла ресурсов, который компилируется в ссылочную сборку. Путь должен строиться согласно следующему формату:

    КраткоеИмяСборки[;Версия][;ОткрытыйКлюч];компонент/Путь

    • КраткоеИмяСборки: короткое имя для ссылочной сборки.

    • ;Версия [необязательно]: версия ссылочной сборки, которая содержит файл ресурсов. Этот параметр используется при загрузке двух или более ссылочных сборок с одинаковым коротким именем.

    • ;ОткрытыйКлюч [необязательно]: открытый ключ, использованный для подписи ссылочной сборки. Этот параметр используется при загрузке двух или более ссылочных сборок с одинаковым коротким именем.

    • ;компонент: указывает, что ссылочная сборка имеет ссылку из локальной сборки.

    • /Путь: имя файла ресурсов, включая его путь относительно корня папки проекта ссылочной сборки.

В следующем примере показан URI типа "pack" для файла ресурсов XAML, расположенного в корне папки проекта ссылочной сборки.

pack://application:,,,/ReferencedAssembly;component/ResourceFile.xaml

В следующем примере показан URI типа "pack" для файла ресурсов XAML, расположенного во вложенной папке проекта ссылочной сборки.

pack://application:,,,/ReferencedAssembly;component/Subfolder/ResourceFile.xaml

В следующем примере показан URI типа "pack" для файла ресурсов XAML, расположенного во вложенной папке проекта ссылочной сборки определенной версии.

pack://application:,,,/ReferencedAssembly;v1.0.0.1;component/ResourceFile.xaml

Обратите внимание, что синтаксис URI типа "pack" для файлов ресурсов ссылочной сборки может использоваться только с полномочием application:///. Например, приведенный ниже пример не поддерживается в WPF.

pack://siteoforigin:,,,/SomeAssembly;component/ResourceFile.xaml

URI типа "pack" для файлов содержимого

URI типа "pack" для файла содержимого использует следующие полномочия и путь:

  • Полномочия: application:///.

  • Путь: имя файла содержимого, включая его путь относительно расположения главной выполнямой сборки приложения в файловой системе.

В следующем примере показан URI типа "pack" для файла содержимого XAML, расположенного в той же папке в качестве исполняемой сборки.

pack://application:,,,/ContentFile.xaml

В следующем примере показан URI типа "pack" для файла содержимого XAML, расположенного во вложенной папке относительно исполняемой сборки приложения.

pack://application:,,,/Subfolder/ContentFile.xaml

ПримечаниеПримечание

К файлам содержимого HTML перейти невозможно.Схема URI поддерживает только переход к файлам HTML, которые расположены на начальном узле.

URI типа "pack" для начального узла

URI типа "pack" для файла начального узла использует следующие полномочия и путь:

  • Полномочия: siteoforigin:///.

  • Путь: имя файла начального узла, включая путь относительно места, из которого была запущена исполняемая сборка.

В следующем примере показан URI типа "pack" для файла начального узла XAML, хранящегося в месте, из которого запускается исполняемая сборка.

pack://siteoforigin:,,,/SiteOfOriginFile.xaml

В следующем примере показан URI типа "pack" для файла начального узла XAML, хранящегося во вложенной папке относительно места, из которого запускается исполняемая сборка приложения.

pack://siteoforigin:,,,/Subfolder/SiteOfOriginFile.xaml

Файлы страницы

Файлы XAML, которые настроены как элементы MSBuild Page, компилируются в сборки таким же образом, как и файлы ресурсов. Следовательно, элементы MSBuild Page могут быть идентифицированы с помощью URIs типа "pack" для файлов ресурсов.

Типы файлов XAML, которые обычно настраиваются как элементы MSBuild Page имеют в качестве корневого элемента один из нижеперечисленных:

Абсолютныеи относительные URI типа "pack"

Полный URI типа "pack" включает в себя схему, полномочия и путь, и считается абсолютным URI типа "pack". Для упрощения разработки элементы XAML обычно позволяют задавать соответствующие атрибуты с относительным URI типа "pack", который включает только путь.

В качестве пример рассмотрим следующий абсолютный URI типа "pack" для файла ресурсов в локальной сборке.

pack://application:,,,/ResourceFile.xaml

Относительный URI типа "pack", который ссылается на этот файл ресурсов, будет выглядеть следующим образом.

/ResourceFile.xaml

ПримечаниеПримечание

Поскольку файлы начального узла не связаны со сборками, на них можно ссылаться только при помощи абсолютного URIs типа "pack".

По умолчанию относительный URI типа "pack" рассматривается относительно расположения разметки или кода, содержащего ссылку. Однако, если в начале используется обратная косая черта,то относительного URI типа "pack" рассматривается относительно корня приложения. В качестве примера рассмотрим следующую структуру проекта.

App.xaml

Page2.xaml

\SubFolder

  + Page1.xaml

  + Page2.xaml

Если Page1.xaml содержит URI, который ссылается на Root\SubFolder\Page2.xaml, ссылка может использовать следующий относительный URI типа "pack".

Page2.xaml

Если Page1.xaml содержит URI, который ссылается на Root\Page2.xaml, ссылка может использовать следующий относительный URI типа "pack".

/Page2.xaml

Разрешение URI типа "pack"

Формат URIs типа "pack" позволяет URIs типа "pack" выглядеть одинаково для различных типов файлов. В качестве примера рассмотрим следующий абсолютный URI типа "pack".

pack://application:,,,/ResourceOrContentFile.xaml

Этот абсолютный URI типа "pack" может ссылаться на файлы ресурсов в локальной сборке или на файлы содержимого. То же самое верно для следующего относительного URI.

/ResourceOrContentFile.xaml

Чтобы определить тип файла, на который ссылается URI типа "pack", WPF разрешает URIs для файлов ресурсов в локальных сборках и файлах содержимого с помощью следующей логики:

  1. Выполняется проверка метаданных сборки на атрибут AssemblyAssociatedContentFileAttribute, который соответствует URI типа "pack".

  2. Если атрибут AssemblyAssociatedContentFileAttribute обнаружен, путь URI типа "pack" ссылается на файл содержимого.

  3. Если атрибут AssemblyAssociatedContentFileAttribute отсутствует, выполняется проверка файлов ресурсов набора, которые компилируются в локальную сборку.

  4. Если обнаружен файл ресурсов, который соответствует пути URI типа "pack", то путь URI типа "pack" ссылается на файл ресурсов.

  5. Если ресурс не найден, то созданный Uri является недействительным.

Разрешение URI не применяется для URIs, которые ссылаются на следующие объекты:

  • Файлы содержимого в ссылочных сборках: эти типы файлов не поддерживаются WPF.

  • Внедренные файлы в ссылочных сборках: URIs, идентифицирующие их, являются уникальными, так как включают в себя имя ссылочной сборки и суффикс;component.

  • Файлы начального узла: определяющие их URIs являются уникальными, поскольку это единственные файлы, которые могут быть идентифицированы по URIs типа "pack", содержащему полномочия siteoforigin:///.

Единственным упрощением, которое позволяет разрешение URI типа "pack", является частичная независимость кода от расположения файлов ресурсов и содержимого. Например, если имеется файл ресурса в локальной сборке, который перенастроен в файл содержимого, URI типа "pack" для ресурса останется таким же. Это же будет справедливо и для кода, использующего URI типа "pack".

Программирование с использованием URI типа "pack"

Многие классы WPF реализуют свойства, которые могут быть установлены с помощью URIs типа "pack", например следующие:

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

Использование URI типа "pack" в разметке

URI типа "pack" указывается в разметке путем установки элемента атрибута с помощью URI типа "pack". Пример.

<element attribute="pack://application:,,,/File.xaml" />

Таблица 1 демонстрирует различные абсолютные URIs типа "pack", которые можно указывать в разметке.

Таблица 1. Абсолютные URI типа "pack" в разметке

Файл

Абсолютный URI типа "pack"

Файл ресурсов — локальная сборка

"pack://application:,,,/ResourceFile.xaml"

Файл ресурсов во вложенной папке — локальная сборка

"pack://application:,,,/Subfolder/ResourceFile.xaml"

Файл ресурсов — ссылочная сборка

"pack://application:,,,/ReferencedAssembly;component/ResourceFile.xaml"

Файл ресурсов во вложенной папке ссылочной сборки

"pack://application:,,,/ReferencedAssembly;component/Subfolder/ResourceFile.xaml"

Файл ресурсов в ссылочной сборке с поддержкой версий

"pack://application:,,,/ReferencedAssembly;v1.0.0.0;component/ResourceFile.xaml"

Файл содержимого

"pack://application:,,,/ContentFile.xaml"

Файл содержимого во вложенной папке

"pack://application:,,,/Subfolder/ContentFile.xaml"

Файл начального узла

"pack://siteoforigin:,,,/SOOFile.xaml"

Файл начального узла во вложенной папке

"pack://siteoforigin:,,,/Subfolder/SOOFile.xaml"

Таблица 2 демонстрирует различные относительные URIs типа "pack", которые можно задавать в разметке.

Таблица 2. Относительные URI типа "pack" в разметке

Файл

Относительный URI типа "pack"

Файл ресурсов в локальной сборке

"/ResourceFile.xaml"

Файл ресурсов во вложенной папке локальной сборки

"/Subfolder/ResourceFile.xaml"

Файл ресурсов в ссылочной сборке

"/ReferencedAssembly;component/ResourceFile.xaml"

Файл ресурсов во вложенной папке ссылочной сборки

"/ReferencedAssembly;component/Subfolder/ResourceFile.xaml"

Файл содержимого

"/ContentFile.xaml"

Файл содержимого во вложенной папке

"/Subfolder/ContentFile.xaml"

Использование URI типа "pack" в коде

URI типа "pack" указывается в коде путем создания экземпляра класса Uri и передачи URI типа "pack" в конструктор в качестве параметра. Это показано в следующем примере.

Uri uri = new Uri("pack://application:,,,/File.xaml");

По умолчанию класс Uri рассматривает URIs типа "pack" как абсолютный. Это приводит к возникновению исключения, если экземпляр класса Uri создается относительным URI типа "pack".

Uri uri = new Uri("/File.xaml");

К счастью, перегрузка Uri(String, UriKind) конструктора класса Uri принимает аргумент типа UriKind, что позволяет указать, является ли URI типа "pack" абсолютным или относительным.

// Absolute URI (default)
Uri absoluteUri = new Uri("pack://application:,,,/File.xaml", UriKind.Absolute);
// Relative URI
Uri relativeUri = new Uri("/File.xaml", UriKind.Relative);

Указание параметров Absolute или Relative требуется только в том случае, если предоставленный URI типа "pack" точно будет иметь тот или иной тип. Если тип используемого URI типа "pack" неизвестен (например, когда пользователь вводит URI типа "pack" во время выполнения), следует использовать RelativeOrAbsolute.

// Relative or Absolute URI provided by user via a text box
TextBox userProvidedUriTextBox = new TextBox();
Uri uri = new Uri(userProvidedUriTextBox.Text, UriKind.RelativeOrAbsolute);

Таблица 3 демонстрирует различные относительные URIs типа "pack", которые можно указать в коде с помощью System.Uri.

Таблица 3. Абсолютные URI типа "pack" в коде

Файл

Абсолютный URI типа "pack"

Файл ресурсов — локальная сборка

Uri uri = new Uri("pack://application:,,,/ResourceFile.xaml", UriKind.Absolute);

Файл ресурсов во вложенной папке — локальная сборка

Uri uri = new Uri("pack://application:,,,/Subfolder/ResourceFile.xaml", UriKind.Absolute);

Файл ресурсов — ссылочная сборка

Uri uri = new Uri("pack://application:,,,/ReferencedAssembly;component/ResourceFile.xaml", UriKind.Absolute);

Файл ресурсов во вложенной папке ссылочной сборки

Uri uri = new Uri("pack://application:,,,/ReferencedAssembly;component/Subfolder/ResourceFile.xaml", UriKind.Absolute);

Файл ресурсов в ссылочной сборке с поддержкой версий

Uri uri = new Uri("pack://application:,,,/ReferencedAssembly;v1.0.0.0;component/ResourceFile.xaml", UriKind.Absolute);

Файл содержимого

Uri uri = new Uri("pack://application:,,,/ContentFile.xaml", UriKind.Absolute);

Файл содержимого во вложенной папке

Uri uri = new Uri("pack://application:,,,/Subfolder/ContentFile.xaml", UriKind.Absolute);

Файл начального узла

Uri uri = new Uri("pack://siteoforigin:,,,/SOOFile.xaml", UriKind.Absolute);

Файл начального узла во вложенной папке

Uri uri = new Uri("pack://siteoforigin:,,,/Subfolder/SOOFile.xaml", UriKind.Absolute);

Таблица 4 демонстрирует различные относительные URIs типа "pack", которые можно указать в коде с помощью System.Uri.

Таблица 4. Относительные URI типа "pack" в коде

Файл

Относительный URI типа "pack"

Файл ресурсов — локальная сборка

Uri uri = new Uri("/ResourceFile.xaml", UriKind.Relative);

Файл ресурсов во вложенной папке — локальная сборка

Uri uri = new Uri("/Subfolder/ResourceFile.xaml", UriKind.Relative);

Файл ресурсов — ссылочная сборка

Uri uri = new Uri("/ReferencedAssembly;component/ResourceFile.xaml", UriKind.Relative);

Файл ресурсов во вложенной папке — ссылочная сборка

Uri uri = new Uri("/ReferencedAssembly;component/Subfolder/ResourceFile.xaml", UriKind.Relative);

Файл содержимого

Uri uri = new Uri("/ContentFile.xaml", UriKind.Relative);

Файл содержимого во вложенной папке

Uri uri = new Uri("/Subfolder/ContentFile.xaml", UriKind.Relative);

Общие сценарии URI типа "pack"

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

Указание отображения пользовательского интерфейса при запуске приложения

StartupUri указывает первый UI для отображения при запуске приложения WPF. Для автономных приложений UI может быть окном, как показано в следующем примере.

<Application
    xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
    StartupUri="MainWindow.xaml" />

Автономные приложения и XAML browser applications (XBAPs) также могут указать страницу в качестве начального пользовательского интерфейса, как показано в следующем примере.

<Application
    xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
    StartupUri="HomePage.xaml" />

Если приложение является автономным приложением, а страница указывается с StartupUri, то WPF открывает NavigationWindow для размещения страницы. Для XBAPs страница отображается в обозревателе узла.

Перемещение на страницу

В следующем примере показан способ перехода на страницу.

<Page
  xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
  WindowTitle="Page With Hyperlink"
  WindowWidth="250"
  WindowHeight="250">


...


<Hyperlink NavigateUri="UriOfPageToNavigateTo.xaml">
  Navigate to Another Page
</Hyperlink>


...


</Page>

Дополнительные сведения о различных способах перехода в WPF см. в разделе Общие сведения о переходах.

Задание значка окна

В следующем примере показано использование URI для указания значка окна.

<Window
  xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
  x:Class="SDKSample.MainWindow"
    Icon="WPFIcon1.ico">
</Window>

Дополнительные сведения см. в разделе Icon.

Загрузка изображений, звуковых и видео файлов

WPF позволяет приложениям использовать разнообразные типы мультимедиа, каждый из которых может быть определен и загружен с помощью URIs типа "pack", как показано в следующих примерах.

<MediaElement Stretch="Fill" LoadedBehavior="Play" Source="pack://siteoforigin:,,,/Media/bee.wmv" />
<MediaElement Stretch="Fill" LoadedBehavior="Play" Source="pack://siteoforigin:,,,/Media/ringin.wav" />
<Image Source="Images/Watermark.png" />

Дополнительные сведения по работе с медиа содержимым см. в разделе Графика и мультимедиа.

Загрузка словаря ресурсов с начального узла

Словари ресурсов (ResourceDictionary) можно использовать для поддержки тем приложений. Единственным способом создания и управления темами является создание нескольких тем в качестве словарей ресурсов, расположенных на начальном узле приложения. Это позволяет добавлять и обновлять темы без повторной компиляции и повторного развертывания приложения. Определить и загрузить эти словари ресурсов можно с помощью URIs типа "pack", как показано в следующем примере.

<Application
    xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
    StartupUri="HomePage.xaml">
  <Application.Resources>
    <ResourceDictionary Source="pack://siteoforigin:,,,/PageTheme.xaml" />
  </Application.Resources>
</Application>

Обзор тем в WPF см. в разделе Стилизация и использование шаблонов.

См. также

Основные понятия

Ресурсы, Содержимое и Файлы данных WPF-приложения