我的应用程序的结构:
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 来观察互联网连接变化。
应用程序启动时应该弹出 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,所以像我这样的初学者往往会感到困惑。
我知道我应该使用以下代码 fragment :
/// <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 食谱调味都有不同的看法,这非常令人困惑。
有人能提供最简单、最干净的实现方法吗?没什么特别的,只是通知用户连接变化的消息框。
帮助将不胜感激。
谢谢大家。
最佳答案
假设您的应用程序中有十几个页面。在所有这些中都有连接代码是没有意义的。订阅事件的更好位置是 OnStart
方法中的 App.xaml.cs
(也可以在构造函数中)。这是我在其中一个项目中拥有的:
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 就会处理该事件并向 MessagingService
发送消息,MasterDetailPage 会接收该消息并对其作出 react 。
编辑 2:将其放入您的 App.xaml.cs
,以便仅在应用启动时检查连接。
protected override void OnStart()
{
Device.BeginInvokeOnMainThread(async () =>
{
var isConnected = CrossConnectivity.Current.IsConnected;
await MainPage.DisplayAlert("Connection", $"Connected {isConnected}", "OK");
});
}
关于android - Xamarin.Forms 如何显示互联网连接已更改?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45960529/