遇到DispatcherTimer问题

时间:2014-03-26 11:03:16

标签: c# wpf dispatchertimer

我在WPF窗口上使用一些Dispatcher Timers时遇到一些问题。 在一个窗口我通常会使用一个计时器,但是这个函数似乎不会出现在WPF表单上,所以我被告知DispatcherTimer是等价的。

所以我有3个这样的计时器:

第一个每30秒使表格前进 - 这个正常工作。

dispatcherTimer1.Tick += new EventHandler(dispatcherTimer1_Tick);
dispatcherTimer1.Interval = TimeSpan.FromSeconds(30);
dispatcherTimer1.Start();

private void dispatcherTimer1_Tick(object sender, EventArgs e)
{
    this.Topmost.Equals(true);
    this.Activate();
    this.BringIntoView();
    this.Focus();
    this.Topmost.Equals(false);
}

第二个每100毫秒检查一次,看看IExplorer是否正在运行,如果是,则隐藏OK按钮并在表单上显示一条消息告诉用户关闭IExplorer - 当你运行表单时如果IE运行则会禁用按钮并显示消息,但在您关闭IE后,它不会将其更改回来。

如果打开或关闭IE,我该如何让计时器持续运行并更新表单?

public Process[] aProc = Process.GetProcessesByName("IExplore");

dispatcherTimer2.Tick += new EventHandler(dispatcherTimer2_Tick);
dispatcherTimer2.Interval = TimeSpan.FromMilliseconds(100);
dispatcherTimer2.Start();

private void dispatcherTimer2_Tick(object sender, EventArgs e)
{
    if (aProc.Length == 0)
    {
        richTextBox3.Visibility = System.Windows.Visibility.Hidden;
        button1.Visibility = System.Windows.Visibility.Visible;
    }
    else
    {
        button1.Visibility = System.Windows.Visibility.Hidden;
        richTextBox3.Visibility = System.Windows.Visibility.Visible;
    }
}

第三,就像第二个计时器每100毫秒运行一次,一旦他们点击OK按钮,我想在用户试图调用它时杀死IExplorer进程,但是再次像第二个计时器一样似乎没有经常运行。

有什么想法吗?

dispatcherTimer3.Tick += new EventHandler(dispatcherTimer3_Tick);
dispatcherTimer3.Interval = TimeSpan.FromMilliseconds(100);
dispatcherTimer3.Start();

private void dispatcherTimer3_Tick(object sender, EventArgs e)
{
    Process[] Processes = Process.GetProcessesByName("IExplore");

    foreach (Process Proc1 in Processes)
    {
        Proc1.Kill();
    }
}

2 个答案:

答案 0 :(得分:4)

如果IE正在运行,将禁用该按钮并显示该消息,但在您关闭IE后,它不会将其更改回来。发生这种情况是因为您没有在计时器刻度事件中获得进程。所以改变你的代码,如下所示。

dispatcherTimer2.Tick += new EventHandler(dispatcherTimer2_Tick);
dispatcherTimer2.Interval = TimeSpan.FromMilliseconds(100);
dispatcherTimer2.Start();

private void dispatcherTimer2_Tick(object sender, EventArgs e)
{
    Process[] aProc = Process.GetProcessesByName("IExplore"); 
    if (aProc.Length == 0)
    {
       richTextBox3.Visibility = System.Windows.Visibility.Hidden;
       button1.Visibility = System.Windows.Visibility.Visible;
    }
    else
    {
       button1.Visibility = System.Windows.Visibility.Hidden;
       richTextBox3.Visibility = System.Windows.Visibility.Visible;
    }
}

答案 1 :(得分:0)

在代码段中,您只获取一次进程列表,然后每次都检查相同的数组。如果在实际代码中它是相同的,请确保每次勾选都更新进程列表。

相关问题