如何在 C# 中从另一个窗体更改窗体属性

How to change a form properties from another form in C#

我正在尝试创建一个设置菜单,我正在尝试从该菜单更改其他表单的属性,但它不起作用...

private void lightThemeBtn_Click(object sender, EventArgs e)
    {
        Form1 mainForm = new Form1();
        mainForm.chart1.BackColor = Color.White;
        mainForm.panel1.BackColor = Color.White;
        mainForm.BackColor = Color.White;   
    }

这是设置菜单中的代码,当我点击该按钮时没有任何反应

  private void settingBtn_Click(object sender, EventArgs e)
    {
        SettingsMenu sm = new SettingsMenu();
        sm.ShowDialog();
        sm.Activate();  
    }

这是打开设置菜单的代码..

与其尝试更改调用表单中的属性,不如创建一个 class 来更改属性,例如

Class 设置

public class Settings
{
    public Color? MainFormBackColor { get; set; }
    public Color? Panel1BackColor { get; set; }
}

在表单中进行更改,这里是上面两个属性的颜色对话框和 Settings class 的实例。进行更改时,在私有变量 _settings.

中设置值

创建一个主窗体订阅的事件,并在调用时检查每个 属性 是否有设置值,如果有则设置它们。

设置表单

public partial class SettingsForm : Form
{
    public delegate void OnChangeColors(Settings settings);
    public event OnChangeColors ColorsChanged;
    private readonly Settings _settings = new Settings();
    public SettingsForm()
    {
        InitializeComponent();
    }

    private void SaveButton_Click(object sender, EventArgs e)
    {
        ColorsChanged?.Invoke(_settings);
    }

    private void FormBackColorButton_Click(object sender, EventArgs e)
    {
        if (colorDialog1.ShowDialog() == DialogResult.OK)
        {
            _settings.MainFormBackColor = colorDialog1.Color;
        }
    }

    private void PanelBackColor_Click(object sender, EventArgs e)
    {
        if (colorDialog1.ShowDialog() == DialogResult.OK)
        {
            _settings.Panel1BackColor = colorDialog1.Color;
        }
    }
}

主窗体

public partial class MainForm : Form
{
    public MainForm()
    {
        InitializeComponent();
    }

    private void SettingsButton_Click(object sender, EventArgs e)
    {
        var settingsForm = new SettingsForm();
        settingsForm.ColorsChanged += SettingsFormOnColorsChanged;
        settingsForm.ShowDialog();
        settingsForm.Dispose();
    }

    private void SettingsFormOnColorsChanged(Settings settings)
    {
        if (settings.Panel1BackColor.HasValue)
        {
            panel1.BackColor = settings.Panel1BackColor.Value;
        }

        if (settings.MainFormBackColor.HasValue)
        {
            BackColor = settings.MainFormBackColor.Value;
        }
    }
}

对于上面的内容,当然需要一些地方来存储设置,它可能在 json 文件中,而下面的选项已经为您处理了。

另一种选择是为每个要设置的 属性 创建一个设置,而不是将 属性 数据绑定到设置。

例如,对于主窗体背景颜色,创建 MainFormBackColor 而不是通过绑定到窗体 属性 window 中 ApplicationSettings 下的背景颜色,为每个控件添加绑定。

SettingsMenu 中创建三个 public 变量来保存颜色:

public class SettingsMenu 
{

    public Color clrChart;
    public Color clrPanel;
    public Color clrForm;

    private void lightThemeBtn_Click(object sender, EventArgs e)
    {
        clrChart = Color.White; // don't all have to be the same!
        clrPanel = Color.White; // don't all have to be the same!
        clrForm = Color.White; // don't all have to be the same!
        this.DialogResult = DialogResult.OK;
    }

}

现在您可以在 ShowDialog() returns:

之后检索这些值
private void settingBtn_Click(object sender, EventArgs e)
{
    SettingsMenu sm = new SettingsMenu();
    if (sm.ShowDialog() == DialogResult.OK)
    {
        this.chart1.BackColor = sm.clrChart;
        this.panel1.BackColor = sm.clrPanel;
        this.BackColor = sm.clrForm;
    }
}

我猜Form1是包含设置btn的表单吧? 然后你尝试改变Form1表单设置Form的主题。

问题是您尝试新建 Form1 并为其设置颜色,因为它是 Form1 的不同实例。

您宁愿将 Form1 传递给 SettingForm 构造函数并为其设置颜色。

// in SettingsMenu
Form1 mainForm;
public SettingsMenu(Form1 form1_) {
   mainForm = form1_;
}

private void lightThemeBtn_Click(object sender, EventArgs e)
{
    mainForm.chart1.BackColor = Color.White;
    mainForm.panel1.BackColor = Color.White;
    mainForm.BackColor = Color.White;   
}


// in Form1.cs
private void settingBtn_Click(object sender, EventArgs e)
{
    SettingsMenu sm = new SettingsMenu(this);
    sm.ShowDialog();
    sm.Activate();  
}

抱歉,如果我的猜测是错误的。