Xamarin.Forms如何显示互联网连接?

时间:2017-08-30 12:32:30

标签: android ios xamarin xamarin.android xamarin.forms

我的应用程序的结构:

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来 WATCH进行互联网连接更改。

当应用程序启动时,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");


我已经尝试在提供的Documentation的帮助下找出正确的实施方案。
不幸的是,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中添加了一些内容?

或者更确切地说是一个详细页面?

或者在每个细节页面?

请不要以为我没有谷歌。因为我做了,并且每个人似乎对如何调味基本的Montemagno食谱有不同的看法,这非常令人困惑。

有人可以提供最简单,最干净的方法吗?没有什么特别的,只是消息框告诉用户连接的变化。

非常感谢帮助。
谢谢大家。

1 个答案:

答案 0 :(得分:2)

假设您的应用程序中有十几页。在所有这些中都有连接代码是没有意义的。订阅事件的更好地方是App.xaml.cs方法中的OnStart(也可能在构造函数中)。这就是我在其中一个项目中所拥有的:

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

MessagingService来自James Montemagno的Xamarin.Forms工具包,但您也可以使用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都会处理该事件,并向MasterDetailPage收到的MessagingService发送一条消息,该消息会对其作出反应。

编辑2 :将其放入App.xaml.cs,这样只有在应用启动时才会检查连接。

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

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