在我的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()
的行为也相同。
但是我的要求是确定用户所在的当前窗口/视图。
我做错什么了吗,还是有其他方法从后台线程获取当前窗口的调度程序?
答案 0 :(得分:1)
我认为,没有一种直接的方法可以从外部-后台线程知道哪个窗口(视图)是焦点窗口。
但是,每个窗口(视图)都可以通过Window.Current.CoreWindow.Activated
事件知道它。就我而言,我已经实现了脏代码来设置/清除显示“我已激活/已停用!”的标志。在窗口(视图)内,并从外部对其进行检查。这种方法效果很好。
答案 1 :(得分:1)
最好的解决方案是将两者分离,并使用后台线程中的事件。这样,任何希望显示信息的前台窗口都可以订阅该事件,并且后台线程不需要知道哪个线程处于活动状态等,也不必担心要哪个线程运行。将呼叫调度到(订阅该事件的窗口)可以使用自己的Dispatcher
自己进行调度。