WPF讨厌猫的图片吗?或者:为什么我可以引用一个,但不能引用同一文件夹中的另一个图像

本文关键字:引用 一个 但不能 图像 另一个 文件夹 讨厌 或者 WPF 我可以 为什么 | 更新日期: 2023-09-27 18:22:13

我正在开发一个WPF应用程序,在某个时刻,我正在加载一个图像。该图像是一个.png文件,位于我的Visual Studio项目中的一个文件夹中。该文件的生成操作设置为Resource。这种特殊的图像并不是唯一的;在同一个文件夹中还有其他几个PNG,具有相同的构建操作。在XAML方面,ImageBrush-元素的ImageSource-属性绑定到视图模型的Uri-属性。

现在是奇怪的部分;这是设置视图模型的Uri-属性的代码行:

ViewModel.Image = new Uri(@"/Images/RandomIcon.png", UriKind.Relative);

但是,如果我将Uri更改为指向我为测试目的选择的经过仔细谷歌搜索的猫图像,我会在调试控制台中得到一个异常堆栈,告诉我找不到该图像:

ViewModel.Image = new Uri(@"/Images/testcat.png", UriKind.Relative);

同样,图像位于同一文件夹中,它们的构建操作属性为Resource。我能想到的唯一显著区别是,其他图像都是图标,比我的testcat小得多(2.5KB比140KB)。

调试控制台上显示的异常:

System.Windows.Data Error: 6 : 'TargetDefaultValueConverter' converter failed to convert value '/Images/testcat.png' (type 'Uri'); fallback value will be used, if available. BindingExpression:Path=Image; DataItem='ViewModel' (HashCode=55110660); target element is 'ImageBrush' (HashCode=51947944); target property is 'ImageSource' (type 'ImageSource') IOException:'System.IO.IOException: The Resource "images/testcat.png" cannot be found.
   at MS.Internal.AppModel.ResourcePart.GetStreamCore(FileMode mode, FileAccess access)
   at System.IO.Packaging.PackagePart.GetStream(FileMode mode, FileAccess access)
   at System.IO.Packaging.PackWebResponse.CachedResponse.GetResponseStream()
   at System.IO.Packaging.PackWebResponse.GetResponseStream()
   at System.IO.Packaging.PackWebResponse.get_ContentType()
   at System.Windows.Media.Imaging.BitmapDecoder.SetupDecoderFromUriOrStream(Uri uri, Stream stream, BitmapCacheOption cacheOption, Guid& clsId, Boolean& isOriginalWritable, Stream& uriStream, UnmanagedMemoryStream& unmanagedMemoryStream, SafeFileHandle& safeFilehandle)
   at System.Windows.Media.Imaging.BitmapDecoder.CreateFromUriOrStream(Uri baseUri, Uri uri, Stream stream, BitmapCreateOptions createOptions, BitmapCacheOption cacheOption, RequestCachePolicy uriCachePolicy, Boolean insertInDecoderCache)
   at System.Windows.Media.Imaging.BitmapFrame.CreateFromUriOrStream(Uri baseUri, Uri uri, Stream stream, BitmapCreateOptions createOptions, BitmapCacheOption cacheOption, RequestCachePolicy uriCachePolicy)
   at System.Windows.Media.ImageSourceConverter.ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, Object value)
   at MS.Internal.Data.DefaultValueConverter.ConvertHelper(Object o, Type destinationType, DependencyObject targetElement, CultureInfo culture, Boolean isForward)
   at MS.Internal.Data.TargetDefaultValueConverter.Convert(Object o, Type type, Object parameter, CultureInfo culture)
   at System.Windows.Data.BindingExpression.ConvertHelper(IValueConverter converter, Object value, Type targetType, Object parameter, CultureInfo culture)'

这激发了我的问题:WPF讨厌猫的形象吗?或者:为什么我可以引用一个图像,而不能引用另一个图像?

编辑:在尝试了狗的形象之后,我可以放心地说,WPF并没有歧视猫。更严重的是,我能够在公认答案的帮助下解决我的问题,但我仍然不知道为什么以前它不起作用。

WPF讨厌猫的图片吗?或者:为什么我可以引用一个,但不能引用同一文件夹中的另一个图像

很难从您在这里提供的微小信息中准确地确定您做错了什么。然而,这并不重要,因为在WPF中显示Image s很简单。我的第一个技巧是根本不使用Uri类,而只是使用文件路径的string表示。

我还建议您习惯WPF中用于引用文件的Pack URI。。。举个例子:

<Image Source="{Binding DisplayedImagePath}" />

public string DisplayedImagePath
{
    get { return @"C:'Users'Public'Pictures'Sample Pictures'Chrysanthemum.jpg"; }
}

尽管(正如您所做的那样)您确实应该将图像添加到项目根目录中名为Images的文件夹中,并在Visual Studio中的属性窗口中将其构建操作设置为资源。。。然后您可以使用以下格式访问它们:

public string DisplayedImagePath
{
    get { return "/AssemblyName;component/Images/ImageName.png"; }
}

在.NET4中,上述Image.Source值将起作用。然而,微软在.NET 4.5中做了一些可怕的更改,打破了许多不同的东西,所以在.NET 4.5,你需要使用完整的pack路径,如下所示:

<Image Source="pack://application:,,,/AssemblyName;component/Images/ImageName.png">