如何从另一个窗体更改 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);
}
}
}
示例结果:
我想在 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
.
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);
}
}
}
示例结果: