c#更改整个类和窗体的属性
本文关键字:窗体 属性 | 更新日期: 2023-09-27 18:26:33
大家好
不知何故,我对编码还是个新手,却偶然发现了一个问题。我自己设法找到了解决方案,但我确信有更好的解决方案
我会尽量描述我的问题,就像我糟糕的英语技能所允许的那样,然后马上解决。问题是,我想知道是否有任何一般的解决方案,因为我的解决方案似乎只非常适合这种情况
好了,伙计们,开始吧!
程序说明
程序本身由三个窗体设置,主窗体是"控制中心"或菜单,也就是说,另外两个是通过标签显示的计时器,正如你在这里看到的。蓝色计时器在增加,而绿色计时器则相反。
当我打开程序时,两个计时器窗体也打开了,即使它们没有运行,我也需要它们。显然,我使用FormMain_Load方法来显示它们:
private void FormMain_Load(object sender, EventArgs e)
{
Form1 timerUp = new Form1();
timerUp.Show();
Form2 timerBreak = new Form2();
timerBreak.Show();
}
问题
现在,这显然是我的问题!当有人点击这两个启动按钮中的一个时,我想在表单上启动计时器(因为我把每个计时器的计时器都放在自己的表单上)。但是如果我使用
private void buttonStart_Click(object sender, EventArgs e)
{
timerUp.timer1.Start();
}
为了获得"timerUp"变量,我无法访问FormMain_Load中的本地变量"Form1 timerUp)。它说"变量在当前环境中不存在"。
如果有人知道一个可能的解决方案,只需打开另一个类已经打开的表单上的计时器,我将非常高兴。
我的解决方案
作为剧透,我设法找到了一个解决方案,尽管我对它的设置不满意
为了维护我的解决方案,这两个计时器启动第二个打开的表单,例如在Form1(第一个计时器)内:
private void Form1_Load(object sender, EventArgs e)
{
timer1.Start();
}
然而,这背后有一些逻辑。我在mainForm中设置了一些公共静态布尔,并通过单击按钮来更改它们。例如:
public partial class FormMain : Form
{
public static bool timer1 = false;
public static bool timer2 = false;
....
private void buttonStart_Click(object sender, EventArgs e)
{
timer1 = true;
}
}
现在,再次在Form1中,我添加了一些if语句来检查这些布尔值。就像这样:
private void timer1_Tick(object sender, EventArgs e)
{
if (FormMain.timer1)
{
....
}
}
显然,该解决方案确实存在一些性能问题:
- 计时器总是在运行
- 如果必须检查每个勾号的对账单
尽管对于我制作的这样一个小程序来说,这些基本上无关紧要,但我渴望学习如何以正确的方式解决这样一个问题
提前感谢您的回复!
在列出可能的解决方案之前,我强烈建议您更多地了解MVC和/或MVVM(通常用于WPF)架构模式。它们将指导您如何在GUI应用程序中的类和视图之间分配职责。这将是一条陡峭的学习曲线,但最终还是值得的。
-
直接在MainForm的类级别中移动timerUp和timerBreak变量。这样,你就可以通过引用你的主表单来访问它们
Form1 timerUp; Form2 timerBreak; private void MainForm_Load(object sender, EventArgs e) { timerUp = new Form1(); timerBreak = new Form2(); timerUp.Show(); timerBreak.Show(); }
-
如果你觉得这两个表单的计时器控件将在整个应用程序中被引用,你可以在主表单中保留对它们的引用
-
您可以使用事件通知计时器应该启动/停止。这些事件可以在MainForm中,也可以最好在单独的类中。这个单独的类还将包含计时器的模型(属性,如时间、状态等),并通过属性更改通知事件通知计时器。这在MVVM中被大量使用。
根据我的评论,试试这样的东西:
public class MainForm
{
Form1 timerUp = new Form1();
Form2 timerBreak = new Form2();
private void MainForm_Load(object sender, EventArgs e)
{
timerUp.Show();
timerBreak.Show();
}
private void buttonStart_Click(object sender, EventArgs e)
{
timerUp.StartTimer();
}
}
public class Form1
{
private Timer _timer = new Timer();
public void StartTimer()
{
_timer.Start();
}
}
据我所知,将变量timerUp
和timerBreak
从Main表单的Form_Load
事件处理程序移到类级别就足够了,例如:
public class FormMain
{
// Class level fields
private Form1 timerUp = new Form1();
private Form2 timerBreak = new Form2();
private void FormMain_Load(object sender, EventArgs e)
{
timerUp.Show();
timerBreak.Show();
}
// Use the class level fields wherever you need to
private void buttonStart_Click(object sender, EventArgs e)
{
timerUp.timer1.Start();
}
// Dispose of the class-level fields when MainForm is disposed
protected void Dispose(bool disposing)
{
base.Dispose(disposing);
if (disposing)
{
timerUp.Dispose();
timerBreak.Dispose();
}
}
}