【问题标题】:How to get the current view of my UWP app from background thread?如何从后台线程获取我的 UWP 应用程序的当前视图?
【发布时间】:2019-03-09 22:21:45
【问题描述】:

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

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

如果我尝试在CoreApplication.MainView.Dispatcher.RunAsync 中访问Window.Current,它会给我主窗口。

如果我尝试从后台线程访问CoreApplication.GetCurrentView().CoreWindow.DispatcherCoreApplication.GetCurrentView() 会抛出以下异常

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

    Element not found.

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

我做了一小轮分析,以了解以下代码 sn-p 发生了什么。

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

iteratingview 是主视图时,布尔值CoreApplication.GetCurrentView().IsMain 给我true,当iteratingview 是辅助视图时,false 给我,这意味着CoreApplication.GetCurrentView() 给我返回我在哪个调度程序里面的视图我叫它。 ApplicationView.GetForCurrentView() 的行为方式也相同。

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

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

【问题讨论】:

    标签: uwp windows-10-universal


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-05-16
        • 2017-09-02
        • 1970-01-01
        • 2019-03-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-07
        相关资源
        最近更新 更多