WPF pack url 在ArcGIS Pro中的应用

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xiangqiang2015/article/details/82772258

目录

1、问题引出

2、WPF中文件类型

2.1 三种类型的文件

2.2 pack url

2.2.1 资源文件路径

2.2.2 内容文件

2.2.3 源站点文件

2.3 DEMO

3、问题解决


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导致。

参考地址:https://docs.microsoft.com/zh-cn/dotnet/framework/wpf/app-development/application-management-overview

猜你喜欢

转载自blog.csdn.net/xiangqiang2015/article/details/82772258
今日推荐