如何从另一个窗体更改 PictureBox 图像

How to change a PictureBox image from another Form

我想在 form1 加载时打开 form2。此外,我想在 form1 中触发某个动作时更改 form2 中 PictureBox 的图像。

要在 form1 加载时打开 form2 我使用了以下代码:

private void MONITOR3_Load(object sender, EventArgs e)
{
    MONITOR4 mo4 = new MONITOR4(this);
    mo4.Show();
}

要更改 form2 中 PictureBox 的图像,我使用了这段代码,在满足条件后必须 运行:

if (textBox1.Text == @"QUEBEC - ALPHA - TANGO - ALPHA - ROMEO - ")
{
    MONITOR4 mo4 = new MONITOR4(this);
    mo4.pictureBox1.Image = Image.FromFile("D:/QResources/images/HIA.jpg");
}

您当前的代码有两个问题:

  • 您不必每次需要设置其某些属性时都创建一个新的 Form 实例:存储对此 Form 的引用并使用此引用来调用 public Form 的属性或方法.
  • 您正在尝试直接访问另一个窗体的子控件的属性。尽管您可以定义一个子控件 public,但您不应该也没有必要定义事件。在这方面,表单是一个 class 和其他任何表单一样:在表单上创建一个 public 方法,该方法提供修改私有 属性 的方法,而不直接暴露控件的 属性直接访问。
    更简单,更安全,更便携:如果一个控件需要修改(改名字,改控件类型等),不需要再去寻找旧 name/properties 在其他 class 中的使用位置。
    public 方法将是相同的,它是唯一负责引用受影响控件的当前名称和属性的方法。最终需要修改代码的一个地方。 您还可以使用 public 事件或实施 INotifyPropertyChanged 来通知订阅者某些属性已更改。

在这里,我在 Monitor3 表单中创建对 Monitor4 的引用:

Monitor4 mo4 = null;

此引用将用于调用 Monitor4.

的 public 方法 (UpdatePictureBox)

Monitor3 表格:
(我正在使用 TextBox 的 TextChanged 事件来 select 在 Monitor4 PictureBox 中显示的图像。当然,它可能是 Validate 事件或其他任何事件符合你的设计)

public partial class Monitor3 : Form
{
    Monitor4 mo4 = null;

    private void Monitor3_Load(object sender, EventArgs e)
    {
        mo4 = new Monitor4();
        //Show Monitor4 on the right side of this Form
        mo4.Location = new Point(this.Right + 10, this.Top);
        mo4.Show(this);
    }

    private void textBox1_TextChanged(object sender, EventArgs e)
    {
        string newText = textBox1.Text;
        switch (newText) {
            case "[Some text 1]":
                mo4.UpdatePictureBox(@"[Images1 Path]");
                break;
            case "QUEBEC - ALPHA - TANGO - ALPHA - ROMEO - ":
                mo4.UpdatePictureBox(@"[Images2 Path]");
                break;
            case "[Some text 3]":
                mo4.UpdatePictureBox(@"[Images3 Path]");
                break;
        }
    }
}

Monitor4 表格:

public partial class Monitor4 : Form
{
    public void UpdatePictureBox(string imagePath)
    {
        if (File.Exists(imagePath)) {
            pictureBox1.Image?.Dispose();
            pictureBox1.Image = Image.FromFile(imagePath, true);
        }
    }
}

示例结果: