如何在 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();
}
抱歉,如果我的猜测是错误的。
我正在尝试创建一个设置菜单,我正在尝试从该菜单更改其他表单的属性,但它不起作用...
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();
}
抱歉,如果我的猜测是错误的。