我希望改进我在Xamarin.Forms.中开发的移动应用程序
我的功能如下:在应用程序的恢复上,我想重新加载用户所在的页面。
目前,我使用MessagingCenter操作以下代码。
不幸的是,我的应用程序开始有很多页面,而且可读性不高了。
因此,我希望将我的类型(viewModel(作为导航服务的参数——我的研究将我引向反射的概念,但我不知道我的问题是否可以实现。
// App.xaml.cs
protected override void OnResume()
{
// Handle when your app resumes
Page currPage = ((NavigationPage)((MasterDetailPage)Application.Current.MainPage).Detail).CurrentPage;
MessagingCenter.Send<App, Page>(this, "Hi", currPage);
}
然后在我的BaseViewModel中:
// BaseViewModel.cs
public ViewModelBase()
{
DialogService = ViewModelLocator.Instance.Resolve<IDialogService>();
NavigationService = ViewModelLocator.Instance.Resolve<INavigationService>();
AuthenticationService = ViewModelLocator.Instance.Resolve<IAuthenticationService>();
MessagingCenter.Subscribe<App, Page>(this, "Hi", async (sender, arg) =>
{
// Do something whenever the "Hi" message is received
Type viewModel = NavigationService.GetViewModelTypeForPage(arg.GetType());
if(viewModel == typeof(AboutViewModel))
{
Debug.WriteLine("AboutViewModel");
await NavigationService.NavigateToAsync<AboutViewModel>();
return;
}
if (viewModel == typeof(CardViewModel))
{
Debug.WriteLine("CardViewModel");
await NavigationService.NavigateToAsync<CardViewModel>();
return;
}
...
});
}
我会给您一些关于如何在使用MessagingCenter
时使代码可读的想法。
首先,您可以有一个实现MessagingCenter.Subscribe
的BasePage和一个称为loadData
:的方法
public partial class BasePage : ContentPage
{
public BasePage()
{
MessagingCenter.Subscribe<App, string>(this, "Hi", (sender, arg) =>
{
// Do something whenever the "Hi" message is received
loadData();
});
}
public virtual void loadData()
{
}
}
然后,当您创建一个新页面,需要在应用程序恢复时刷新时,您可以使该页面继承自BasePage
类型:
public partial class MainPage : BasePage
{
public MainPage()
{
InitializeComponent();
loadData();
}
public override void loadData()
{
base.loadData();
Console.WriteLine("loadData");
}
}
xaml:
<?xml version="1.0" encoding="utf-8" ?>
<bases:BasePage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:d="http://xamarin.com/schemas/2014/forms/design"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:bases="clr-namespace:App52"
mc:Ignorable="d"
x:Class="App52.MainPage">
</bases:BasePage>
因此,您不必在每个页面中实现MessagingCenter.Subscribe
,这些可以在BasePage
中进行管理。
我不熟悉reflection
,所以可能无法通过reflection
帮助您实现这一点。希望这能有所帮助。