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); }); }
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); }); }
//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)