2017-08-30 106 views
1

结构:Xamarin.Forms如何显示互联网连接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到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
不幸的是,詹姆斯蒙特马格诺不打扰详细解释如何使用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中放置了一些?

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

或者在每个详细页面中?

请不要以为我没有谷歌周围。因为我做了,每个人似乎都对如何调味基本的蒙特马格诺食谱有不同的意见,这很混乱。

有人可以提供最简单,最干净的方式来实现这个?没有什么奇特的东西,只是消息框告知用户连接的变化。

帮助将不胜感激。
谢谢大家。

回答

2

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

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

MessagingService是詹姆斯Montemagno的Xamarin.Forms工具包,但你也可以使用Xamarin的Messaging Center

然后,对想订阅的连接变化的这条消息将订阅像这样这些页面的每个视图模型:

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"); 
    }); 
} 
+0

我下载Montemagno的工具包。我将你的第一个片段放到App.xaml.cs中放入OnStart方法中。我把你的第三个片段放到我的MdpMainPage.xaml.cs中(顺便说一句,它也可以用作汉堡菜单)。我发现了一个奇怪的错误 - 在e.IsConnected是强调用红色波浪 - IMessaging服务不包含定义IsConnected ...等。有任何想法吗? – PaxForce

+0

@PaxForce它工作吗? – hankide

+0

@PaxForce检查我的最新编辑,现在应该没问题。 – hankide

相关问题