Как получить текущий вид моего приложения UWP из фонового потока? - PullRequest
0 голосов
/ 04 октября 2018

В моем приложении UWP, когда успешный пост-звонок, мне нужно показать уведомление пользователю.Это уведомление должно отображаться в текущем окне, в котором находится пользователь.Я узнаю об успехе почтового звонка только в фоновом режиме.Поэтому, как только я получаю код успеха от сервера, мне нужно определить, какое окно является текущим, и я должен отобразить уведомление для пользователя в этом окне.

Window.Current дает мне ноль при доступе из фонового потока.

Если я пытаюсь получить доступ к Window.Current в CoreApplication.MainView.Dispatcher.RunAsync, это дает мне главное окно.

Если я пытаюсь получить доступ к CoreApplication.GetCurrentView().CoreWindow.Dispatcher из фонового потока, CoreApplication.GetCurrentView() выдаетниже исключения

Exception = {System.Runtime.InteropServices.COMException (0x80070490): Element not found.

    Element not found.

    at Windows.ApplicationModel.Core.CoreApplication.GetCurrentView()

Я провел небольшой цикл анализа, чтобы выяснить, что происходит с приведенным ниже фрагментом кода.

        foreach (var iteratingview in CoreApplication.Views)
        {
            iteratingview.Dispatcher.RunOnUIThread(() =>
            {
                int id = ApplicationView.GetForCurrentView().Id;
                bool main = CoreApplication.GetCurrentView().IsMain;
                bool isMain = iteratingview.IsMain;
            });
        }

Логическое значение CoreApplication.GetCurrentView().IsMain дает мне trueкогда iteratingview является основным видом и false, когда iteratingview является вторичным представлением, что означает, что CoreApplication.GetCurrentView() возвращает мне представление, в каком диспетчере я его называю.ApplicationView.GetForCurrentView() также ведет себя точно так же.

Но мое требование - определить, какое окно / представление является текущим, где находится пользователь.

Я что-то не так делаю или естьДругой способ получить диспетчер текущего окна из фонового потока?

Ответы [ 2 ]

0 голосов
/ 22 октября 2018

Лучшее решение состоит в том, чтобы отделить два и использовать событие из вашего фонового потока.Таким образом, любые окна переднего плана, которые хотят отобразить информацию, могут подписаться на событие, и фоновый поток не должен знать ничего о том, какой из них активен и т. Д., А также не должен беспокоиться о том, какой потокотправить вызов в (окно (окна), которые подписываются на событие, могут тривиально выполнить диспетчеризацию самостоятельно со своими Dispatcher.

0 голосов
/ 05 октября 2018

Я считаю, что не существует простого способа узнать, какое окно (представление) является сфокусированным, с внешней стороны - фоновой нитью.Но каждое окно (представление) может знать это по событию Window.Current.CoreWindow.Activated.В моем случае я реализовал грязный код для установки / сброса флажка, который показывает «Я активирован / деактивирован!»внутри окна (вид) и проверил его снаружи.Этот способ работал хорошо.

...