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

时间:2018-10-04 13:37:38

标签: uwp windows-10-universal

在我的UWP应用中,当邮递成功后,我需要向用户显示通知。该通知必须显示在用户所在的当前窗口中。我将仅在后台线程中了解post调用的成功。因此,一旦我从服务器收到成功代码,就需要确定哪个是当前窗口,并且必须在该窗口中向用户显示通知。

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给了我{{1} 1}}向我返回我在其中调用调度程序的视图。 CoreApplication.GetCurrentView()的行为也相同。

但是我的要求是确定用户所在的当前窗口/视图。

我做错什么了吗,还是有其他方法从后台线程获取当前窗口的调度程序?

2 个答案:

答案 0 :(得分:1)

我认为,没有一种直接的方法可以从外部-后台线程知道哪个窗口(视图)是焦点窗口。 但是,每个窗口(视图)都可以通过Window.Current.CoreWindow.Activated事件知道它。就我而言,我已经实现了脏代码来设置/清除显示“我已激活/已停用!”的标志。在窗口(视图)内,并从外部对其进行检查。这种方法效果很好。

答案 1 :(得分:1)

最好的解决方案是将两者分离,并使用后台线程中的事件。这样,任何希望显示信息的前台窗口都可以订阅该事件,并且后台线程不需要知道哪个线程处于活动状态等,也不必担心要哪个线程运行。将呼叫调度到(订阅该事件的窗口)可以使用自己的Dispatcher自己进行调度。