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

Posted

技术标签:

【中文标题】WPF 按钮中的图像在运行时不可见【英文标题】:Image in WPF Button not Visible at Runtime 【发布时间】:2013-03-16 04:30:48 【问题描述】:

所有,我有一个小型应用程序的以下开始,它检查 .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>

图像具有“构建操作 = 资源”、“复制到输出目录 = 不复制” - 图像在设计器中显示,但在运行时不显示。我看过以下问题并阅读了相关答案,但没有一个能解决问题:

    WPF control images not displayed when consumed by an application

    image problem in wpf (image does not show up)

    Background Image of Button not showing in WPF

如何让按钮图像在运行时出现?

【问题讨论】:

尝试将构建操作设置为Content。这可能会有所帮助 也试过了。这也无济于事...... 在调试应用程序时检查 Visual Studio 中的输出控制台可能会有所帮助。有时它会显示有用的错误(例如绑定错误等) 通常你的 URI 很可能是问题所在,正如 Daniel 所说,看看输出窗口,很可能会抱怨找不到图像源或类似的东西。 编者注:code formatting should be reserved for code. 【参考方案1】:

将构建操作更改为“资源”。 你的包网址也是错误的。要么使用:

Source="pack://application:,,,/Resource/UserCost2013Open16.png"

或者干脆

Source="/Resource/UserCost2013Open16.png"

【讨论】:

我刚刚使用我最初所做的设计器属性面板重新添加了图像,它提供了与我所拥有的不同的 URI,并且就像您显示的顶部一样 - 这个不工作。我将图像重新添加为资源 - 再次没有运气。我然后重新添加了图像再次 - 这给了我一个URI,就像底部的一个节目...... Taadaa!它奏效了,为什么会发生这种情况我不知道,但很高兴将来知道。感谢您的宝贵时间。 @Killercam:我现在经历了非常相似的事情;看看我在this question 中的EDIT3,以了解为什么重新添加可能会有所帮助(尽管不是为什么它只在第二次尝试时才对你有用)。 pack://application:,,,/... 在运行时似乎不太被 .XAML 喜欢。引发错误 - “无法识别/无效等等”。我有一个UIDomain 项目,其中包含所有视图、演示者、模型和图像。似乎Resources/*.png 应该在views/ ... ... /Resources/img.png 目录中,而它更像../Resources/img.png 为我工作:) 只需右键单击图像并选择属性并将“构建操作”更改为“资源”。【参考方案2】:

有 2 个解决方案: 1:更改图片的设置:

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

2:在源路径中使用 application 而不是 siteoforigin 时,您必须有可能的方式:

a) 图像将位于名为“Resources”的子文件夹中,并且 .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 有效。 Copy to output directory 在我的情况下不是必需的。 工作。谢谢。【参考方案3】:

在我的情况下,我将图像放在名为 Common 的单独项目中,并且图像位于该项目中名为 Resources 的文件夹下。在我的另一个项目中,我添加了对Common 的引用,并将图像的来源设置为:

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

图像的Build Action 设置为ResourceCopy to Output Directory 设置为Do not copy。但是,由于某种奇怪的原因,直到我删除了解决方案中的每个程序集文件并创建了Clean SolutionBuild Solution,它才起作用。不知道为什么,但是一旦我重建了所有东西,它就开始在运行时工作了。我仍然无法弄清楚为什么它在设计时工作。

【讨论】:

component 字符串添加到源路径对于让我的图像在运行时显示至关重要。 虽然 Content 和 Always Copy 曾经对我有用,但在移动到另一台机器后,我只在设计器中看到了图像/字体,而不是在运行时。将它们更改为 Resource 并且不要复制已修复它。【参考方案4】:

您应该在 Visual Studio 的 Solution Explorer 中添加任何内容。 除了将图像复制到 Windows 资源管理器中的文件夹外,还可以在解决方案资源管理器中按右键单击任何文件夹,转到 Add > Existing Item... 并选择要添加的资源的路径。 p>

【讨论】:

【参考方案5】:

转到资源文件夹中的图像,右键单击图像,转到属性,单击构建操作属性,然后将其从无更改为资源。这样就行了。

【讨论】:

非常感谢!!为什么MS的官方文档不这么说!???!?!? :)【参考方案6】:

假设你有

将您的Build Action 设置为Resource

使用URI-PACK-FORMAT正确设置该路径

在我的情况下,它仍然没有显示。

Clean &amp; Rebuild 不只是构建为我修复了它!

【讨论】:

所以您的设置与最初的问题完全相同,并且您不需要更改构建操作或复制设置或源路径? 是的。 BuildAction & UriPack 是对的。图片未显示 => Clean &amp; Rebuild 并且有效。 @walteronassis 不是问题的根源。 问题是Image in WPF Button not Visible at Runtime 我身边的情况,上面是我的解决方案。我不在乎 -2 rep 但我真的不知道你的问题是什么......?!【参考方案7】:

我将我的图像定义为下一个:

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

图像显示在 Visual Studio 设计器中,但我启动应用程序时没有显示图像!它让我疯了! 我用 clean/build 尝试了所有 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"/>

【讨论】:

【参考方案8】:

Source="file:///D:/100x100.jpg"/> 适合我。

【讨论】:

【参考方案9】:

新建一个文件夹,把你的图片放到新文件夹里,然后用 XAML 写

<Image Source="/newfolder/icon.png"/>

【讨论】:

【参考方案10】:

Visual Studio 2022(但应该可以在其他版本中使用)。将您的图像添加到您想要命名的文件夹中,在此示例中,我创建了一个 Assets 命名文件夹。然后将图片的属性设置为Build Action中的Resource。然后选择文件夹中的图像并将其拖放到&lt;MenuItem.Icon&gt;中,它应该可以正确路径..

请注意,您可能需要重建项目,编译器有时不会将新资源识别为需要重建。

【讨论】:

以上是关于WPF 按钮中的图像在运行时不可见的主要内容,如果未能解决你的问题,请参考以下文章

选项卡中的控件在运行时不可见

GTK# 图像按钮在运行时不显示图像

wpf image控件 设计时显示图片,运行时不显示

按钮的图像在 WPF 应用程序中不可见

隐藏受影响的控件时,WPF 故事板动画是不是继续运行?

集合视图标题在运行时不可见