0

在我的项目中,我有一个打开第二个窗口的 MainWindow。在第二个窗口内有一个框架,我在框架内启动了一个导航服务。同样在第二个窗口中,我有一个 KeyDown 方法,当用户按下 Escape 键时调用 Me.Close。无论如何,当第二个窗口关闭导航服务中的一个页面内的 System.Windows.Threading.DispatcherTimer() 时,它并没有结束。关于如何关闭第二个窗口并终止导航服务中的 DispatcherTimer 的任何想法?

谢谢迈克

ps 如果有人想看看我有什么,我可以提供源代码...


(嘿 EkoostikMartin - 这是对您的评论的跟进..)

所以我在这方面取得了一些进展。我已经添加:

 AddHandler Me.KeyDown, AddressOf Page_KeyDown
 AddHandler Me.PreviewKeyDown, AddressOf Page_PreviewKeyDown

到有计时器的页面。在页面内部,我定义了两种方法,例如:

 Private Sub Page_KeyDown(sender As Object, e As KeyEventArgs)

    If e.Key = Key.Escape Then
        dTimer.Stop()
        MessageBox.Show("Exit Page")
    End If

End Sub

Private Sub Page_PreviewKeyDown(sender As Object, e As KeyEventArgs)

    If e.Key = Key.Escape Then
            dTimer.Stop()
            MessageBox.Show("Exit Page")
        End If
End Sub

第二个窗口有这个:

  Private Sub Window_KeyDown(sender As System.Object, e As System.Windows.Input.KeyEventArgs)

    'Escape Key Exits Program
    If e.Key = Key.Escape Then
        Me.Close()
    End If

End Sub

因此,当我在导航服务中并使用计时器导航到页面并按“Esc”时,我收到消息“退出页面”,然后窗口关闭。这很好!

(我认为我不需要 KeyDown 和 PreviewKeyDown。当我按下“Esc”时,我实际上得到了两个“退出页面”弹出窗口)

但是有一个问题:除非我将焦点移动到文本框或组合框,否则页面似乎没有获得 KeyDown 事件,如果我不这样做,按下“Esc”键会调用第二个窗口的 Window_KeyDown 而不是页面的 KeyDown 事件,这意味着页面上的计时器即使在第二个窗口关闭后也不会停止。有谁知道在页面加载时获取页面焦点的方法,以便我可以在不手动将焦点更改为页面上的控件的情况下获取 KeyDown 事件?

谢谢!

4

1 回答 1

0

好的 - 我终于通过解决方法解决了这种情况。在我的第二个窗口中,我创建了一个 DispatcherTimer 类型的列表:

Public clndTimer As New List(Of System.Windows.Threading.DispatcherTimer)

我可以从导航服务内的页面访问此列表。这是页面中的代码:

Dim dTimer As New DispatcherTimer()

dTimer.Start()

Dim wSecondWindow As New SecondWindow

wSecondWindow = Window.GetWindow(Me)

If wSecondWindow IsNot Nothing Then
    wSecondWindow.clndTimer.Add(dTimer)
End If

然后我在第二个窗口中捕获关键事件。这是第二个窗口中的方法:

 Private Sub Window_KeyDown(sender As System.Object, e As System.Windows.Input.KeyEventArgs)

    'Escape Key Exits Program
    If e.Key = Key.Escape Then

        For Each dt In clndTimer
            dt.Stop()
        Next

        Me.Close()
    End If

End Sub

这样做我不需要 Page_KeyDown 或我的 Page 中的 PreviewKeyDown 方法,这很好,因为它们的行为不可靠。(见上面的答案)

所以你怎么看?我不完全确定获得第二个窗口的方式或如何在页面中检查它是否为空,但否则这似乎是有道理的。

谢谢!

于 2012-06-22T17:27:58.837 回答