Exemple #1
0
        //TODO This route matching could be better. Can we use the ASPNEt version?
        private void FindRoutes()
        {
            var assembly = XF.Application.Current.GetType().Assembly;
            var pages    = assembly.GetTypes().Where(x => x.GetCustomAttributes <RouteAttribute>().Any());//TODO: Could this be more efficient if it only looked for classes that are razor components? Or maybe thats an extra step that would slow things down. Profiler required.

            foreach (var page in pages)
            {
                //Find each @page on a page. There can be multiple.
                var routes = page.GetCustomAttributes <RouteAttribute>();
                foreach (var route in routes)
                {
                    if (page.IsSubclassOf(typeof(ComponentBase)))
                    {
                        var structuredRoute = new StructuredRoute(route.Template, page);

                        //Register with XamarinForms so it can handle Navigation.
                        var routeFactory = new MBBRouteFactory(page, this);
                        XF.Routing.RegisterRoute(structuredRoute.BaseUri, routeFactory);

                        //Also register route in our own list for setting parameters and tracking if it is registered;
                        Routes.Add(structuredRoute);
                        RouteFactories[structuredRoute.BaseUri] = routeFactory;
                    }
                    else
                    {
                        throw new NotImplementedException($"Page directive is invalid on type: {page} because it does not inherit from ComponentBase. Only Components can be used for page routing.");
                    }
                }
            }
        }
Exemple #2
0
#pragma warning disable CA1054 // Uri parameters should not be strings
        public async Task NavigateToAsync(string uri)
#pragma warning restore CA1054 // Uri parameters should not be strings
        {
            if (uri is null)
            {
                throw new ArgumentNullException(nameof(uri));
            }

            var route = StructuredRoute.FindBestMatch(uri, Routes);

            if (route != null)
            {
                NavigationParameters[route.Route.Type] = route;
                if (!RouteFactories.TryGetValue(route.Route.BaseUri, out var routeFactory))
                {
                    throw new InvalidOperationException($"A route factory for URI '{uri}' could not be found. It should have been registered automatically in the {nameof(ShellNavigationManager)} constructor.");
                }
                await routeFactory.CreateAsync().ConfigureAwait(true);

                await XF.Shell.Current.GoToAsync(route.Route.BaseUri).ConfigureAwait(false);
            }
            else
            {
                throw new InvalidOperationException($"The route '{uri}' is not registered. Register page routes using the '@page' directive in the page.");
            }
        }
Exemple #3
0
        public void OneParameterOriginalUri()
        {
            var uri   = "/home/{StringParameter}";
            var route = new StructuredRoute(uri, typeof(TestComponent));

            Assert.AreEqual(uri, route.OriginalUri);
        }
Exemple #4
0
        public void NoParameterRouteIsOriginalUri()
        {
            var uri   = "/home";
            var route = new StructuredRoute(uri, typeof(TestComponent));

            Assert.AreEqual(uri, route.OriginalUri);
        }
Exemple #5
0
        public void OneParameterKey()
        {
            var key   = "StringParameter";
            var uri   = "/home/{StringParameter}";
            var route = new StructuredRoute(uri, typeof(TestComponent));

            Assert.AreEqual(key, route.ParameterKeys.FirstOrDefault());
        }
Exemple #6
0
        public void OneParameterCount()
        {
            var uri   = "/home/{StringParameter}";
            var route = new StructuredRoute(uri, typeof(TestComponent));

            var expected = 1;

            Assert.AreEqual(expected, route.ParameterCount);
        }
Exemple #7
0
#pragma warning disable CA1054 // Uri parameters should not be strings
        public async Task NavigateToAsync(string uri)
#pragma warning restore CA1054 // Uri parameters should not be strings
        {
            if (uri is null)
            {
                throw new ArgumentNullException(nameof(uri));
            }

            var route = StructuredRoute.FindBestMatch(uri, Routes);

            if (route != null)
            {
                NavigationParameters[route.Route.Type] = route;

                await XF.Shell.Current.GoToAsync(route.Route.BaseUri).ConfigureAwait(false);
            }
            else
            {
                throw new InvalidOperationException($"Cannot find route for Navigation. {uri} is not registered, please register it using an @page directive.");
            }
        }