从类访问 MainWindow 变量

本文关键字:变量 MainWindow 访问 | 更新日期: 2023-09-27 18:36:59

我正在制作一个 WPF 应用程序来模拟流量。我希望Car的反应延迟为 1 秒,用于改变它们的加速度,而不会停止整个应用程序。为此,我想从我的Car类中获取elapsed变量。elapsed变量存储经过的时间。

MainWindow中的代码:

namespace TrafficTester
{
    public partial class MainWindow : Window
    {
        Timer timer = new Timer();
public MainWindow()
    {
        InitializeComponent();
        //create the timer
        timer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
        timer.Interval = timerInterval;
        timer.Enabled = true;
        //...
        void OnTimedEvent(object source, ElapsedEventArgs e)
        {
            timer.Enabled = false; //stop timer whilst updating, so updating won't be called again before it's finished
            update(); //
            timer.Enabled = true;
            elapsed += timerInterval;
        }
    }
}

Car类中的代码:

namespace TrafficTester
{
    public class Car
    {
    //...
        public void changeAccel(double val)
        {
            int time = MainWindow.elapsed;
            int stop = MainWindow.elapsed + reactDelay;
            while (time < stop)
            {
                time = MainWindow.elapsed;
            }
            accel = val;
        }
    }
}

accel是当前的加速度,val是新的加速度。 MainWindow.elapsed应该从 MainWindow 调用 elapsed 变量,但它没有。我怎么能从Car课上调用它?

从类访问 MainWindow 变量

我至少看到了 2 个问题:
- 如果要访问计时器意图,它必须是公开的。
- 然后,您可以通过主窗口的实例访问它。

要获取经过

的时间,就像您可能想要的那样,您需要从经过事件处理程序中获取并在那里执行计时操作!

public  partial class MainWindow : Window
{
   public System.Timers.Timer myTimer = new System.Timers.Timer();
    public MainWindow()
        {
    //create the timer
    myTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent); // Where is it?
    myTimer.Interval = 5;
    myTimer.Enabled = true;
        }
    //...
    void OnTimedEvent(object source, ElapsedEventArgs e)
    {
        myTimer.Enabled = false; //stop timer whilst updating, so updating won't be called again before it's finished
        //update(); //
        myTimer.Enabled = true;
     //   Timer.Elapsed += 5;
    }
}
public class Car
{
    public void changeAccel(double val)
    {
        var myWin = (MainWindow)Application.Current.MainWindow;
        int time = myWin.myTimer.Elapsed; //<-- you cannot use it this way
    }
}