如何关闭包含框架,NavigationService和计时器的窗口

时间:2012-06-21 16:49:54

标签: wpf vb.net window

在我的项目中,我有一个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事件而无需手动将焦点更改为页面上的控件?

谢谢!

1 个答案:

答案 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,否则这似乎是有道理的。

谢谢!