Fork me on GitHub

UWP 在ShellPage.xaml.cs 中导航至其他页面引发System.Exception

最近有一个需求,需要App监测网络变化,并在网络变化的同时用户,你切网啦,并且导航至一个切网的特定页面。

和Android、iOS的小伙伴后共同发现,人家有一个类似”拦截器“的框架,可以拦截App发出的请求,并返回一个特定的操作。

而之前在C#网络请求的时候,我们的Http Client要么返回完整的data数据,要么null。而没有第三种情况。他们的拦截器可以返回第N中操作。

 

 

 

经过一顿操作猛于虎的查找资料,并没有找到类似C#的网络请求框架。

但是C#中的委托应该可以实现我的需求。

不过我对委托不熟悉,而且使用委托的话,对现在App中的所有Api都会有影响,改动范围大。所以就搁置了这种想法。

 

后来仔细分析了一下,既然用户手动触发切换网络的操作,那么App是不是能注册一个网络变化的事件,然后等网络一变,App就立马收到通知呢?

 

答案是肯定的。

 

Uwp中提供了 NetworkInformation.NetworkStatusChanged Event

后来我在WindowsCommunityToolkit也发现中微软写的NetworkHelper,有一个也是同样的方法。

 

这样一来,我们就需要在ShellPage中注册一下即可。

在ShellPage初始化的时候加入

        public ShellPage()
        {
            InitializeComponent();
            
            NetworkHelper.Instance.NetworkChanged += Instance_NetworkChanged;
        }
private async void Instance_NetworkChanged(object sender, EventArgs e)
{
shellFrame.Navigate(typeof(Extras.AreaChangedPage)); }

 

 

不过你要是直接运行上面的代码,App可以正常检测到网络变化,并且执行NetWorkChanged事件里面的代码。

但是在导航至页面的时候,会报错System.Exception

这是因为在执行页面跳转操作的时候,需要UI线程支持。

但是ShellPage不属于UI线程里面的,所以需要Dispatcher.RunAsync

await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
{
       shellFrame.Navigate(typeof(Extras.AreaChangedPage));
});

 

posted @ 2019-06-15 16:23  猫叔Vincent  阅读(242)  评论(0编辑  收藏  举报