Как автоматически регистрировать представления в Xamarin.Forms с помощью Prism

В Xamarin.Forms с Prism и Unity есть способ зарегистрировать все представления, которые подлежат навигации, без их явного указания?

Пример проекта, предоставленный Prism, имеет функцию RegisterTypes в App.xaml.cs, которая имеет следующую строку:

Container.RegisterTypeForNavigation<MainPage>();

Я ожидаю, что на каком-то этапе разработки приложения это будет намного больше.

Я не являюсь экспертом в Unity, но я безуспешно пытался использовать DependencyService или IUnityContainer.

Container.Registrations.Where(cm => cm.RegisteredType == typeof (IView));
Container.ResolveAll<IView>();
DependencyService.Get<IEnumerable<IView>>();

Итак, как мне зарегистрировать все представления (или, по крайней мере, подмножество представлений, которые, например, реализуют данный интерфейс) для навигации?


person Frank    schedule 04.05.2016    source источник


Ответы (1)


С помощью крошечных отражений вы можете зарегистрировать все типы основной сборки, унаследованные от Page.

public class Bootstrapper : UnityBootstrapper
{
    protected override void OnInitialized()
    {
        NavigationService.Navigate("MainPage");
    }

    protected override void RegisterTypes()
    {
        RegisterAllPages();
    }

    private void RegisterAllPages()
    {
        var pageBaseTypeInfo = typeof(Page).GetTypeInfo();
        var types = GetType().GetTypeInfo().Assembly.DefinedTypes;
        var pageTypeInfos = types
                        .Where(x => x.IsClass && pageBaseTypeInfo.IsAssignableFrom(x));

        foreach (var page in pageTypeInfos)
        {
            // the next two lines do what RegisterTypeForNavigation does
            Container.RegisterType(typeof(object), page.AsType(), page.Name);
            PageNavigationRegistry.Register(page.Name, page.AsType());
        }
    }
} 
person Sven-Michael Stübe    schedule 04.05.2016