在WPF中使用图像和图标

10

我正在尝试在我的WPF应用程序中使用图标以及其他一些图片,但是从设计视图中得到错误提示,例如“path-x不是有效的资源或无法找到”,其中“path-x”是我正在尝试使用的任何图像的路径。

如果它能够在正确的位置查找,我猜它会找到它的;)

但是,之后,它决定不再给我那个错误。所以,我继续点击运行(F5),想要看到新的图标出现在标题栏中。结果遇到了这个问题:

"System.Windows.Markup.XamlParseException occurred Message='Provide value on 'System.Windows.Baml2006.TypeConverterMarkupExtension' threw an exception.' Line number '5' and line position '50'.
Source=PresentationFramework
LineNumber=5 LinePosition=50
StackTrace: at System.Windows.Markup.XamlReader.RewrapException(Exception e, IXamlLineInfo lineInfo, Uri baseUri) at System.Windows.Markup.WpfXamlLoader.Load(XamlReader xamlReader, IXamlObjectWriterFactory writerFactory, Boolean skipJournaledProperties, Object rootObject, XamlObjectWriterSettings settings, Uri baseUri) at System.Windows.Markup.WpfXamlLoader.LoadBaml(XamlReader xamlReader, Boolean skipJournaledProperties, Object rootObject, XamlAccessLevel accessLevel, Uri baseUri) at System.Windows.Markup.XamlReader.LoadBaml(Stream stream, ParserContext parserContext, Object parent, Boolean closeStream) at System.Windows.Application.LoadComponent(Object component, Uri resourceLocator) at One_Stop_Management.MainWindow.InitializeComponent() in c:\Users\Jason\Documents\Visual Studio 2010\Projects\One Stop Management\One Stop Management\MainWindow.xaml:line 1 at One_Stop_Management.MainWindow..ctor() in C:\Users\Jason\Documents\Visual Studio 2010\Projects\One Stop Management\One Stop Management\MainWindow.xaml.cs:line 25 InnerException: System.IO.IOException Message=Cannot locate resource 'images/favicon.ico'. Source=PresentationFramework StackTrace: 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 System.Windows.Baml2006.TypeConverterMarkupExtension.ProvideValue(IServiceProvider serviceProvider) at MS.Internal.Xaml.Runtime.ClrObjectRuntime.CallProvideValue(MarkupExtension me, IServiceProvider serviceProvider) InnerException: "

尝试在标题栏中使用图标时运行时的异常!

为什么这个东西对我很无礼?我只是想插入一张图片...

更新

这是当我在属性窗格中

<Fluent:RibbonWindow x:Class="One_Stop_Management.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:Fluent="clr-namespace:Fluent;assembly=Fluent"
        Title="One Stop Management" Height="727" Width="1208" Icon="Resources\favicon.ico">

最新更新

在此输入图片描述

我甚至无法使用属性窗格添加图标,以下是它给我的错误信息。


你能分享一下你试图插入图片的 XAML 代码吗? - Craig Suchanec
好的,我现在正在更新。 - βӔḺṪẶⱫŌŔ
@Craig,已将其添加到问题底部。谢谢。 - βӔḺṪẶⱫŌŔ
谢谢大家的帮助!在阅读了@Craig提供的MS Connect链接后,我终于搞清楚到底发生了什么。 - βӔḺṪẶⱫŌŔ
10个回答

5

确保目标是资源。然后像这样做:

Icon="/MobilWPF;component/Resources/Images/MobileIcon.ico"

其中MobilWPF是您的命名空间,或者可能是您的项目名称?我忘记了我的项目名称和命名空间是相同的。


2
我通过为图像设置以下属性来解决了同样的问题:

我通过为图像设置以下属性来解决了同样的问题:

Build Action = Content
Copy to Output Directory = Copy always

只是一条评论,与这个答案进行比较:在项目中使用文件时,您可以在编译时将此文件嵌入程序集(生成操作=资源),或者独立部署该文件(生成操作=内容和复制到输出=始终复制/如果更新)。在两种情况下,文件内容都可以在运行时访问。每种方法都有其优缺点,在您的情况下,程序集更小,但访问时间更长(并且必须存在单独的文件)。 - mins

2

我发现在添加新的资源并重新构建项目时,VS2008有时会出现这样的问题。我发现如果你清除构建然后从头开始重新构建,这个问题就会消失。对我来说,看起来像是一个VS2008的bug。


1
答案似乎取决于您存储图标的位置/方式。我试图做类似于@iterationx's answer的事情,但对我来说没有用,这就是我最终得出的结论。我正在使用VS 2010。
我通过项目属性页面添加了图标资源,在资源下拉菜单中选择“添加资源”,然后选择“添加现有文件”。然后我只需在Icon属性中使用文件名即可。
Icon="my_icon.ico"

我正在使用VS 2017社区版,这仍然对我有所帮助。 - DevOpsSauce

1

如果你仔细阅读异常信息,会发现它说的是同样的事情:

InnerException: System.IO.IOException Message=Cannot locate resource 'images/favicon.ico'.

这可能是因为 Images/favicon.ico 图标图片没有正确设置。请确保它的“生成操作”设置为“资源”,并且它在项目的“Images”文件夹下。


是的,我读过了。它在“Images”文件夹中。但我认为WPF或Visual Studio中出现了一些bug,因为该文件确实存在,字符串路径正确,文件夹也在那里。但它就是找不到它。我不知道怎么可能找不到一个明明就在你面前的东西。 - βӔḺṪẶⱫŌŔ
Visual Studio会自动创建一个名为“Images”的文件夹,其中“I”是大写的。但当我遇到错误时,错误信息中的“I”却是小写的。所以我甚至尝试将“Images”文件夹中的“I”改成小写,但仍然无法解决问题。 - βӔḺṪẶⱫŌŔ
@ βӔḺṪẶⱫŌŔ:你检查了构建操作了吗(在VS中右键单击图标文件,选择属性)?应该是“资源”。 - Reed Copsey

1
将资源文件中的BuildAction属性设置为Resource,即可解决此问题。
问候

1
我记得有一个类似的情况,我的应用程序崩溃了,最终我发现是.ico文件出了问题。
如果你正在使用图标和Windows XP系统,XP不支持256x256像素的图标。你可能需要在编辑器(如IcoFx)中打开图标,并删除256x256像素的图标。

1
今天我也遇到了同样的问题。 我使用VS 2012删除了256x256图标(右键单击>删除图像类型),在XP上运行正常。 - Angshuman Agarwal

0

非常抱歉,我帮不上更多的忙。一开始看到你的问题时,我以为只是类型不匹配,比如你在指定图像时使用了字符串。但问题似乎有多种可能的解决方案。我不想列出所有这些解决方案,所以我会直接链接给你一个Microsoft Connect页面


2
虽然这是一个旧的线程,但我想添加我的发现。事实证明,XP可以正确处理具有256x256和32位颜色深度的图标。在从ico中删除此图像格式后,异常没有再次发生。 - saamorim
链接失效了,Craig。 - Chuck Savage
仅提供链接的答案很不实用。 - StayOnTarget

0

使用 Icon=".\Images\test.ico" 这个让我成功了


如果您能提供更多信息,将有助于更好地理解您的方法。 - winner_joiner
当您尝试将图标添加到应用程序时,通常会遇到此错误消息。因此,为了克服问题,您需要使用Icon=".\Images\test.ico"作为代码。 - kedarK
好的,我需要将这行代码添加到源代码中。感谢您的更新。 - winner_joiner

0

我曾经遇到过同样的问题,发现如果你的项目名称中有空格,它将无法正确读取图像文件。希望这能帮到你。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接