private RenderTreeFrame[] ParseFragments(RenderTreeBuilder builder, int sequence) { ArrayRange <RenderTreeFrame> frames = builder.GetFrames(); List <Tuple <string, RenderFragment> > parms = new List <Tuple <string, RenderFragment> >(); for (int a = 0; a < frames.Count; a++) { RenderTreeFrame item = frames.Array[a]; if ((item.FrameType == RenderTreeFrameType.Component) && (item.ComponentType.Equals(typeof(ContentProperty)))) { RenderTreeFrame item1 = frames.Array[a + 1]; if ((item1.FrameType == RenderTreeFrameType.Attribute) && (item1.AttributeName == "Name") && (item1.AttributeValue is string propertyName)) { RenderTreeFrame item2 = frames.Array[a + 2]; if ((item2.FrameType == RenderTreeFrameType.Attribute) && (item2.AttributeName == RenderTreeBuilderHelper.ChildContent) && (item2.AttributeValue is RenderFragment splitPartChildContent)) { parms.Add(new Tuple <string, RenderFragment>(propertyName, splitPartChildContent)); } } a += 2; } } RenderTreeFrame[] result = new RenderTreeFrame[parms.Count]; int b = 0; foreach (Tuple <string, RenderFragment> item in parms) { result[b] = RenderTreeFrameHelper.Attribute(sequence + b, item.Item1, item.Item2); b++; } return(result); }
void ReplaceChildContent(ref ParameterView parameters) { RenderTreeFrame[] frames = ParameterCollectionHelper.GetFrames(parameters); int lastContentBlazorComponentPos = -1; int pos = 0; foreach (RenderTreeFrame frame in frames) { if (frame.FrameType == RenderTreeFrameType.Component) { lastContentBlazorComponentPos = typeof(ContentsComponentBase).IsAssignableFrom(frame.ComponentType) ? pos : -1; } else if ((lastContentBlazorComponentPos != -1) && //check we have right component type (frame.FrameType == RenderTreeFrameType.Attribute) && (frame.AttributeName == RenderTreeBuilderHelper.ChildContent) && //we have to replace ChildContent only... (frame.AttributeValue is RenderFragment childContent) && //...of right (RenderFragment) type... (pos > lastContentBlazorComponentPos) && (pos < lastContentBlazorComponentPos + frames[lastContentBlazorComponentPos].ComponentSubtreeLength)) //...and within the component scope { List <RenderTreeFrame> framesEdit = new List <RenderTreeFrame>(frames); //setup new rendering for childContent RenderTreeBuilder rtb = new RenderTreeBuilder(); childContent(rtb); RenderTreeFrame[] newFrames = ParseFragments(rtb, frames[pos].Sequence); //tune component length RenderTreeFrame fe = framesEdit[lastContentBlazorComponentPos]; RenderTreeFrameHelper.SetComponentSubtreeLength(ref fe, framesEdit[lastContentBlazorComponentPos].ComponentSubtreeLength + newFrames.Length - 1); framesEdit[lastContentBlazorComponentPos] = fe; //replace ChildContent frame with contents framesEdit.RemoveAt(pos); framesEdit.InsertRange(pos, newFrames); ParameterCollectionHelper.SetFrames(ref parameters, framesEdit.ToArray()); break; } pos++; } }