• WPF 中的 Pack URI-访问程序集资源


    在 Windows Presentation Foundation (WPF) 中,使用统一资源标识符 (URI) 标识和加载文件的方式有很多,包括:

    • 指定当应用程序第一次启动时显示的用户界面 (UI)。

    • 加载图像。

    • 导航到页

    • 加载不可执行的数据文件。

     

    在代码中使用 Pack URI

    在代码中,可以通过实例化 Uri 类并将 pack URI 作为参数传递给构造函数来指定 pack URI。下面的示例说明了这一点。

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

    默认情况下,Uri 类将 pack URI 视为绝对 pack URI。因此,在使用相对 pack URI 创建 Uri 类的实例时会引发异常。

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

    幸运的是,Uri 类构造函数的 Uri(String, UriKind) 重载可以接受一个类型为 UriKind 的参数,使您可以指定 pack URI 是绝对的还是相对的。

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

    当您能够确定所提供的 pack URI 是相对 pack URI 还是绝对 pack URI 的时候,应该只指定 Absolute 或 Relative。如果您不了解所使用的 pack URI 的类型(例如,当用户在运行时输入 pack URI 时),请改用 RelativeOrAbsolute

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

    资源文件 — 本地程序集
     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);
     

    文件
     相对 pack URI
     
    资源文件 — 本地程序集
     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);
     

     

    假如我们定义一个WPF User Control Library,并在其中添加一张图片,设置其属性为Resource。

     

    现在我们新建一个WPF Application,然后添加这个Library的引用。

    则我们可以这样访问Library中的Resource,Code Snip如下:

    <Image  Source="/ClassLibraryResources;component/Images/6.png" />

    在C#中,如下访问:

    image1.Source = new BitmapImage(new Uri("/ClassLibraryResources;component/Images/6.png",UriKind.Relative));

    程序运行如下:

    官方网址:http://msdn.microsoft.com/zh-cn/library/aa970069.aspx

    三思而又行。
  • 相关阅读:
    windows系统切换jdk,修改java_home无效情况
    Cannot instantiate interface org.springframework.context.ApplicationListener
    MySQL分组查询获取每个学生前n条分数记录(分组查询前n条记录)
    ASP.NET Web API 使用Swagger生成在线帮助测试文档,支持多个GET
    EF TO MYSQL 无法查询中文的解决方法
    HttpWebRequest post请求获取webservice void数据信息
    This implementation is not part of the Windows Platform FIPS validated cryptographic algorithms. 此实现不是 Windows 平台 FIPS 验证的加密算法的一部分 解决方案
    MySQL 5.7.13解压版安装记录 mysql无法启动教程
    C# udpclient 发送数据断网后自动连接的方法
    汽车XX网站秒杀抢购代码
  • 原文地址:https://www.cnblogs.com/jun-jie/p/3726544.html
Copyright © 2020-2023  润新知