代码和XAML中的图像URI行为之间的差异

时间:2010-09-29 11:51:37

标签: .net wpf xaml

我在某些XAML中声明了一个Image:

<Image Width="188" Height="56" HorizontalAlignment="Left"  VerticalAlignment="Bottom" Margin="10,0,0,10" Grid.ColumnSpan="2" Grid.Column="0" Source="..\Images\myImage.png" />

这是一个静态图像,在程序执行期间无需更改。

我还有一个图像需要在运行时更改,具体取决于一组值。

我正在使用iValueConverter将数据转换为图像,这似乎有效,但我自己无法创建图像。

我正在尝试创建一系列System.Windows.Media.Imaging.BitmapImage个对象来存储图像。在上面的代码中,我试图访问存储在\ Images目录中的.PNG:

Dim ThisImage As New BitmapImage(New Uri("..\Images\thisImage.png", UriKind.Relative))

使用`“.. \ Images \”似乎对XAML工作正常,正确打开存储在[Project Directory] ​​\ Images \中的图像,在代码中它似乎指向[Project Directory] ​​\ bin \ Images \,这不存在。

我显然搞砸了一些东西,在这里,但我不想开始尝试直接导航到文件,因为它一旦安装就显然不会在同一个位置......

我想念的是什么?为什么XAML URI与代码URI的工作方式不同?

2 个答案:

答案 0 :(得分:3)

当您使用URI在XAML中定义Image.Source属性时,转换器(ImageSourceConverter)用于将该URI转换为ImageSource实例。转换器可以访问XAML元素的IUriContext,因此它知道用于解析相对URI的基URI。

在代码中创建BitmapImage时,BitmapImage类无法访问URI上下文,因此它不知道如何解析相对URI。您需要指定一个绝对URI,格式为"pack://application:,,,/Images/thisImage.png"

答案 1 :(得分:1)

嗯,问题是你在使用相对的Uri时,在这种情况下,你必须提供一个绝对的Uri。

它正如您在XAML中所期望的那样,因为在ImageSourceConverter(用于将xaml中的Uri转换为ImageSource)中,相对Uris通过使用可用的IUriContext服务转换为绝对Uris通过ITypeDescriptorContext。换句话说,Uri不是魔术。为了将xaml中的相对Uri转换为ImageSource,正在进行大量繁重的工作(在这种情况下,通过xaml反序列化器)。