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

时间:2018-12-22 16:22:15

标签: c# winforms picturebox

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

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

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");
}

1 个答案:

答案 0 :(得分:1)

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

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

在这里,我正在以Monitor4格式创建对Monitor3的引用:

Monitor4 mo4 = null;

此引用将用于调用UpdatePictureBox的公共方法(Monitor4)。

Monitor3格式:
(我正在使用TextBox的TextChanged事件来选择要在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 "[Sme text 3]":
                mo4.UpdatePictureBox(@"[Images3 Path]");
                break;
        }
    }
}

Monitor4表单:

public partial class Monitor4 : Form
{
    public void UpdatePictureBox(string BitmapImage)
    {
        if (File.Exists(BitmpImage))
        {
            if (this.pictureBox1.Image != null)
                this.pictureBox1.Image.Dispose();
            this.pictureBox1.Image = (Image)Image.FromFile(BitmapImage, true).Clone();
        }
    }
}

抽样结果:

Access a Form's Control from another class