簡體   English   中英

Xamarin.Forms如何顯示Internet連接已更改?

[英]Xamarin.Forms how display internet connection CHANGED?

我的應用程序的結構:

public partial class App : Application
  {

    public App()
    {
      InitializeComponent();

      MainPage = new MdpMainPage();
    }

MdpMainPage是一個MasterDetailPage:

<MasterDetailPage.Detail>
    <NavigationPage>
        <x:Arguments>
            <pages:HomePage />
        </x:Arguments>
    </NavigationPage>
</MasterDetailPage.Detail>

我的主頁是一個CarouselPage,它包含三個類型為ContentPage的頁面。

<CarouselPage>
    ...some namespaces...
    <CarouselPage.Children>
        <pages:HomePageA />
        <pages:HomePageB />
        <pages:HomePageC />
    </CarouselPage.Children>
</CarouselPage>

我想使用JamesMontemagno的ConnectivityPlugin來監視Internet連接的更改

當應用程序啟動時, DisplayAlert框應彈出,並告訴我們:

DisplayAlert("Internet connection found.", "Wait for the application data to update.", "OK");

...要么...

DisplayAlert("No internet connection found.", "Application data may not be up to date. Connect to a working network.", "OK");


如果在應用程序的開始處存在互聯網連接,並且在使用該應用程序時丟失了 互聯網連接,則應彈出另一個消息框,提示:

DisplayAlert("Internet connection lost.", "Application data may not be up to date. Connect to a working network.", "OK");


如果應用程序啟動時沒有互聯網連接,並且以后又以某種方式成功連接了設備 ,則應該出現第一個提到的消息框:

DisplayAlert("Internet connection found.", "Wait for the application data to update.", "OK");


我已嘗試在提供的文檔的幫助下找出正確的實現方式。
不幸的是,James Montemagno並沒有詳細解釋如何使用ConnectivityPlugin,因此像我這樣的初學者往往會感到困惑。

我知道我應該使用以下代碼段:

/// <summary>
/// Event handler when connection changes
/// </summary>
event ConnectivityChangedEventHandler ConnectivityChanged; 


public class ConnectivityChangedEventArgs : EventArgs
{
  public bool IsConnected { get; set; }
}

public delegate void ConnectivityChangedEventHandler(object sender, ConnectivityChangedEventArgs e);

CrossConnectivity.Current.ConnectivityChanged += async (sender, args) =>
{
  Debug.WriteLine($"Connectivity changed to {args.IsConnected}");
};

...但我不知道將它們放在哪里

我已經嘗試了幾種組合,但到目前為止都無濟於事。

我是否將某些內容放入App.xaml中,並將某些內容放入MasterDetailPage中?

還是“詳細信息”頁面之一?

還是在每個詳細信息頁面中?

請不要以為我沒有在Google周圍搜索。 因為我這樣做了,而且每個人似乎對如何調味基本的蒙泰瑪諾配方都持不同意見,這非常令人困惑。

有人可以提供最簡單,最干凈的方法來實現這一點嗎? 真的沒什么好想的,只是消息框通知用戶連接性的變化。

幫助將不勝感激。
謝謝你們。

假設您的應用程序中有十二個頁面。 在所有這些代碼中都沒有連接代碼是沒有意義的。 更好地訂閱事件的地方是OnStart方法中的App.xaml.cs (也可以在構造函數中)。 這是我在其中一個項目中擁有的:

protected override void OnStart()
{
    CrossConnectivity.Current.ConnectivityChanged += (sender, args) =>
    {
        MessagingService.Current.SendMessage("connectivityChanged", args.IsConnected);
    };
}

MessagingService來自James Montemagno的Xamarin.Forms Toolkit,但您也可以使用Xamarin的Messaging Center

然后,在那些希望訂閱此連接更改消息的頁面的每個ViewModel上,將像這樣訂閱它:

MessagingService.Current.Subscribe ("connectivityChanged", async (e) => 
{
    //Show a dialog or something to inform about the connectivity change.
});

這樣,您將使所有事物分離。


編輯:我剛剛注意到您可能正在尋找從頁面后面的代碼中顯示警報。 您可以像這樣在MasterDetailPage上訂閱事件:

public class MainPageCS : MasterDetailPage
{
    public MainPageCS() 
    {
        MessagingService.Current.Subscribe<bool>("connectivityChanged", (args, connected) =>
        {
            if (connected)
                DisplayAlert("Internet connection found.", "Wait for the application data to update.", "OK");
            else
                DisplayAlert("Internet connection lost.", "Application data may not be up to date. Connect to a working network.", "OK");
        });
    }
}

每當連接更改時,您的App.xaml.cs都會處理該事件,並將消息發送到MessagingService ,由MasterDetailPage接收並對其進行響應。

編輯2:將其放入您的App.xaml.cs以便僅在應用啟動時檢查連接。

protected override void OnStart()
{
    Device.BeginInvokeOnMainThread(async () =>
    {
        var isConnected = CrossConnectivity.Current.IsConnected;

        await MainPage.DisplayAlert("Connection", $"Connected {isConnected}", "OK");
    });
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM