Wpf 如何关闭包含框架、导航服务和计时器的窗口

Wpf 如何关闭包含框架、导航服务和计时器的窗口,wpf,vb.net,window,Wpf,Vb.net,Window,在我的项目中,我有一个主窗口,可以打开第二个窗口。在第二个窗口中有一个框架,我在框架内启动了navigationservice。同样在第二个窗口中,我有一个KeyDown方法调用我。当用户按下Escape键时关闭。无论如何,当第二个窗口关闭导航服务中某个页面内的System.Windows.Threading.Dispatchermer时,不会结束。关于如何关闭第二个窗口并终止navigationservice中的Dispatcher,有什么想法吗 谢谢 迈克 p、 我可以提供源代码,如果有人想

在我的项目中,我有一个主窗口,可以打开第二个窗口。在第二个窗口中有一个框架,我在框架内启动了navigationservice。同样在第二个窗口中,我有一个KeyDown方法调用我。当用户按下Escape键时关闭。无论如何,当第二个窗口关闭导航服务中某个页面内的System.Windows.Threading.Dispatchermer时,不会结束。关于如何关闭第二个窗口并终止navigationservice中的Dispatcher,有什么想法吗

谢谢 迈克

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

嘿,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键时,实际上会弹出两个退出页面

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


谢谢

好的-我最终通过一个变通办法解决了这个问题。在第二个窗口中,我创建了Dispatchermer类型的列表:

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,但除此之外,这似乎是有意义的


谢谢

你能在Dispatchermer上调用Stop方法并确保在关闭窗口之前将其释放吗?这会起作用,但我不知道如何在具有计时器的页面中捕获窗口关闭事件。。。此外,navigationservice中的页面是在运行时创建的,因此一旦navigationservice启动,我实际上没有办法从第二个窗口访问它们。我需要查看代码,特别是第二个窗口的代码和navigationservice中的相关位。