我有一个程序,它有 16 个网格图 block ,使用图片框,但只使用 5 个图像,其余的图 block 只是一个黑色图像。
我希望能够知道“用户”点击了哪个图像。
我有一个名为 image_Click(object sender, EventArgs e) 的方法
我在这个方法中有一个 if 语句,其中指出:
if (peckedSquare.BackColor == Color.Black)
{
System.Diagnostics.Debug.WriteLine("Pecked a black square");
return;
}
这会发送一个字符串,让我知道何时单击了黑色方 block 。
有没有一种简单的方法可以说:
//伪代码:
if (peckedSquare.ImageName == pigeon1.png)
{
System.Diagnostics.Debug.WriteLine("Pecked Pigeon number 1");
}
我已经用谷歌搜索了我的问题,但没有找到任何合适的答案。
//编辑 我刚刚重新阅读了我的代码。 我使用随机数将每张图片分配给图片框方 block 。 我有这个随机数作为变量,所以我可以使用该变量来确定单击了哪个图像。 IE。
if (randomNumber == 1)
{
System.Diagnostics.Debug.WriteLine("Pecked Pigeon number 1");
}
或者比这更好
pigeonSelected = randomNumber + 1 //as I am using an array to store the images
System.Diagnostics.Debug.WriteLine("Pecked Pigeon Number {0}", pigeonSelected);
最佳答案
作为快速而肮脏的解决方案,我将使用 Tag
属性,使用 null
表示黑色图 block ,使用文件路径表示其他属性(并且它始终可用,即使您的图像来自资源),像这样:
if (peckedSquare.Tag == null)
{
Debug.WriteLine("Pecked a black square");
}
else
{
switch (Path.GetFileName(peckedSquare.Tag.ToString()))
{
case "pigeon1.png":
break;
}
}
当然,当您创建图 block 时,您必须在标签
中存储文件路径:
PictureBox tile = new PictureBox();
tile.Image = Image.FromFile(path); // Or another source, of course
tile.Tag = path;
作为替代方案,您甚至可以使用 Name
属性来实现此目的,每个控件都会被命名(主要用于设计器代码集成),但如果您在运行时创建控件,则可以将该值设置为您想要的任何值。想要(不仅仅是有效的标识符)。用法与上面相同,只是不需要调用 ToString()
。
如何改进?
请允许我说这个解决方案不是很 OOP。即使没有大的重构,我们也可以做得更好一点。请注意,您可以在 Tag
属性中存储您想要的任何内容。一个数字、一个与文件名无关的简单字符串,甚至(可能更好)表示该图像的类或枚举(将操作委托(delegate)给该对象)。这是一个非常原始的例子:
abstract class Tile {
public abstract void Activate();
}
sealed class EmptyTile : Tile {
public virtual void Activate() {
Debug.WriteLine("Pecked a black square");
}
}
sealed class ImageTile : Tile {
public ImageTile(string content) {
_content = content;
}
public virtual void Activate() {
Debug.WriteLine(_content);
}
private string _content;
}
通过这种方式,您可以在点击事件处理程序中执行以下操作:
((Tile)peckedTile.Tag).Activate();
无需检查里面的内容或与null
进行比较。没有 if
也没有 switch
,只是当你创建图 block 。
关于c# - 如何使用 C# 访问 Visual Studio 中图片框中的图像名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21031319/