WPF InitializeComponent似乎不适用于DispatcherTimer

时间:2018-04-16 09:47:38

标签: c# wpf user-interface timer

我是C#和WPF的新手,我试图了解 DispatcherTimer 如何与GUI(WPF)协同工作。我想让我的应用程序每2秒运行一个函数,但仍然使用应用程序本身,当我尝试以下代码时,计时器启动但我不能使用以下按钮(注销和退出),它就像应用程序冻结。

public MainLoggedWindow()
{   
    Globals.mainLoggedWindow = this;
    InitializeComponent();


    DispatcherTimer dt = new DispatcherTimer();

    dt.Tick += new EventHandler(dtTiker);

    dt.Interval = new TimeSpan(0, 0, 1);
    dt.Start();
}

private void exit_button_Click(object sender, RoutedEventArgs e)
{
    logout_button_Click(sender, e);
    Environment.Exit(-1);
}

private void logout_button_Click(object sender, RoutedEventArgs e)
{       
    Globals.LOGGED_IN_USER.logout();
    this.Hide();
    Globals.mainWindow.Show();
}

private int increment = 0;

private void dtTiker(object sender,EventArgs e)
{       
    increment++;
    Time.Content = increment.ToString();
}

1 个答案:

答案 0 :(得分:0)

DispatcherTimer在UI线程上运行。这意味着当DispatcherTimer调用其Tick方法时,UI线程变得忙于处理它,并且它没有时间处理其他UI输入,如按钮点击,因此窗口冻结。

你可以做的是增加DispatcherTimer的间隔时间 - 你的问题描述是每两秒一次,但你的初始化逻辑每隔一秒就有一次:dt.Interval = new TimeSpan(0, 0, 1);