c# - 如何使用 C# 访问 Visual Studio 中图片框中的图像名称

标签 c# picturebox

我有一个程序,它有 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/

相关文章:

c# - 其他环境下的类库中未加载语言资源文件

c# - AWS lambda如何在.NET Core中创建多部分响应?

c# - 使用鼠标事件在 Picturebox 中移动图像

c# - 图片框 slider 控制透明度

c# - 以一定的时间间隔将目录中的图像加载到图片框中

C# 在 PictureBox 中的某个点上绘制位图

c# - 右键单击目录路径

c# - Visual Studio 中的属性页菜单中缺少 Web 选项卡

c# - 使用 C# 变量作为表元素

c# - 图片框未更新其内容