繁体   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