在wpf中,设置图片路径有2种方法:
1、xaml文件中,指定路径
12345 2、后台代码设置路径
1234 ImageBrush b = new ImageBrush; b.ImageSource = new BitmapImage(new Uri(‘pack://application:,,,/Themes/ZCThemes/skin/icon/card_choosed.png’, UriKind.RelativeOrAbsolute)); b.Stretch = Stretch.Fill; SelectToAddEvent.Background = b;今天就来详细说明wpf图片资源的路径问题和如何设置?
一开始我在后台直接复制图片路径是物理路径:
b.ImageSource = new BitmapImage(new Uri(‘../Themes/ZCThemes/skin/icon/card_unchoose.png’, UriKind.RelativeOrAbsolute));
在visual studio 2013中是没有问题的。但是发布后,单独运行exe就出错了。
这个就设计到wpf的新协议: WPF引入了统一资源标识Uri(Unified Resource Identifier)来标识和访问资源。
其中较为常见的情况是用Uri加载图像。Uri表达式的一般形式为:协议 授权 路径
协议:pack:// 授权:有两种。一种用于访问编译时已经知道的文件,用application:///。一种用于访问编译时不知道、运行时才知道的文件,用siteoforigin:///。在这里加载图片时,我们选用前者,即application:///,但是书写时候,我们一般用逗号代替斜杠,也就是改写作application:,,,。 路径:分为绝对路径和相对路径。这里我们选用相对路径,普适性更强。
下面,我们举一个简单的例子: pack://application:,,,/images/my.jpg 当然,WPF默认Uri设置有pack://application:,,,,所以我们也可以直接将其写作: /images/my.jpg 后边写例子程序时,为了让读者更好的了解Uri,我们都采用完整的Uri写法。
下面在讲讲装载图片的两种方式,一种用XAML引用资源,一种用代码引用资源。
用XAML引用资源:
用代码引用资源: Image img; img.Source=new BitmapImage(new Uri(‘pack://application:,,,/images/my.jpg’),UriKind.Relative);
按照以下操作可以解决:
删除XAML中的Source属性,在后台为两个图片控件设置Source属性。有如下三种WPF资源路径方式。
imgContent.Source = new BitmapImage(new Uri(‘Content.jpg’, UriKind.Relative));
imgResource.Source = new BitmapImage(new Uri(‘Resource.jpg’, UriKind.Relative));
imgContent.Source = new BitmapImage(new Uri(‘pack://application:,,,/Content.jpg’));
imgResource.Source = new BitmapImage(new Uri(‘pack://application:,,,/Resource.jpg’));
imgContent.Source = new BitmapImage(new Uri(‘pack://SiteOfOrigin:,,,/Content.jpg’));
第一种和第二种都可以访问相对WPF资源路径的Resource和Content资源。第三种方式可以访问网站运行目录下的Content资源文件以及完全松散的文件。完全松散的文件指那些没有添加到项目中,只是拷贝在程序目录中的文件。
应用程序根本不知道它的存在。pack://application:,,,/Content.jpg表示当前项目的资源。它是pack://application:,,,/DllName;Component/Content.jpg的简写。将DllName替换成其他程序集,就可以访问其他程序集的资源。
pack://SiteOfOrigin:,,,/Content.jpg表示从部署位置访问文件。
siteOfOrigin:/// 编码后siteOfOrigin:,,,
application:/// 编码后application:,,,
3个逗号其实是反斜杠编码过来的。