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));
});

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章