如何修改资源文件中扑克牌图片的Tag属性?
解决资源文件图片Tag属性修改无效的问题
嘿,这个问题我之前做扑克牌项目时也踩过坑!你修改Properties.Resources._10Diamonds.Tag没效果的核心原因是:每次访问Properties.Resources里的图片资源,都会返回一个全新的实例——你修改的只是那个临时对象的Tag,下次再获取同一张牌的图片时,又是一个新的Image对象,之前的设置自然就没了。
下面给你两个实用的解决方案:
方案1:缓存带Tag的图片实例
提前把所有牌的图片加载一次,设置好Tag后存到一个集合里,后续直接从集合中取用,而不是每次都去Properties.Resources拿新实例。示例代码:
// 类级别的缓存集合 private Dictionary<string, Image> _cachedCardImages = new Dictionary<string, Image>(); // 在程序初始化时(比如Form的构造函数、Load事件里)执行 private void SetupCardImages() { // 处理方块10 var tenDiamonds = Properties.Resources._10Diamonds; tenDiamonds.Tag = 10; _cachedCardImages["10Diamonds"] = tenDiamonds; // 处理其他牌,比如红桃A var aceHearts = Properties.Resources._AceHearts; aceHearts.Tag = 1; _cachedCardImages["AceHearts"] = aceHearts; // 剩下的牌按这个逻辑依次添加... } // 后续使用时 Image myCard = _cachedCardImages["10Diamonds"]; int cardValue = (int)myCard.Tag; // 这里就能拿到10了
方案2:封装成自定义Card类(更推荐)
既然是做扑克牌开发,直接把图片和牌的属性(数值、花色等)封装成一个类,比依赖Image的Tag属性更清晰、更易维护:
public class PlayingCard { public Image CardImage { get; set; } public int Value { get; set; } // 牌的数值,比如10、1(A)、11(J)等 public string Suit { get; set; } // 花色:Diamonds(方块)、Hearts(红桃)等 } // 初始化牌组 private List<PlayingCard> CreateDeck() { var deck = new List<PlayingCard>(); deck.Add(new PlayingCard { CardImage = Properties.Resources._10Diamonds, Value = 10, Suit = "Diamonds" }); deck.Add(new PlayingCard { CardImage = Properties.Resources._AceHearts, Value = 1, Suit = "Hearts" }); // 继续添加其他牌... return deck; } // 使用时 var tenDiamonds = deck.First(card => card.Value == 10 && card.Suit == "Diamonds"); Image cardImage = tenDiamonds.CardImage; int cardValue = tenDiamonds.Value;
为什么原方法无效?
如果你好奇底层原因,可以看看Properties.Resources自动生成的代码(右键Resources.resx→查看代码),每个图片属性的实现大概是这样的:
internal static System.Drawing.Bitmap _10Diamonds { get { object obj = ResourceManager.GetObject("_10Diamonds", resourceCulture); return ((System.Drawing.Bitmap)(obj)); } }
每次调用这个属性,ResourceManager.GetObject都会返回一个新的Bitmap实例,所以你修改的Tag只属于那个瞬间的临时对象,根本不会影响到资源文件里的内容,下次再拿又是新的。
内容的提问来源于stack exchange,提问作者KanerDev
相关产品推荐
相关产品推荐

