在我的项目中,我有一个打开第二个窗口的MainWindow。在第二个窗口中有一个框架,我在框架内启动一个导航服务。同样在第二个窗口中,我有一个KeyDown方法,当用户按下Escape键时调用Me.Close。无论如何,当第二个窗口关闭导航服务中的一个页面内的System.Windows.Threading.DispatcherTimer()时,并没有结束。关于如何关闭第二个窗口并终止导航服务中的DispatcherTimer的任何想法?如何关闭包含框架,导航服务和计时器的窗口
感谢 迈克
附:如果有人想看看我有什么我可以提供源代码
(嘿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事件?
谢谢!
你可以直接调用DispatcherTimer上的Stop()方法,并确保它在关闭窗口之前处理? – EkoostikMartin
这将工作,但我不知道如何捕捉具有计时器的页面内的窗口关闭事件...(另外,导航服务中的页面是在运行时创建的,所以我真的没有办法访问他们从第二个窗口导航服务启动后) – zzMzz
需要查看代码,特别是“第二个窗口”的代码和导航服务的相关位。 – EkoostikMartin