在我的项目中,我有一个MainWindow打开第二个Window。在第二个窗口内有一个框架,我在框架内启动导航服务。同样在第二个窗口中,我有一个KeyDown方法,当用户按下Escape键时调用Me.Close。无论如何,当第二个窗口关闭导航服务中的一个页面内的System.Windows.Threading.DispatcherTimer()时,它不会结束。关于如何关闭第二个窗口并在导航服务中终止DispatcherTimer的任何想法?
由于 麦克
P.S。如果有人想看看我有什么......我可以提供源代码。
(Hey 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”时,我实际上得到两个“退出页面”弹出窗口)
但是有一个问题:看起来好像Page不会得到KeyDown事件,除非我将焦点移动到文本框或组合框,如果我不这样做,按“Esc”键调用第二个Window的Window_KeyDown而不是Page的KeyDown事件,这意味着即使在第二个窗口关闭后,页面上的计时器也不会停止。有没有人知道在页面加载时获取页面焦点的方法,这样我就可以获得KeyDown事件而无需手动将焦点更改为页面上的控件?
谢谢!
答案 0 :(得分: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或PreviewKeyDown方法,这很好,因为它们表现得不可靠。 (见上面的答案)
那你觉得怎么样?我不完全确定我获得第二个窗口的方式,或者我如何在页面中检查它是否为null,否则这似乎是有道理的。
谢谢!