我有两个班级:
mainGUI
和preferencesGUI
每次按下mainGUI
按钮时,我想调用名为updateGUI
的{{1}}类中的方法。但是,当我尝试这样做时,没有任何反应。
以下是我的课程:
updateGUI:
applychanges
来自preferencesGUI的按钮点击事件处理程序:
public void updateGUI()
{
String[] colors = (Regex.Split(File.ReadAllText(prefpath), ","));
int[] colori = new int[colors.Length];
for (int x = 0; x < colors.Length; x++)
{
colori[x] = Convert.ToInt32(colors[x].ToString());
}
preferencesGUI pg = new preferencesGUI();
pg.R1 = colori[0];
pg.G1 = colori[1];
pg.B1 = colori[2];
pg.R2 = colori[3];
pg.G2 = colori[4];
pg.B2 = colori[5];
outputbox.ForeColor = Color.FromArgb(colori[0], colori[1], colori[2]);
outputbox.BackColor = Color.FromArgb(colori[3], colori[4], colori[5]);
eventlist.ForeColor = Color.FromArgb(colori[0], colori[1], colori[2]);
eventlist.BackColor = Color.FromArgb(colori[3], colori[4], colori[5]);
}
感谢您的帮助。
答案 0 :(得分:3)
首先,我假设当preferGUI进行此调用时,mainGUI已经打开。所以当你这样做时:
private void applychanges_Click(object sender, EventArgs e)
{
mainGUI mg = new mainGUI();
mg.updateGUI();
}
你所做的只是创建一个新的mainGUI实例,然后让它超出范围,是的,它什么都不做。
这是GUI开发中非常常见的障碍。如何让不同的组件相互了解。人们最初尝试的一种方法是单身人士。但是,如果您想要组件的多个实例,这可能会导致问题,实际上它只是一种混乱。更好的想法是传入控件的实例,但这种设计不是很模块化,因为它要求preferencesGUI类知道mainGUI类。
相反,您应该在您的preferencesGUI中创建一个事件,如下所示:
class preferencesGUI
{
// ... Some code ...
public event Action RequestGUIUpdate;
protected void OnRequestGUIUpdate() { if (this.RequestGUIUpdate == null) return; RequestGUIUpdate(); }
// ... Some more code ...
private void applychanges_Click(object sender, EventArgs e)
{
OnRequestGUIUpdate();
}
// ... Some more code ...
}
现在,preferencesGUI能够通知何时需要进行GUI更新。因此,当您从mainGUI创建preferencesGUI实例时,请附加一个事件处理程序,如下所示:
preferencesGUI preferences = new preferencesGUI();
preferences.RequestGUIUpdate += new Action(updateGUI);