• 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));
    });
  • 相关阅读:
    fatal: unable to auto-detect email address (got 'tim@newton.(none)')的解决方法
    使用git命令提示“不是内部或外部命令
    Windows系统下安装 CMake
    php与mysql的连接
    array_merge和加号的区别
    可重入锁的实现
    redis scan
    redis主丛,哨兵和集群的区别
    高并发架构系列:Redis并发竞争key的解决方案详解
    laravel上传图片
  • 原文地址:https://www.cnblogs.com/hupo376787/p/11678470.html
Copyright © 2020-2023  润新知