2012-06-21 23 views
0

在我的项目中,我有一个打开第二个窗口的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事件?

谢谢!

+0

你可以直接调用DispatcherTimer上的Stop()方法,并确保它在关闭窗口之前处理? – EkoostikMartin

+0

这将工作,但我不知道如何捕捉具有计时器的页面内的窗口关闭事件...(另外,导航服务中的页面是在运行时创建的,所以我真的没有办法访问他们从第二个窗口导航服务启动后) – zzMzz

+0

需要查看代码,特别是“第二个窗口”的代码和导航服务的相关位。 – EkoostikMartin

回答

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,否则这似乎是有意义的。

谢谢!

相关问题