Caliburn.Micro 3.0 (ve Caliburn.Micro.Xamarin.Forms), Xamarin.Forms içindeki Navigation.PushModalAsync
mimic/support işlevini yerine getiriyor mu?Caliburn.Micro 3.0 Xamarin'e eşdeğerdir.Forms Navigation.PushModalAsync
cevap
Hayır. Bu yerleşik değildir, ancak onu geliştirmek kolaydır. Genellikle MvvM çerçeveleri ViewModels tarafından geziniyor. Kaliburn bu modeli takip ediyor. Yani bir çeşit navigasyon servisine ihtiyacı var. Bu gezinme servisi ViewModels için Görünümler oluşturma ve görünüm çerçevesini (bizim durumumuzdaki Xamarin.Froms) belirli gezinme işlevlerini çağırmaktan sorumludur. NavigationPageAdapter
, aradığımız şey. Şimdi onu geliştirelim.
public interface IModalNavigationService : INavigationService
{
Task NavigateModalToViewModelAsync<TViewModel>(object parameter = null, bool animated = true);
// TODO: add more functions for closing
}
public class ModalNavigationPageAdapter : NavigationPageAdapter, IModalNavigationService
{
private readonly NavigationPage _navigationPage;
public ModalNavigationPageAdapter(NavigationPage navigationPage) : base(navigationPage)
{
_navigationPage = navigationPage;
}
public async Task NavigateModalToViewModelAsync<TViewModel>(object parameter = null, bool animated = true)
{
var view = ViewLocator.LocateForModelType(typeof(TViewModel), null, null);
await PushModalAsync(view, parameter, animated);
}
private Task PushModalAsync(Element view, object parameter, bool animated)
{
var page = view as Page;
if (page == null)
throw new NotSupportedException(String.Format("{0} does not inherit from {1}.", view.GetType(), typeof(Page)));
var viewModel = ViewModelLocator.LocateForView(view);
if (viewModel != null)
{
TryInjectParameters(viewModel, parameter);
ViewModelBinder.Bind(viewModel, view, null);
}
page.Appearing += (s, e) => ActivateView(page);
page.Disappearing += (s, e) => DeactivateView(page);
return _navigationPage.Navigation.PushModalAsync(page, animated);
}
private static void DeactivateView(BindableObject view)
{
if (view == null)
return;
var deactivate = view.BindingContext as IDeactivate;
if (deactivate != null)
{
deactivate.Deactivate(false);
}
}
private static void ActivateView(BindableObject view)
{
if (view == null)
return;
var activator = view.BindingContext as IActivate;
if (activator != null)
{
activator.Activate();
}
}
}
Biz sadece
INavigationService
uzanır ve bizim
ModalNavigationPageAdapter
bunu uygulamak arayüzünü
IModalNavigationService
ilan etti. Ne yazık ki Caliburn, bir çok fonksiyonu özel hale getirdi, bu yüzden bunları kalıtım sürümüne kopyalamamız gerekiyor.
Kalibrede navigationservice.For<VM>().Navigate()
üzerinden gezinebilirsiniz. Bu stili takip etmek istiyoruz, bu yüzden bir uzantı yönteminde yaptığımız navigationservice.ModalFor<VM>().Navigate()
gibi bir şeyi uygulamak zorundayız.
public static class ModalNavigationExtensions
{
public static ModalNavigateHelper<TViewModel> ModalFor<TViewModel>(this IModalNavigationService navigationService)
{
return new ModalNavigateHelper<TViewModel>().AttachTo(navigationService);
}
}
Bu yöntem (Caliburn en NavigateHelper
benzer) bizim navigasyon hizmetin kullanımını basitleştiren bir ModalNavigateHelper
döndürür. Neredeyse bir kopya, ancak IModalNavigationService
için.
public class ModalNavigateHelper<TViewModel>
{
readonly Dictionary<string, object> parameters = new Dictionary<string, object>();
IModalNavigationService navigationService;
public ModalNavigateHelper<TViewModel> WithParam<TValue>(Expression<Func<TViewModel, TValue>> property, TValue value)
{
if (value is ValueType || !ReferenceEquals(null, value))
{
parameters[property.GetMemberInfo().Name] = value;
}
return this;
}
public ModalNavigateHelper<TViewModel> AttachTo(IModalNavigationService navigationService)
{
this.navigationService = navigationService;
return this;
}
public void Navigate(bool animated = true)
{
if (navigationService == null)
{
throw new InvalidOperationException("Cannot navigate without attaching an INavigationService. Call AttachTo first.");
}
navigationService.NavigateModalToViewModelAsync<TViewModel>(parameters, animated);
}
}
Son fakat en önemlisi, yeni yerine parlak yeni gezinme servisimizi kullanmak zorundayız. App
sınıfı, için NavigationPageAdapter
kayıtlarını PrepareViewFirst
'da tekil olarak kaydediyor. Biz INavigationService
ve IModalNavigationService
yönelik navigasyon servisi kaydettirdiğinizin
public class App : FormsApplication
{
private readonly SimpleContainer container;
public App(SimpleContainer container)
{
this.container = container;
container
.PerRequest<LoginViewModel>()
.PerRequest<FeaturesViewModel>();
Initialize();
DisplayRootView<LoginView>();
}
protected override void PrepareViewFirst(NavigationPage navigationPage)
{
var navigationService = new ModalNavigationPageAdapter(navigationPage);
container.Instance<INavigationService>(navigationService);
container.Instance<IModalNavigationService>(navigationService);
}
}
aşağıdaki gibi değiştirmek zorunda.
Açıklamada gördüğünüz gibi, PopModalAsync
numaralı telefonu arayarak yakın işlevleri uygulamanız gerekir.
- 1. Caliburn.Micro 3.0 ve Xamarin.Forms
- 2. İlk pencere boyutunu Caliburn.micro
- 3. Caliburn.Micro ile Doğrulama
- 4. Caliburn.Micro & Telerik WPF Kontrolleri
- 5. Caliburn.Micro ve MEF on wpf
- 6. Caliburn.Micro: Farklı Projelerde Görünümler ve Önyükleyici
- 7. Bağlama Seçimi Caliburn.Micro kullanarak ViewModel için değiştirildiMikro
- 8. GCM 3.0
- 9. R 3.0
- 10. Symfony 3.0
- 11. Caliburn.Micro. Otomatik olarak yazarlar böyle bir olasılık söz <strong>Caliburn.Micro</strong> belgelerinde AutoFac
- 12. Tesseract traineddata sürüm 3.0 kullanılarak Swift 3.0 projesinde çalışmıyor
- 13. Caliburn.Micro sözleşmesi tabanlı bağlamalar iç içe geçmiş görünümlerde çalışmıyor mu?
- 14. Caliburn.Micro ile Xamarin Forms uygulamasındaki gezinti çubuğunu kaldır.Micro
- 15. C# wpf caliburn.Micro MahApps HamburgerMenu.ContentTemplate veri bağlama çalışmıyor
- 16. Konvansiyonel bir Caliburn.Micro bağlayıcısına nasıl bir ValueConverter uygularsınız?
- 17. Servlet 3.0: @WebServletContextListener nerede?
- 18. Yavaş animasyon 3.0
- 19. Bir örneğin ActionScript 3.0
- 20. kullanma tarihleri 3.0
- 21. Netbeans'de Grails 3.0 desteği
- 22. Guice 3.0 - Başlangıçta ArrayIndexOutOfBoundsException?
- 23. AFNetworking 3.0 setSharedImageCache eksik
- 24. ASP 3.0 Uygulama nesnesi
- 25. Node.js 'de Express 3.0
- 26. Capistrano 3.0 dosya transferleri?
- 27. Android 3.0 ve üstü
- 28. iPhone 3.0 OS
- 29. hata: libopencv_core.so.3.0
- 30. MailChimp API 3.0