0

私のプロジェクトには、2番目のウィンドウを開くメインウィンドウがあります。2番目のウィンドウ内にフレームがあり、フレーム内でナビゲーションサービスを開始します。また、2番目のウィンドウには、ユーザーがEscapeキーを押したときにMe.Closeを呼び出すKeyDownメソッドがあります。とにかく、2番目のウィンドウが閉じても、ナビゲーションサービスのページの1つにあるSystem.Windows.Threading.DispatcherTimer()は終了しません。2番目のウィンドウを閉じてnavigationservice内のDispatcherTimerを終了する方法についてのアイデアはありますか?

ありがとうマイク

ps誰かが私が持っているものを見たい場合は、ソースコードを提供できます...


(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

そして、2番目のウィンドウにはこれがあります:

  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」を押すと、実際には2つの「ExitPage」ポップアップが表示されます)

ただし、問題があります。フォーカスをテキストボックスまたはコンボボックスに移動しない限り、ページはKeyDownイベントを取得しないようです。これを行わない場合、「Esc」キーを押すと、2番目のウィンドウのWindow_KeyDownが呼び出されます。ページのKeyDownイベント。これは、2番目のウィンドウが閉じられた後でもページのタイマーが停止しないことを意味します。ページの読み込み時にページのフォーカスを取得して、手動でフォーカスをページのコントロールに変更せずにKeyDownイベントを取得できるようにする方法を知っている人はいますか?

ありがとう!

4

1 に答える 1

0

わかりました-回避策によって、この状況を最終的に解決しました。2番目のウィンドウで、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

次に、2番目のウィンドウでキーイベントをキャプチャします。これは、2番目のウィンドウのメソッドです。

 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メソッドのどちらも必要ありません。これは、信頼性の低い動作をしていたためです。(上記の回答を参照)

それで、あなたはどう思いますか?2番目のウィンドウを取得する方法や、ページでnullをチェックする方法については完全にはわかりませんが、それ以外の場合は、これは理にかなっているようです。

ありがとう!

于 2012-06-22T17:27:58.837 に答える