在运行时,WPF按钮中的图像不可见。

66

大家好,我有一个小应用程序的开始部分,它可以检查.resx文件中嵌套括号的一致性(以避免非匹配“... {0}”字符串的运行时错误)。下面是MainWindow.xaml的XAML代码,我的问题与要显示在按钮上的图像有关。

<Window x:Class="ResxChecker.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="174.383" Width="495.869">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto"/>
            <ColumnDefinition Width="350*"/>
            <ColumnDefinition Width="Auto"/>
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="30*"/>
        </Grid.RowDefinitions>
        <Label Content="Select .resx file:" HorizontalAlignment="Left" Margin="10,0,0,0" VerticalAlignment="Top" Height="24" Width="Auto" Grid.ColumnSpan="1"/>
        <TextBox Grid.ColumnSpan="2" HorizontalAlignment="Stretch" Margin="10,0,0,0" Grid.Row="1" TextWrapping="Wrap" Text="" VerticalAlignment="Top"/>
        <Button Grid.Column="2" HorizontalAlignment="Right" Margin="5,0,10,0" Grid.Row="1">
            <Image VerticalAlignment="Stretch" HorizontalAlignment="Stretch" Height="16 " Width="16" Source="pack://siteoforigin:,,,/Resources/UserCost2013Open16.png"/>
        </Button>
    </Grid>
</Window>
图片的“生成操作 = Resource”,“复制到输出目录 = 不复制” - 图片在设计器中显示但在运行时不显示。我已经看过以下问题并阅读了相关答案,但都没有解决问题:
  1. WPF控件中的图像在应用程序中使用时未显示

  2. WPF中的图片问题(图片未显示)

  3. WPF中按钮的背景图片不显示

如何使按钮图像在运行时显示?

5
尝试将构建操作设置为“内容”。这可能会有帮助。 - Hossein Narimani Rad
1
也尝试过了,但那也没有帮助... - MoonKnight
2
可能有所帮助的是在调试应用程序时检查Visual Studio中的输出控制台。有时它会显示有用的错误信息(例如绑定错误等)。 - Daniel
1
编辑注意:代码格式应该保留给代码 - JDB
这里还有来自微软的说明,关于WPF使用的URI方案,以便您了解其基本结构。 - user2883257
显示剩余7条评论
12个回答

92
将构建操作更改为Resource。 另外,您的打包网址是错误的。请使用以下任一选项:
Source="pack://application:,,,/Resource/UserCost2013Open16.png"

或者只是
Source="/Resource/UserCost2013Open16.png"

5
我刚才使用设计师属性面板重新添加了图片,这本来就是我做的,但它提供了一个与我之前所拥有的不同的URI,而是像你展示的顶部那一个——这没有起作用。我又把图片添加为资源——还是没有成功。然后我又重新添加了一遍图片——这给了我一个像底部显示的URI……哒哒!它起作用了,为什么会这样我不知道,但以后知道了也好。谢谢您的时间。 - MoonKnight
@Killercam:我现在也遇到了非常相似的问题;请看我在这个问题中的EDIT3,可能会对为什么重新添加有帮助(虽然不能解释为什么你第二次尝试才成功)提供一个可能的解释。 - O. R. Mapper
pack://application:,,,/... 在运行时似乎不受 .XAML 的喜爱。会抛出一个错误 - "未识别/无效的 blah blah"。我有一个 UIDomain 项目,其中包含所有的视图、展示器、模型和图片。看起来 Resources/*.png 应该在 views/ ... ... /Resources/img.png 目录中,但实际上应该是 ../Resources/img.png - IAbstract
对我有用 :) - Naveen Kumar V
只需右键单击图像,选择属性,然后将“生成操作”更改为“资源”。 - Alireza Bijantabar

37

有两个解决方案:

1:更改图像的设置:

Build Action = Content
Copy to output directory = Copy if newer
Source="pack://siteoforigin:,,,/Resources/UserCost2013Open16.png"

2:当在源路径中使用应用程序而不是站点原点时,您有两种可能的方法:

a)图像将位于名为“资源”的子文件夹中,.exe文件将很小。

Source="pack://application:,,,/Resources/UserCost2013Open16.png"
Build Action = Content
Copy to output directory = Copy if newer
b) 图像将被包含在.exe文件中,不会存在图像文件的子文件夹
Source="pack://application:,,,/Resources/UserCost2013Open16.png"
Build Action = Resource
Copy to output directory = Copy if newer

方案2可行。在我的情况下,“复制到输出目录”不是必需的。 - Felix
工作完成。谢谢。 - Matt Allen

14
假设您已将 Build Action 设置为 Resource 。 请使用 URI-PACK-FORMAT pack:// application:,,,/ ResourceFile.xaml pack:// application:,,,/ Subfolder / ResourceFile.xaml pack:// application:,,,/ ReferencedAssembly;component / ResourceFile.xaml 这些是最常见的示例。
此外,在我的情况下仍然没有显示。 清理并重新生成 而不仅仅是构建修复了我的问题(VS 2019)!

那么您的设置与最初的问题完全相同,您不需要更改构建操作、复制设置或源路径吗? - asdf
是的。BuildActionUriPack都是正确的。图像没有显示,执行清理并重新构建操作后问题得到解决。 - Felix D.
问题是“WPF按钮中的图像在运行时不可见”,这是我遇到的情况,上面是我的解决方案。我不在乎-2声望,但我真的不知道你对此有什么问题.. ?! - Felix D.
将你的 "Build Action" 设置为 "Resource" 对我来说就足够了。 - Noman_1
1
这对我有效,使用的是 VS 22 和 .net 6。 - Max

8

在我的情况下,我把图片放在一个名为Common的独立项目中,并且这些图片存放在该项目的Resources文件夹下。在我的另一个项目中,我添加了对Common的引用,并通过以下方式设置了图片的源:

<Image Source="/Common;component/Resources/anImage.png"/>

这些图片的Build Action设置为Resource,并且Copy to Output Directory设置为Do not copy。然而,出于某种奇怪的原因,在我的解决方案中删除了每个程序集文件并进行了Clean SolutionBuild Solution之后,它才开始工作。不确定为什么,但一旦重新构建了所有内容,就在运行时开始正常工作。尽管如此,我仍然无法弄清为何在设计时它可以工作。


2
将“component”字符串添加到源路径中对于使我的图像在运行时显示至关重要。 - Ted
尽管在过去,使用“内容”和“始终复制”对我有效,但是在换了一台机器后,我只能在设计师中看到图像/字体,而在运行时却看不到。将它们更改为“资源”和“不要复制”就解决了这个问题。 - Fenrir88

6

进入资源文件夹,找到你的图片,在图片上右键,选择“属性”,点击“生成操作”属性,将其从“无”更改为“资源”。这样就可以了。


非常感谢!为什么微软的官方文档没有提到这个!?!?!? :) - cmcromance

5

本教程适用于Visual Studio 2022(但也适用于其他版本)。将您的图像添加到一个以您想要的名称命名的文件夹中,例如我创建了一个名为Assets的文件夹。然后将图像的属性设置为Resource,在Build Action中进行设置。接着在文件夹中选择图像,将其拖放到<MenuItem.Icon>中即可正确路径引用。

将图像拖入项目中,设置为资源,然后拖放到页面上

  • 请注意,您可能需要重新生成项目,有时编译器无法识别新资源的需求并进行重新生成。

4

在Visual Studio的解决方案资源管理器中添加任何内容。 而不是仅将图像复制到Windows资源管理器中的文件夹,右键单击解决方案资源管理器中的任何文件夹,转到添加 > 现有项目...并选择要添加的资源路径。


4
我定义了我的图片如下:

我将我的图片定义为:

<Image Source="/Resources/Images/icon.png"/>

Visual Studio 设计器中显示图像,但在启动应用程序时没有显示任何图像!这让我很疯狂!

我尝试了所有的 Build Action 并进行了清理/构建,但没有成功。

在我的情况下,问题是由于控件(使用Image)和应用程序本身位于不同的项目中引起的。 Resources/Images 文件夹位于 Controls 项目中。因此,应用程序尝试在其自己的 Debug 文件夹中查找 icon.png,但实际上它在 Controls 的 Debug 文件夹中。

所以对我来说有两个解决方案:

1)将 Resources/Images 放入应用程序的项目中(当有几个项目使用来自 Controls 项目的控件时,这并不好,但它可以正常工作)

2)在 Image 中明确指定 Controls 项目的名称:

<Image Source="/Controls;component/Resources/Images/icon.png"/>

0
对我来说,将“生成操作”更改为“资源”,并将“复制到输出目录”更改为“不复制”解决了我的问题。

0
如果有人来到这里,并将图像设置为“资源”和“不可复制”,但仍然无法正常工作,我成功解决了这个问题,方法是将图像的构建操作从“资源”切换到其他选项,然后再切换回“资源”。

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