URI
在 Windows Presentation Foundation (WPF) 中,统一资源标识符 (URI) 用于以多种方式标识和加载文件,包括以下内容:
- 指定当应用程序第一次启动时显示的用户界面 (UI)。
- 加载图像。
- 导航到页。
- 加载不可执行的数据文件。
此外,可以使用 URI 标识和加载位于各种位置的文件,这些位置包括: - 当前程序集。
- 引用的程序集。
- 相对于程序集的某个位置。
- 应用程序的源站点。
为了提供从这些位置标识和加载上述类型的文件的一致机制,WPF 利用了“pack URI 方案”的扩展性。
本地程序集资源文件
编译到本地程序集内的资源文件的 pack URI 使用以下授权和路径:
- application:///。
- 路径:资源文件的名称,包括其相对于本地程序集项目文件夹根目录的路径。
下面的示例演示了一个 XAML 资源文件的 pack URI,该资源文件位于本地程序集的项目文件夹的根目录中。
pack://application:,,,/ResourceFile.xaml
下面的示例演示了一个 XAML 资源文件的 pack URI,该资源文件位于本地程序集的项目文件夹的子文件夹中。
pack://application:,,,/Subfolder/ResourceFile.xaml
引用的程序集资源文件
编译到所引用程序集内的资源文件的 pack URI 使用以下授权和路径:
- 授权:application:///。
- 路径:编译到所引用程序集内的资源文件的名称。 路径必须符合以下格式:
AssemblyShortName{;Version]{;PublicKey];component/Path- AssemblyShortName:所引用的程序集的短名称。
- ;Version[可选]:所引用的包含资源文件的程序集的版本。 此部分在加载两个或多个具有相同短名称的引用程序集时使用。
- ;PublicKey[可选]:用于对引用程序集进行签名的公钥。 此部分在加载两个或多个具有相同短名称的引用程序集时使用。
- ;component:指定所引用的程序集是从本地程序集引用的。
- /Path:资源文件的名称,包括其相对于所引用程序集的项目文件夹根目录的路径。
下面的示例演示了一个 XAML 资源文件的 pack URI,该资源文件位于所引用程序集的项目文件夹的根目录中。
pack://application:,,,/ReferencedAssembly;component/ResourceFile.xaml
下面的示例演示了一个 XAML 资源文件的 pack URI,该资源文件位于所引用程序集的项目文件夹的子文件夹中。
pack://application:,,,/ReferencedAssembly;component/Subfolder/ResourceFile.xaml
下面的示例演示了一个 XAML 资源文件的 pack URI,该资源文件位于特定于版本的引用程序集的项目文件夹的根文件夹中。
pack://application:,,,/ReferencedAssembly;v1.0.0.1;component/ResourceFile.xaml
请注意,所引用的程序集资源文件的 pack URI 语法只能与 application:/// 授权一起使用。 例如,WPF 中不支持下面的格式。
pack://siteoforigin:,,,/SomeAssembly;component/ResourceFile.xaml
内容文件 Pack URI
内容文件的 pack URI 使用以下授权和路径:
- 授权:application:///。
- 路径:内容文件的名称,包括其相对于应用程序的主可执行程序集的文件系统位置的路径。
下面的示例演示了一个 XAML 内容文件的 pack URI,该内容文件与可执行程序集位于相同的文件夹中。
pack://application:,,,/ContentFile.xaml
下面的示例演示了一个 XAML 内容文件的 pack URI,该内容文件位于某个相对于应用程序的可执行程序集的子文件夹中。
pack://application:,,,/Subfolder/ContentFile.xaml
源站点 Pack URI
源站点文件的 pack URI 使用以下授权和路径:
- 授权:siteoforigin:///。
- 路径:源站点文件的名称,包括其相对于可执行程序集启动位置的路径。
下面的示例演示了一个 XAML 源站点文件的 pack URI,该源站点文件存储在可执行程序集的启动位置。
pack://siteoforigin:,,,/SiteOfOriginFile.xaml
下面的示例演示了一个 XAML 源站点文件的 pack URI,该源站点文件存储在相对于应用程序可执行程序集的启动位置的子文件夹中。
pack://siteoforigin:,,,/Subfolder/SiteOfOriginFile.xaml
页面文件
配置为 MSBuild Page 项的 XAML 文件采用与资源文件相同的方式编译到程序集内。 因此,可以使用资源文件的 pack URI 来标识 MSBuild Page 项。
通常配置为 MSBuild Page 项的 XAML 文件类型会将下列元素之一作为它们的根元素:
- System.Windows.Window
- System.Windows.Controls.Page
- System.Windows.Navigation.PageFunction
- System.Windows.ResourceDictionary
- System.Windows.Documents.FlowDocument
- System.Windows.Controls.UserControl
绝对 Pack URI 与相对 Pack URI
完全限定的 pack URI 包括方案、授权和路径,它视为绝对 pack URI。 作为面向开发者的简化,XAML 元素通常允许使用仅包含路径的相对 pack URI 来设置相应的属性。
例如,假设本地程序集中的某个资源文件具有以下绝对 pack URI。
pack://application:,,,/ResourceFile.xaml
引用此资源文件的相对 pack URI 如下所示。
/ResourceFile.xaml
默认情况下,会将相对 pack URI 视为相对于包含引用的标记或代码的位置。 但是,如果使用前导反斜杠,则将相对 pack URI 引用视为相对于应用程序的根目录。 例如,假设具有以下项目结构。
App.xaml
Page2.xaml
\SubFolder
+ Page1.xaml
+ Page2.xaml
如果 Page1.xaml 包含引用 Root\SubFolder\Page2.xaml 的 URI,该引用可以使用以下相对 pack URI。
Page2.xaml
如果 Page1.xaml 包含引用 Root\Page2.xaml 的 URI,该引用可以使用以下相对 pack URI。
/Page2.xaml
常见 Pack URI 方案
指定当应用程序启动时显示的 UI
StartupUri 指定要在启动 WPF 应用程序时显示的第一个 UI。 对于独立应用程序,UI 可以是一个窗口,如下面的示例所示。
<Application
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
StartupUri="MainWindow.xaml" />
独立应用程序和 XAML 浏览器应用程序 (XBAP) 还可以将页面指定为初始 UI,如下面的示例所示。
<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>
指定窗口图标
下面的示例演示如何使用 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>
加载图像、音频和视频文件
WPF 使应用程序可以使用各种媒体类型,所有这些媒体类型都可以用 pack URI 标识和加载,如下面的示例所示。
<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) 可用于支持应用程序主题。 创建和管理主题的一种方式是将多个主题创建为位于应用程序源站点的资源字典。 这样,在添加和更新主题时将无需重新编译和重新部署应用程序。 可以使用 pack URI 来标识和加载这些资源字典,如下面的示例所示。
<Application
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
StartupUri="HomePage.xaml">
<Application.Resources>
<ResourceDictionary Source="pack://siteoforigin:,,,/PageTheme.xaml" />
</Application.Resources>
</Application>