WinForm按钮BackgroundImage显示为System.Drawing.Bitmap及图片状态判断问题
WinForm按钮BackgroundImage显示为System.Drawing.Bitmap及图片状态判断问题
嘿,我来帮你捋清楚这个扫雷开发里遇到的问题!
首先,你疑惑为什么控制台输出的是System.Drawing.Bitmap而不是图片路径——这是因为Image.FromFile()方法返回的是一个Bitmap对象,当你直接打印tile.BackgroundImage时,实际上调用了这个对象的ToString()方法,而Bitmap类的默认ToString逻辑就是输出它的类型名称,不是文件路径,所以看不到你期望的路径。
然后说你尝试直接用tile.BackgroundImage == Image.FromFile(...)来判断的问题:每次调用Image.FromFile()都会创建一个全新的Bitmap实例,哪怕是同一个文件,这些实例的内存引用地址都不一样,所以用==比较引用肯定不会相等,自然判断失败。
接下来给你两个靠谱的解决方案:
方案一:用Button的Tag属性标记状态
你之前试过Tag但没成功,大概率是没正确设置和判断。我们可以用Tag来存当前按钮的状态(比如"flag"或"normal"),这样判断起来更直观:
private void Button_MouseDown(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Right) { var tile = (Button)sender; // 判断当前是否是标记了旗帜的状态 if (tile.Tag?.ToString() == "flag") { // 切换回普通方块图片 tile.BackgroundImage = Image.FromFile(@"C:\Users\xxxxx\Documents\MyFiles\tile.png"); tile.Tag = "normal"; Console.WriteLine("切换为普通方块"); } else { // 设置旗帜图片 tile.BackgroundImage = Image.FromFile(@"C:\Users\xxxxx\Documents\MyFiles\flag.png"); tile.Tag = "flag"; Console.WriteLine("设置为旗帜"); } } }
方案二:提前缓存图片对象(更推荐)
多次调用Image.FromFile()会重复加载图片,不仅浪费性能,还可能占用文件句柄导致后续操作出问题。我们可以在窗体初始化时就把需要的图片加载好,存在变量里,之后直接用这些变量赋值,判断时直接比较对象引用即可:
// 提前声明图片变量,在窗体初始化时加载 private Image _flagImage; private Image _tileImage; public YourFormName() // 这里替换成你的窗体类名 { InitializeComponent(); // 只加载一次图片,避免重复IO操作 _flagImage = Image.FromFile(@"C:\Users\xxxxx\Documents\MyFiles\flag.png"); _tileImage = Image.FromFile(@"C:\Users\xxxxx\Documents\MyFiles\tile.png"); } private void Button_MouseDown(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Right) { var tile = (Button)sender; // 直接用缓存的图片对象比较引用 if (tile.BackgroundImage == _flagImage) { tile.BackgroundImage = _tileImage; Console.WriteLine("切换为普通方块"); } else { tile.BackgroundImage = _flagImage; Console.WriteLine("设置为旗帜"); } } }
备注:内容来源于stack exchange,提问作者ultimatevision254
相关产品推荐
相关产品推荐

