URI типа "pack" в WPF

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

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

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

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

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

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

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

  • Указанная ссылками сборка.

  • Расположение, связанное со сборкой.

  • Исходный узел приложения.

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

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

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

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

Для определения частей в спецификации OPC используется расширяемость RFC 2396 (универсальные идентификаторы ресурсов (URI): универсальный синтаксис) для определения схемы URI типа "Pack".

Схема, заданная с помощью URI, определяется его префиксом. HTTP, FTP и файлы — это хорошо известные примеры. В схеме универсального кода ресурса (URI) типа "Pack" в качестве схемы содержится два компонента: Authority и Path. Ниже приведен формат URI типа pack.

/ путь к центру Pack://

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

Эта концепция показана на следующей схеме:

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

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

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

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

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

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

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

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

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

Примечание

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

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

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

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

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

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

  • Центр: application:///.

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

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

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

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

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

Файл ресурсов указанной ссылками сборки

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

  • Центр: application:///.

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

    Ассемблишортнаме{; Версия] {; PublicKey]; компонент или путь

    • AssemblyShortName — краткое имя для указанной ссылками сборки.

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

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

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

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

В следующем примере показан 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 элементы можно определить с помощью uri типа "pack" для файлов ресурсов.

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

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

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

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

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

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

/ResourceFile.xaml

Примечание

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

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

App.xaml

Page2.xaml

\SubFolder

+ Page1.xaml

+ Page2.xaml

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

Page2.xaml

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

/Page2.xaml

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

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

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

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

/ResourceOrContentFile.xaml

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

  1. Проверяет метаданные сборки для AssemblyAssociatedContentFileAttribute атрибута, соответствующего URI типа pack.

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

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

  4. Если найден файл ресурсов, соответствующий пути URI типа "Pack", путь к URI типа "Pack" ссылается на файл ресурсов.

  5. Если ресурс не найден, создается Uri Недопустимый внутренний объект.

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

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

  • Внедренные файлы в упоминаемых сборках: универсальные коды ресурсов (URI) являются уникальными, так как включают имя сборки, на которую указывает ссылка, и ;component суффикс.

  • Файлы исходного узла: универсальные коды ресурса (URI) являются уникальными, так как они являются единственными файлами, которые можно идентифицировать с помощью URI типа "Pack", содержащих центр siteoforigin:///.

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

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

Многие классы WPF реализуют свойства, которые можно задать с помощью URI типа Pack, в том числе:

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

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

URI типа "Pack" указывается в разметке путем задания элемента атрибута с URI типа "Pack". Пример:

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

В таблице 1 показаны различные абсолютные URI типа "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 показаны различные относительные URI типа "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 класс рассматривает URI типа "Pack" как абсолютные. Следовательно, исключение возникает, когда экземпляр Uri класса создается с помощью относительного URI типа pack.

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

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

// 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 используется, например, когда пользователь вводит 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 показаны различные относительные URI типа "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 показаны различные относительные URI типа "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"

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

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

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

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

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

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

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

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

<Page
  xmlns="http://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="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  x:Class="SDKSample.MainWindow"
    Icon="WPFIcon1.ico">
</Window>

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

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

WPF позволяет приложениям использовать разнообразные типы мультимедиа, которые можно идентифицировать и загрузить с помощью URI типа 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 ) можно использовать для поддержки тем приложений. Одним из способов создания тем и управления ими является создание нескольких тем в качестве словарей ресурсов, расположенных в исходном узле приложения. Это позволяет добавлять и обновлять темы без повторной компиляции и развертывания приложения. Эти словари ресурсов можно определить и загрузить с помощью URI типа "Pack", как показано в следующем примере.

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

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

См. также раздел