如何从后台线程获取我的 UWP 应用程序的当前视图?

How to get the current view of my UWP app from background thread?

在我的 UWP 应用程序中,当 post 调用成功时,我需要向用户显示通知。此通知必须显示在用户所在的当前 window 中。我只会在后台线程中了解 post 调用是否成功。因此,一旦我从服务器收到成功代码,我需要确定哪个是当前 window 并且我必须在 window.

中向用户显示通知

Window.Current 从后台线程访问时给我 null。

如果我尝试在 CoreApplication.MainView.Dispatcher.RunAsync 中访问 Window.Current 它会给我主要的 window.

如果我尝试从后台线程访问 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().IsMainiteratingview 是主视图时给我 truefalseiteratingview 是辅助视图时,这意味着CoreApplication.GetCurrentView() returns 我正在调用哪个调度程序的视图。 ApplicationView.GetForCurrentView() 也有同样的行为方式。

但我的要求是识别当前window/view用户所在的位置。

我是不是做错了什么,或者是否有任何其他方法可以从后台线程获取当前 window 的调度程序?

我认为没有直接的方法可以从外部 - 后台线程知道哪个 window(view) 是焦点。 但是,每个 window(view) 都可以通过 Window.Current.CoreWindow.Activated 事件知道它。在我的例子中,我已经将脏代码实现到 set/clear 在 window(view) 中显示 "I'm activated / deactivated!" 的标志,并从外部检查它。这种方式效果很好。

最好的解决方案是将两者分离并使用后台线程中的事件。这样,任何想要显示信息的前台 window(s) 都可以订阅该事件,后台线程不需要知道哪个是活动的等等,也不必担心关于将调用分派到哪个线程(订阅事件的 window(s) 可以用自己的 Dispatcher.

简单地自己分派