C# WinForm - 在标签上切换背景图像

Posted

技术标签:

【中文标题】C# WinForm - 在标签上切换背景图像【英文标题】:C# WinForm - Toggle the background image on a label 【发布时间】:2021-05-06 12:28:47 【问题描述】:

我有一个设置为看起来像英国标准车牌的标签。

字体设置为 Charles Wright。

我希望能够使用按钮切换此标签的背景图像,但我希望此按钮能够识别当前正在使用的图像,以便它可以相应地更改图像。

图像以“plainFrontNumberPlate.bmp”和“borderedFrontNumberPlate.bmp”的形式存储在“Properties.Resources”中。

我试过了:

if(this.label1.Image == Resources.plainFrontNumberPlate)

    this.label1.Image = Resources.borderedFrontNumberPlate;

else

    this.label1.Image = Resources.plainFrontNumberPlate;

但是当我尝试对此进行测试时。第一次单击将图像更改为 'borderedFrontNumberPlate.bmp 但当我单击两次时不会变回 'plainFrontNumberPlate.bmp

【问题讨论】:

Properties.Resource(假设你的意思是Resources)是一个工厂,每次你要求一个新对象时它都会创建一个新对象,所以你每次都在比较一个不同的对象参考。如果您只有两个图像,则将您的图像资源分配给一个集合(例如,List<Bitmap>)或几个字段。然后你可以比较这些图像的引用,因为引用不会每次都改变。表单关闭时处理图像。 是的,“资源”就是我对“Properties.Resource”的意思。我为那个错字道歉。杰出的!我会在今天晚些时候试一试。谢谢你的建议。我稍后会回复以确认这有效。 据我了解,您想比较两个图像,因此您必须将图像转换为字节或字符串,然后进行比较。我为你输入了密码。 【参考方案1】:

使用此代码

public Form1()

    InitializeComponent();
    this.label1.Image.Tag = "plainFrontNumberPlate";

private void btnChangeImage_Click(object sender, EventArgs e)

    switch (this.label1.Image.Tag.ToString())
    
        case "plainFrontNumberPlate":
           object borderedFrontNumberPlate = Resources.ResourceManager.GetObject("borderedFrontNumberPlate");
           this.label1.Image = (Image)borderedFrontNumberPlate;
           this.label1.Image.Tag = "borderedFrontNumberPlate";
           break;
        case "borderedFrontNumberPlate":
           object plainFrontNumberPlate = Resources.ResourceManager.GetObject("plainFrontNumberPlate");
           this.label1.Image = (Image)plainFrontNumberPlate;
           this.label1.Image.Tag = "plainFrontNumberPlate";
           break;
    

【讨论】:

阅读我对这个问题的评论。 您不必比较图像的内容,您必须比较两个引用。将图像分配给两个字段,然后您可以在将字段引用的两个对象之一分配给控件的属性时比较引用。 -- 切勿直接使用Properties.Resource 返回的对象进行比较。可能,不为别的。只需将返回的值赋给排序变量即可。 所以你有一个位图或PNG图像和一个图像控件,位图值如何与图像匹配?我放了另一个代码。 图片格式无关。当您加载位图时,您有一个位图(内存中的字节序列)并创建一个托管对象。当您将 Bi​​tmap 对象分配给变量时,该变量将引用该对象在内存中的地址。位图是引用类型,而不是值类型。当您比较位图时,您会比较它们的引用。当您将类型位图的变量分配给控件的属性时,您分配了引用:它指向变量指向的同一对象。然后会比较引用,看看它们是否都指向同一个对象。 您需要做的是将资源生成的对象分配给字段,因此它将创建单个对象。不要使用Project.Resource,因为它是您每次询问时都从中取出同一个对象的存储空间。如上所述,Project.Resource 是一个 Factory:它每次都会生成一个新对象,因此与已分配的对象的比较总是会失败,因为您每次都会比较不同的对象.【参考方案2】:

感谢 'Jimi' 和 'Meysam Asadi' 的回答和 cmets 都有效。我更喜欢使用“Meysam Asadi”代码示例,因为它的布局清晰且易于理解。

您的帮助解决了我的问题。谢谢

【讨论】:

以上是关于C# WinForm - 在标签上切换背景图像的主要内容,如果未能解决你的问题,请参考以下文章

c# winform背景图片超过屏幕分辨率怎么办

C# winform 制作圆形窗体

C# winForm怎么把textbox 不可见

请问Winform里面怎么单击按钮来改变窗体背景图片?(C#)

C# winform 控件拖动问题

DEV winform treelist设置背景图像