private Func <Task <(Action on, Action off, object value)> > ParseCollection(Type type,
                                                                                     XNodeInfo xinfo, PageObject page, ParseInfo parseInfo)
        {
            Log.Information("PARSE ELEMENT {name} as ICollection or IEnumerable", xinfo.Name);

            var createObject = CreateInstance(xinfo, type, out ParseInfo createInfo);

            var pinfo = parseInfo.Merge(createInfo);

            var createProperty = ParseElementProperty(xinfo, page, type, pinfo);

            List <(XNodeInfo xinfo, Func <Task <(Action on, Action off, object value)> > res)> items =
                xinfo.Elements.Value.Select(v => (v, ParseElement(v, page, pinfo))).ToList( );

            return(async( ) =>
            {
                var collection = createObject( );

                var res1 = await createProperty(collection);

                (Action on, Action off)res2 = default;

                items.ForEach(async v =>
                {
                    var resLoc = res2;
                    var res = await v.res.Invoke( );

                    var action = FindAddMethod(collection, res.value.GetType( ), v.xinfo);
                    if (action != null)
                    {
                        res2 = (JoinAction(resLoc.on, res.on), JoinAction(resLoc.off, res.off));

                        if (collection is ResourceDictionary && v.xinfo.XamlKey != null)
                        {
                            page.ResourceDictionary.Add(v.xinfo.XamlKey, res.value);
                        }

                        action.Invoke(res.value);
                    }
                });

                return (JoinAction(res1.on, res2.on), JoinAction(res1.off, res2.off), collection);
            });
        }
Ejemplo n.º 2
0
        private Func <Task <(Action on, Action off, object value)> > ParseLayoutView(Type type,
                                                                                     XNodeInfo xinfo, PageObject page, ParseInfo parseInfo)
        {
            Log.Information("PARSE ELEMENT {name} as ILayoutController", xinfo.Name);

            var createObject = CreateInstance(xinfo, type, out ParseInfo createInfo);

            var pinfo = parseInfo.Merge(createInfo);

            Func <Layout <View>, Task <(Action on, Action off)> > createElement = (layout) => DefaultTask2Action;

            foreach (var child in xinfo.Elements.Value)
            {
                var res       = ParseElement(child, page, pinfo);
                var locCreate = createElement;

                createElement = async(layout) =>
                {
                    var res1 = await locCreate.Invoke(layout);

                    var res2 = await res.Invoke( );

                    if (res2.value != null)
                    {
                        layout.Children.Add(res2.value as View);
                    }

                    return(JoinAction(res1.on, res2.on), JoinAction(res1.off, res2.off));
                };
            }

            var createProperty = ParseElementProperty(xinfo, page, type, pinfo);

            return(async( ) =>
            {
                var layout = createObject( ) as Layout <View>;

                var res1 = await createProperty(layout);

                var res2 = await createElement(layout);

                return (JoinAction(res1.on, res2.on), JoinAction(res1.off, res2.off), layout);
            });
        }
Ejemplo n.º 3
0
 //Implemented only for non template xaml
 private bool ParseFocused(Type elementType, XNodeInfo xinfo, ParseInfo parseInfo,
                           PageObject page, out Func <object, Task <(Action on, Action off)> > result)