目录
1、问题引出
在写个消息提示DEMO时,图片老是显示不出来,感觉很纳闷。
代码:
notification.Title = "提示";
notification.Message = "XXXXXXXXXXXXXXXX";
notification.ImageUrl = @"pack://application:,,,/TDProAppModule;component/Resources/game32.png";
ArcGIS.Desktop.Framework.FrameworkApplication.AddNotification(notification);
这里主要用到了WPF中pack url的知识,因此对其了解一下。
2、WPF中文件类型
2.1 三种类型的文件
程序会经常用到一些不可执行的数据文件,譬如图片、视频等,这些文件从与应用程序集的关系大致可以分为三类:
-
资源文件: 编译时嵌入到程序集里面。
-
内容文件: 没用编译到程序集里面,但程序集记录了与文件的关系。
-
源站点文件:独立的文件,与程序集没用任何关联。
这三种类型的文件之间的一个重要区别是:资源文件和内容文件在生成时即为程序集所知;程序集明确知道它们的存在。
2.2 pack url
由指定的方案URI由其前缀; 定义 http、 ftp 和 file 是众所周知的示例。 包URI方案作为其方案中,使用"包",并包含两个组件: 授权和路径。 下面是包的格式URI:
pack: / /颁发机构 / 路径
WPF支持两种授权: application: / / 和 siteoforigin:///:。
2.2.1 资源文件路径
本地程序集资源文件
包URI资源编译到本地程序集的文件使用以下授权和路径:
-
授权:application:///。
-
路径:资源文件的名称,包括其相对于本地程序集项目文件夹根目录的路径。
下面的示例演示了包URI为XAML位于本地程序集的项目文件夹的根目录中的资源文件。
pack://application:,,,/ResourceFile.xaml
引用的程序集资源文件
包URI资源编译到引用的程序集中的文件使用以下授权和路径:
-
授权:application:///。
-
路径:编译到所引用程序集内的资源文件的名称。 路径必须符合以下格式:
程序集短名称{;版本] {;PublicKey]; 组件 /路径
2.2.2 内容文件
包URI内容文件使用以下授权和路径:
-
授权:application:///。
-
路径:内容文件的名称,包括其相对于应用程序的主可执行程序集的文件系统位置的路径。
2.2.3 源站点文件
包URI为源站点文件使用以下授权和路径:
-
授权:siteoforigin:///。
-
路径:源站点文件的名称,包括其相对于可执行程序集启动位置的路径。
2.3 DEMO
这两类型的文件都与应用程序集相关,资源文件被编译到程序集里面,而内容文件没有。
首先看看应用程序集里面这两种类型的文件是怎么组织的:资源文件用Resource标识,内容文件用content标识。
DEMO中文件的目录组织方式:
项目中文件的属性:
访问程序集相关联的文件的代码:
// 程序集内部的资源文件(编译到程序集的资源文件)
gridMain.Background = new ImageBrush(new BitmapImage(
new Uri("pack://application:,,,/Images/Notify32.png")));
// 与程序集关联的内容文件(与程序集相关,但放在在程序集外部的图片:bin子文件夹images下的文件)
gridMain.Background = new ImageBrush(new BitmapImage(
new Uri("pack://application:,,,/Images/Notebook32.png")));
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:TestDemo.PackUrl"
xmlns:dx="http://schemas.devexpress.com/winfx/2008/xaml/core" x:Class="TestDemo.PackUrl.MainWindow"
mc:Ignorable="d"
Title="MainWindow" Height="350" Width="525">
<Grid x:Name="gridMain">
<Grid.Background>
<ImageBrush />
</Grid.Background>
</Grid>
</Window>
程序集不关联的文件加载代码:
可以使用file、http等传统的方案进行加载,也可以用源站点url进行加载
// 程序集无关联的图片
gridMain.Background = new ImageBrush(new BitmapImage(
new Uri(@"file:///E:\我的代码\VS2017\WPF\bin\Images\Notebook32.png")));
// 网络上的照片
gridMain.Background = new ImageBrush(new BitmapImage(
new Uri(@"https://ss1.bdstatic.com/5aAHeD3nKgcUp2HgoI7O1ygwehsv/media/ch1000/jpg/%E5%AE%BD%E5%B1%8F%20.jpg")));
// 站点url方式加载程序集无关联的图片(bin同级目录的Images文件夹下的Notebook32.png)
gridMain.Background = new ImageBrush(new BitmapImage(
new Uri(@"pack://siteoforigin:,,,/../Images/Notebook32.png")));
3、问题解决
ArcGIS Pro中XAML界面布局、编码中加载资源都会用到URL对文件的加载。
开始时提示框图片显示不了的原因是项目文件中game32.png的属性未设置未Resource导致。