public void AddScreen(Control screen) { // works //GameLog.Client.GameData.DebugFormat("GameScreenStack.cs: screen={0}", screen); if (screen == null) { throw new ArgumentNullException("screen"); } lock (_screens) { if (_screens.Contains(screen)) { return; } var wasEmpty = (_screens.Count == 0); _screens.Add(screen); _itemsContainer.Children.Add(screen); if (IsVisible) { screen.Measure(RenderSize); screen.Arrange(new Rect(RenderSize)); } screen.Visibility = Visibility.Hidden; if (wasEmpty) { FallbackScreen = screen; } } }
private static PngBitmapEncoder getImageFromControl(Control controlToConvert) { // save current canvas transform Transform transform = controlToConvert.LayoutTransform; // get size of control Size sizeOfControl = new Size(120, 120);//controlToConvert.ActualWidth, controlToConvert.ActualHeight); // measure and arrange the control controlToConvert.Measure(sizeOfControl); // arrange the surface controlToConvert.Arrange(new Rect(sizeOfControl)); // craete and render surface and push bitmap to it RenderTargetBitmap renderBitmap = new RenderTargetBitmap((Int32)sizeOfControl.Width, (Int32)sizeOfControl.Height, 96d, 96d, PixelFormats.Pbgra32); // now render surface to bitmap renderBitmap.Render(controlToConvert); // encode png data PngBitmapEncoder pngEncoder = new PngBitmapEncoder(); // puch rendered bitmap into it pngEncoder.Frames.Add(BitmapFrame.Create(renderBitmap)); // return encoder return(pngEncoder); }
protected override Avalonia.Size ArrangeOverride(Avalonia.Size finalSize) { if (Element == null) { return(finalSize); } Element.IsInNativeLayout = true; for (var i = 0; i < ElementController.LogicalChildren.Count; i++) { var child = ElementController.LogicalChildren[i] as VisualElement; if (child == null) { continue; } IVisualElementRenderer renderer = Platform.GetRenderer(child); if (renderer == null) { continue; } Rectangle bounds = child.Bounds; Control control = renderer.GetNativeElement(); Rect childFinal = new Rect(bounds.X, bounds.Y, Math.Max(0, bounds.Width), Math.Max(0, bounds.Height)); control.Arrange(childFinal); } Element.IsInNativeLayout = false; return(finalSize); }
protected override Size ArrangeOverride(Size finalSize) { var c = _child as IControlAdornerChild; Rect rect; if (Offset.X != 0 || Offset.Y != 0) { rect = new Rect( ChildPosition.X + Offset.X, ChildPosition.Y + Offset.Y, finalSize.Width, finalSize.Height); } else if (c != null) { ChildPosition = c.GetPosition(); rect = new Rect(ChildPosition.X, ChildPosition.Y, finalSize.Width, finalSize.Height); } else { rect = new Rect(_offset.X, _offset.Y, finalSize.Width, finalSize.Height); } _child.Arrange(rect); return(new Size(_child.ActualWidth, _child.ActualHeight)); }
protected override Size ArrangeOverride(Size size) { Size finalSize = base.ArrangeOverride(size); adornerHost?.Arrange(new Rect(new Point(), finalSize)); return(finalSize); }
protected override Size ArrangeOverride(Size finalSize) { double curY = 0; List <Step> steps = new List <Step>(); for (int i = 0; i < Children.Count; i++) { Control child = (Control)Children[i]; //child.VerticalContentAlignment = i == 0 ? VerticalAlignment.Top : // i == Children.Count - 1 ? VerticalAlignment.Bottom : VerticalAlignment.Center; Rect allocatedRect = new Rect(0, curY, finalSize.Width, child.DesiredSize.Height); child.Arrange(allocatedRect); double midPoint = i == 0 ? finalSize.Height : finalSize.Height - ((allocatedRect.Top + allocatedRect.Bottom) / 2.0d); //double midPoint = finalSize.Height - ((curY + item.HeaderHeight) / 2.0d); if (child is ToolbarSubItemEx) { ToolbarSubItemEx item = (ToolbarSubItemEx)child; double value; if (!item.IsSeparator && item.Value != null && double.TryParse(item.Value.ToString(), out value)) { steps.Add(new Step(midPoint, value, item.IsStepStop)); } } curY += child.DesiredSize.Height; } Steps = new ObservableCollection <Step>(steps.OrderBy <Step, double>(x => x.Posision)); return(finalSize); }
//TODO: We need to revisit this later when we complete the UI Tests for UWP. // Changing the AutomationPeer here prevents the Narrator from functioning properly. // Oddly, it affects more than just the TextBlocks. It seems to break the entire scan mode. //protected override AutomationPeer OnCreateAutomationPeer() //{ // // We need an automation peer so we can interact with this in automated tests // if (Control == null) // { // return new FrameworkElementAutomationPeer(this); // } // return new TextBlockAutomationPeer(Control); //} protected override Windows.Foundation.Size ArrangeOverride(Windows.Foundation.Size finalSize) { if (Element == null) { return(finalSize); } double childHeight = Math.Max(0, Math.Min(Element.Height, Control.DesiredSize.Height)); var rect = new Rect(); switch (Element.VerticalTextAlignment) { case TextAlignment.Start: break; default: case TextAlignment.Center: rect.Y = (int)((finalSize.Height - childHeight) / 2); break; case TextAlignment.End: rect.Y = finalSize.Height - childHeight; break; } rect.Height = childHeight; rect.Width = finalSize.Width; Control.Arrange(rect); Control.RecalculateSpanPositions(Element, _inlineHeights); return(finalSize); }
public static void ScreenCapture(Control control, string filename) { try { // The BitmapSource that is rendered with a Visual. control.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity)); Size size = control.DesiredSize; int width = (int)size.Width; int height = (int)size.Height; control.Arrange(new Rect(0, 0, width, height)); var rtb = new RenderTargetBitmap(width, height, 96, 96, PixelFormats.Pbgra32); rtb.Render(control); // Encoding the RenderBitmapTarget as a PNG file. var png = new PngBitmapEncoder(); png.Frames.Add(BitmapFrame.Create(rtb)); using (Stream stm = File.Create(filename)) { png.Save(stm); } } finally { } }
protected override Windows.Foundation.Size ArrangeOverride(Windows.Foundation.Size finalSize) { if (Element == null || finalSize.Width * finalSize.Height == 0) { return(finalSize); } Element.IsInNativeLayout = true; if (Control != null) { Control.Arrange(new Rect(0, 0, finalSize.Width, finalSize.Height)); } for (var i = 0; i < ElementController.LogicalChildren.Count; i++) { var child = ElementController.LogicalChildren[i] as VisualElement; if (child == null) { continue; } IVisualElementRenderer renderer = Platform.GetRenderer(child); if (renderer == null) { continue; } Rectangle bounds = child.Bounds; renderer.ContainerElement.Arrange(new Rect(bounds.X, bounds.Y, Math.Max(0, bounds.Width), Math.Max(0, bounds.Height))); } Element.IsInNativeLayout = false; return(finalSize); }
public static void Render(Control target, Size size, Stream stream, double dpi = 72, bool useDeferredRenderer = false) { using var managedWStream = new SKManagedWStream(stream); using var document = SKDocument.CreateXps(stream, (float)dpi); using var canvas = document.BeginPage((float)size.Width, (float)size.Height); target.Measure(size); target.Arrange(new Rect(size)); CanvasRenderer.Render(target, canvas, dpi, useDeferredRenderer); }
/// <summary> /// Arranges the specified final size. /// </summary> /// <param name="finalSize">The final size.</param> public override void Arrange(RectangleF finalSize) { base.Arrange(finalSize); Vector2 line = Vector2.Zero; float accum = 0; foreach (Entity entity in this.Owner.ChildEntities) { Control control = entity.FindComponent <Control>(false); if (control != null) { float x; float y; if (this.Orientation == Orientation.Horizontal) { // if new Line if (line.X + control.DesiredSize.X > this.Transform2D.Rectangle.Width) { line.X = 0; accum += line.Y; line.Y = 0; } x = this.Transform2D.Rectangle.X + line.X; line.X += control.DesiredSize.X; line.Y = MathHelper.Max(line.Y, control.DesiredSize.Y); y = this.Transform2D.Rectangle.Y + accum; } else { // if new Line if (line.Y + control.DesiredSize.Y > this.Transform2D.Rectangle.Height) { line.Y = 0; accum += line.X; line.X = 0; } y = this.Transform2D.Rectangle.Y + line.Y; line.Y += control.DesiredSize.Y; line.X = MathHelper.Max(line.X, control.DesiredSize.X); x = this.Transform2D.Rectangle.X + accum; } RectangleF childRect = new RectangleF( x, y, control.DesiredSize.X, control.DesiredSize.Y); control.Arrange(childRect); } } }
public static void Render(Control target, Size size, Stream stream, double dpi = 96, bool useDeferredRenderer = false) { using var managedWStream = new SKManagedWStream(stream); var bounds = SKRect.Create(new SKSize((float)size.Width, (float)size.Height)); using var canvas = SKSvgCanvas.Create(bounds, managedWStream); target.Measure(size); target.Arrange(new Rect(size)); CanvasRenderer.Render(target, canvas, dpi, useDeferredRenderer); }
protected override Size ArrangeOverride(Size finalSize) { var location = new Point(finalSize.Width - _child.DesiredSize.Width, 0); var finalRect = new Rect(location, _child.DesiredSize); _child.Arrange(finalRect); Trace.WriteLine("Measure - " + finalRect); return(finalSize); }
protected override Size ArrangeOverride(Size finalSize) { LastArrangeOverrideArgument = finalSize; LastArrangeOverrideResult = base.ArrangeOverride(finalSize); if (null != Content) { Content.Arrange(new Rect(0, 0, finalSize.Width, finalSize.Height)); } return(LastArrangeOverrideResult.Value); }
protected override global::Windows.Foundation.Size ArrangeOverride(global::Windows.Foundation.Size finalSize) { Control.Arrange(new WRect(0, 0, finalSize.Width, finalSize.Height)); if (Element is IContentView cv) { cv.CrossPlatformArrange(new Rect(0, 0, finalSize.Width, finalSize.Height)); } return(finalSize); }
/// <summary> /// Arranges the specified final size. /// </summary> /// <param name="finalSize">The final size.</param> public override void Arrange(RectangleF finalSize) { base.Arrange(finalSize); float accum; if (Orientation == Orientation.Vertical) { accum = Transform2D.Rectangle.Y; } else { accum = Transform2D.Rectangle.X; } foreach (Entity entity in Owner.ChildEntities) { Control control = entity.FindComponent <Control>(false); if (control != null) { float x; float y; RectangleF childRect; if (Orientation == Orientation.Vertical) { x = Transform2D.Rectangle.X; y = accum; accum += control.DesiredSize.Y; childRect = new RectangleF( x, y, Transform2D.Rectangle.Width, control.DesiredSize.Y); } else { x = accum; y = Transform2D.Rectangle.Y; accum += control.DesiredSize.X; childRect = new RectangleF( x, y, control.DesiredSize.X, Transform2D.Rectangle.Height); } control.Arrange(childRect); } } }
public static void Render(Control target, Size size, string path, double dpi = 96) { var pixelSize = new PixelSize((int)size.Width, (int)size.Height); var dpiVector = new Vector(dpi, dpi); using var bitmap = new RenderTargetBitmap(pixelSize, dpiVector); target.Measure(size); target.Arrange(new Rect(size)); bitmap.Render(target); bitmap.Save(path); }
protected override Size ArrangeOverride(Size finalSize) { var x = (AdornedDataGrid.ActualWidth - Control.DesiredSize.Width) / 2; var y = (AdornedDataGrid.ActualHeight - Control.DesiredSize.Height) / 2; var p = new Point(x, y); var r = new Rect(p, finalSize); Control.Arrange(r); return(finalSize); }
protected override Size ArrangeOverride(Size finalSize) { for (int i = 0; i < Children.Count; i++) { Control child = Children[i]; if (activeTabIndex == i) { child.Arrange(new Rect( new Point(1, 3), new Size(Math.Max(0, finalSize.Width - 2), Math.Max(0, finalSize.Height - 4) ))); } else { child.Arrange(Rect.Empty); } } return(finalSize); }
public static void Render(Control target, Size size, Stream stream, double dpi = 96, bool useDeferredRenderer = false) { var bounds = SKRect.Create(new SKSize((float)size.Width, (float)size.Height)); using var pictureRecorder = new SKPictureRecorder(); using var canvas = pictureRecorder.BeginRecording(bounds); target.Measure(size); target.Arrange(new Rect(size)); CanvasRenderer.Render(target, canvas, dpi, useDeferredRenderer); using var picture = pictureRecorder.EndRecording(); picture.Serialize(stream); }
/// <summary> /// Default control arrangement is to only arrange /// the first visual child. No transforms will be applied. /// </summary> protected override Size ArrangeOverride(Size size) { Size finalSize; finalSize = base.ArrangeOverride(size); if (_child != null) { _child.Arrange(new Rect(new Point(), finalSize)); } return(finalSize); }
protected override Size ArrangeOverride(Size finalSize) { if (null == content) { return(finalSize); } Rect contentRect = new Rect(1, 1, Math.Max(0, finalSize.Width - 2), Math.Max(0, finalSize.Height - 2)); content.Arrange(contentRect); return(finalSize); }
protected override Size ArrangeOverride(Size finalSize) { Control child = ((IVisual)this).VisualChildren.SingleOrDefault() as Control; if (child != null) { child.Arrange(new Rect(finalSize)); return(child.ActualSize); } else { return(new Size()); } }
//public MetryHolder(CTextBlock ctxt, int width = 400, int height = 1000) //{ // var reqSz = new Size(width, height); // // ctxt.Measure(reqSz); // ctxt.Arrange(new Rect(0, 0, width, ctxt.DesiredSize.Height == 0 ? height : ctxt.DesiredSize.Height)); // ctxt.Measure(reqSz); // // var newReqSz = new Size( // ctxt.DesiredSize.Width == 0 ? reqSz.Width : ctxt.DesiredSize.Width, // ctxt.DesiredSize.Height == 0 ? reqSz.Height : ctxt.DesiredSize.Height); // ctxt.Arrange(new Rect(0, 0, newReqSz.Width, newReqSz.Height)); // // var bitmap = new RenderTargetBitmap(PixelSize.FromSizeWithDpi(newReqSz, Dpi), Dpi); // // using (var icontext = bitmap.CreateDrawingContext(null)) // using (var context = new DrawingContext(icontext)) // { // ctxt.Render(context); // } // // Image = bitmap; //} public MetryHolder(Control ctxt, int width = 400, int height = 1000) { var reqSz = new Size(width, height); ctxt.Measure(reqSz); ctxt.Arrange(new Rect(0, 0, width, ctxt.DesiredSize.Height == 0 ? height : ctxt.DesiredSize.Height)); ctxt.Measure(reqSz); var newReqSz = new Size( ctxt.DesiredSize.Width == 0 ? reqSz.Width : ctxt.DesiredSize.Width, ctxt.DesiredSize.Height == 0 ? reqSz.Height : ctxt.DesiredSize.Height); ctxt.Arrange(new Rect(0, 0, newReqSz.Width, newReqSz.Height)); var bitmap = new RenderTargetBitmap(PixelSize.FromSizeWithDpi(newReqSz, Dpi), Dpi); using (var icontext = bitmap.CreateDrawingContext(null)) using (var context = new DrawingContext(icontext)) { RenderHelper(ctxt, context); } Image = bitmap; }
/// <summary> /// Arranges the specified final size. /// </summary> /// <param name="finalSize">The final size.</param> public override void Arrange(RectangleF finalSize) { base.Arrange(finalSize); foreach (Entity entity in Owner.ChildEntities) { Control control = entity.FindComponent <Control>(false); if (control != null) { control.Arrange(Transform2D.Rectangle); } } }
protected async Task RenderToFile(Control target, [CallerMemberName] string testName = "") { if (!Directory.Exists(OutputPath)) { Directory.CreateDirectory(OutputPath); } var immediatePath = Path.Combine(OutputPath, testName + ".immediate.out.png"); var deferredPath = Path.Combine(OutputPath, testName + ".deferred.out.png"); var factory = AvaloniaLocator.Current.GetService <IPlatformRenderInterface>(); using (RenderTargetBitmap bitmap = new RenderTargetBitmap( (int)target.Width, (int)target.Height)) { Size size = new Size(target.Width, target.Height); target.Measure(size); target.Arrange(new Rect(size)); bitmap.Render(target); bitmap.Save(immediatePath); } using (var rtb = factory.CreateRenderTargetBitmap((int)target.Width, (int)target.Height, 96, 96)) using (var renderer = new DeferredRenderer(target, rtb)) { Size size = new Size(target.Width, target.Height); target.Measure(size); target.Arrange(new Rect(size)); renderer.UnitTestUpdateScene(); // Do the deferred render on a background thread to expose any threading errors in // the deferred rendering path. await Task.Run((Action)renderer.UnitTestRender); rtb.Save(deferredPath); } }
protected override Windows.Foundation.Size ArrangeOverride(Windows.Foundation.Size finalSize) { if (Element == null) { return(finalSize); } var textBlock = Control; if (textBlock == null) { return(finalSize); } DebugMessage("ENTER FontSize=[" + textBlock.FontSize + "] BaseLineOffset=[" + textBlock.BaselineOffset + "] LineHeight=[" + textBlock.LineHeight + "]"); DebugArrangeOverride(finalSize); if (DebugCondition && (finalSize.Width > Element.Width || finalSize.Height > Element.Height) && Element.FittedFontSize > Element.MinFontSize) { System.Diagnostics.Debug.WriteLine("finalSize a bit big!"); } // MeasureOverride(finalSize); double childHeight = Math.Max(0, Math.Min(Element.Height, Control.DesiredSize.Height)); var rect = new Windows.Foundation.Rect(); switch (Element.VerticalTextAlignment) { case Xamarin.Forms.TextAlignment.Start: break; default: case Xamarin.Forms.TextAlignment.Center: rect.Y = (int)((finalSize.Height - childHeight) / 2); break; case Xamarin.Forms.TextAlignment.End: rect.Y = finalSize.Height - childHeight; break; } rect.Height = childHeight; rect.Width = finalSize.Width; Control.Arrange(rect); DebugArrangeOverride(finalSize); DebugMessage("EXIT"); return(finalSize); }
protected override Windows.Foundation.Size ArrangeOverride(Windows.Foundation.Size finalSize) { if (Element == null) { return(finalSize); } Element.IsInNativeLayout = true; Control?.Arrange(new Rect(0, 0, finalSize.Width, finalSize.Height)); Element.IsInNativeLayout = false; return(finalSize); }
protected override global::Windows.Foundation.Size ArrangeOverride(global::Windows.Foundation.Size finalSize) { if (Element == null || Control == null) { return(finalSize); } Element.IsInPlatformLayout = true; Control?.Arrange(new WRect(0, 0, finalSize.Width, finalSize.Height)); Element.IsInPlatformLayout = false; return(finalSize); }
protected void RenderToFile(Control target, [CallerMemberName] string testName = "") { string path = Path.Combine(OutputPath, testName + ".out.png"); RenderTargetBitmap bitmap = new RenderTargetBitmap( (int)target.Width, (int)target.Height); Size size = new Size(target.Width, target.Height); target.Measure(size); target.Arrange(new Rect(size)); bitmap.Render(target); bitmap.Save(path); }
protected void RenderToFile(Control target, [CallerMemberName] string testName = "") { string path = Path.Combine(OutputPath, testName + ".out.png"); using (RenderTargetBitmap bitmap = new RenderTargetBitmap( (int)target.Width, (int)target.Height)) { Size size = new Size(target.Width, target.Height); target.Measure(size); target.Arrange(new Rect(size)); bitmap.Render(target); bitmap.Save(path); } }
private RenderingBuffer processControl(Control control, List<Control> revalidatedControls) { RenderingBuffer buffer = getOrCreateBufferForControl(control); RenderingBuffer fullBuffer = getOrCreateFullBufferForControl(control); // LayoutInfo lastLayoutInfo = control.lastLayoutInfo; LayoutInfo layoutInfo = control.layoutInfo; // control.Measure(lastLayoutInfo.measureArgument); control.Arrange(lastLayoutInfo.renderSlotRect); // if lastLayoutInfo eq layoutInfo we can use last rendered buffer // if (layoutInfo.Equals(lastLayoutInfo) && lastLayoutInfo.validity == LayoutValidity.Render) { if (checkRenderingWasNotChangedRecursively(control)) { if (control.SetValidityToRender()) { revalidatedControls.Add(control); } return fullBuffer; } // replace buffers if control has grown if (layoutInfo.renderSize.width > buffer.Width || layoutInfo.renderSize.height > buffer.Height) { buffer = new RenderingBuffer(layoutInfo.renderSize.width, layoutInfo.renderSize.height); fullBuffer = new RenderingBuffer(layoutInfo.renderSize.width, layoutInfo.renderSize.height); buffers[control] = buffer; fullBuffers[control] = fullBuffer; } // otherwise we should assemble full rendered buffer using childs buffer.Clear(); if (control.RenderSize.Width != 0 && control.RenderSize.Height != 0) control.Render(buffer); // fullBuffer.CopyFrom(buffer); foreach (Control child in control.Children) { if (child.Visibility == Visibility.Visible) { RenderingBuffer fullChildBuffer = processControl(child, revalidatedControls); fullBuffer.ApplyChild(fullChildBuffer, child.ActualOffset, child.RenderSize, child.RenderSlotRect, child.LayoutClip); } else { // чтобы следующий Invalidate для этого контрола // перезаписал lastLayoutInfo if (child.SetValidityToRender()) { revalidatedControls.Add(child); } } } // Save overlappingRect for each control child refreshChildrenLastOverlappedRects( control, false ); if (control.SetValidityToRender()) { revalidatedControls.Add(control); } return fullBuffer; }
private void updateLayout(Control control, List<Control> revalidatedControls) { LayoutInfo lastLayoutInfo = control.lastLayoutInfo; // работаем с родительским элементом управления if (control.Parent != null) { bool needUpdateParentLayout = true; // если размер текущего контрола не изменился, то состояние ревалидации не распространяется // вверх по дереву элементов, и мы переходим к работе с дочерними элементами // в противном случае мы добавляем родительский элемент в конец очереди ревалидации, и // возвращаем управление if (lastLayoutInfo.validity != LayoutValidity.Nothing) { control.Measure(lastLayoutInfo.measureArgument); // if (lastLayoutInfo.unclippedDesiredSize == control.layoutInfo.unclippedDesiredSize) { if (checkDesiredSizeNotChangedRecursively(control)) { needUpdateParentLayout = false; } } if (needUpdateParentLayout) { // mark the parent control for invalidation too and enqueue them control.Parent.Invalidate(); // мы можем закончить с этим элементом, поскольку мы уже добавили // в конец очереди его родителя, и мы все равно вернемся к нему в след. раз return; } } // работаем с дочерними элементами управления // вызываем для текущего контрола Measure&Arrange с последними значениями аргументов if (lastLayoutInfo.validity == LayoutValidity.Nothing && control.Parent != null) { throw new InvalidOperationException("Assertion failed."); } // rootElement - особый случай if (control.Parent == null) { if (control != RootElement) { throw new InvalidOperationException("Control has no parent but is not known rootElement."); } control.Measure(RootElementRect.Size); control.Arrange(RootElementRect); } else { control.Measure(lastLayoutInfo.measureArgument); control.Arrange(lastLayoutInfo.renderSlotRect); } // update render buffers of current control and its children RenderingBuffer buffer = getOrCreateBufferForControl(control); RenderingBuffer fullBuffer = getOrCreateFullBufferForControl(control); // replace buffers if control has grown LayoutInfo layoutInfo = control.layoutInfo; if (layoutInfo.renderSize.width > buffer.Width || layoutInfo.renderSize.height > buffer.Height) { buffer = new RenderingBuffer(layoutInfo.renderSize.width, layoutInfo.renderSize.height); fullBuffer = new RenderingBuffer(layoutInfo.renderSize.width, layoutInfo.renderSize.height); buffers[control] = buffer; fullBuffers[control] = fullBuffer; } buffer.Clear(); if (control.RenderSize.Width != 0 && control.RenderSize.Height != 0) control.Render(buffer); // проверяем дочерние контролы - если их layoutInfo не изменился по сравнению с последним, // то мы можем взять их последний renderBuffer без обновления и применить к текущему контролу fullBuffer.CopyFrom(buffer); IList<Control> children = control.Children; foreach (Control child in children) { if (child.Visibility == Visibility.Visible) { RenderingBuffer fullChildBuffer = processControl(child, revalidatedControls); fullBuffer.ApplyChild(fullChildBuffer, child.ActualOffset, child.RenderSize, child.RenderSlotRect, child.LayoutClip); } else { // чтобы следующий Invalidate перезаписал lastLayoutInfo if (child.SetValidityToRender()) { revalidatedControls.Add(child); } } } // Save overlappingRect for each control child refreshChildrenLastOverlappedRects( control, false ); if (control.SetValidityToRender()) { revalidatedControls.Add(control); } addControlToRenderingUpdatedList(control); }