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)
        {
            ....
        }
    }

显然,该解决方案确实存在一些性能问题:

  • 计时器总是在运行
  • 如果必须检查每个勾号的对账单

尽管对于我制作的这样一个小程序来说,这些基本上无关紧要,但我渴望学习如何以正确的方式解决这样一个问题
提前感谢您的回复!

c#更改整个类和窗体的属性

在列出可能的解决方案之前,我强烈建议您更多地了解MVC和/或MVVM(通常用于WPF)架构模式。它们将指导您如何在GUI应用程序中的类和视图之间分配职责。这将是一条陡峭的学习曲线,但最终还是值得的。

  1. 直接在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();
      }
    
  2. 如果你觉得这两个表单的计时器控件将在整个应用程序中被引用,你可以在主表单中保留对它们的引用

  3. 您可以使用事件通知计时器应该启动/停止。这些事件可以在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();
    }
}

据我所知,将变量timerUptimerBreak从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();
        }
    }
}