0

我有两节课:

mainGUIpreferencesGUI

每次按下按钮时,我都想在mainGUI名为 的类中调用一个方法。但是,当我尝试这样做时,什么也没有发生。updateGUIapplychanges

这是我的课程:

更新界面:

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

首选项GUI上的按钮单击事件处理程序:

private void applychanges_Click(object sender, EventArgs e)
{
        mainGUI mg = new mainGUI();
        mg.updateGUI();
}

谢谢你的帮助。

4

1 回答 1

3

首先,我假设当preferencesGUI 进行此调用时mainGUI 已经打开。所以当你这样做时:

private void applychanges_Click(object sender, EventArgs e)
{
        mainGUI mg = new mainGUI();
        mg.updateGUI();
}

您所做的只是创建一个新的 mainGUI 实例,然后让它超出范围,所以是的,它什么也不做。

这是 GUI 开发中非常常见的障碍。你如何让不同的组件相互了解。人们最初尝试的一种方法是单例。但是,如果您想要组件的多个实例,这可能会导致问题,实际上它只是有点混乱。一个更好的想法是传入控件的实例,但这种设计不是非常模块化,因为它要求preferencesGUI 类知道mainGUI 类。

相反,您应该在您的首选项GUI 中创建一个事件,如下所示:

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);
于 2012-12-10T17:34:02.120 回答