From fa637eb3233eed850b5cfe0b93546b5555c867fd Mon Sep 17 00:00:00 2001 From: Miguel Date: Mon, 8 Sep 2025 22:52:57 +0200 Subject: [PATCH] =?UTF-8?q?fix:=20Mejorar=20la=20l=C3=B3gica=20de=20captur?= =?UTF-8?q?a=20en=20ScreenshotManager=20para=20manejar=20posiciones=20rela?= =?UTF-8?q?tivas=20y=20errores=20de=20VisualBrush?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Services/ScreenshotManager.cs | 98 +++++++++++++++++++++-------------- 1 file changed, 60 insertions(+), 38 deletions(-) diff --git a/Services/ScreenshotManager.cs b/Services/ScreenshotManager.cs index e035062..c6ffc1b 100644 --- a/Services/ScreenshotManager.cs +++ b/Services/ScreenshotManager.cs @@ -569,50 +569,72 @@ namespace CtrEditor.Services child.UpdateLayout(); child.InvalidateVisual(); - // Usar VisualBrush mejorado con manejo robusto de errores - try + // CORRECCIÓN: Calcular posición relativa dentro del área de captura + var relativeLeft = (elementRect.X - captureRect.X) * scaleFactor; + var relativeTop = (elementRect.Y - captureRect.Y) * scaleFactor; + + // Verificar que la posición relativa esté dentro del canvas temporal + var tempCanvasWidth = captureRect.Width * scaleFactor; + var tempCanvasHeight = captureRect.Height * scaleFactor; + + var elementWidth = child.RenderSize.Width * scaleFactor; + var elementHeight = child.RenderSize.Height * scaleFactor; + + // Verificar si el elemento está realmente dentro del área visible + if (relativeLeft < tempCanvasWidth && relativeTop < tempCanvasHeight && + relativeLeft + elementWidth > 0 && relativeTop + elementHeight > 0) { - var visualBrush = new VisualBrush(child) + // Usar VisualBrush mejorado con manejo robusto de errores + try { - Stretch = Stretch.None, - AlignmentX = AlignmentX.Left, - AlignmentY = AlignmentY.Top, - ViewboxUnits = BrushMappingMode.Absolute, - Viewbox = new Rect(0, 0, child.RenderSize.Width, child.RenderSize.Height) - }; + var visualBrush = new VisualBrush(child) + { + Stretch = Stretch.None, + AlignmentX = AlignmentX.Left, + AlignmentY = AlignmentY.Top, + ViewboxUnits = BrushMappingMode.Absolute, + Viewbox = new Rect(0, 0, child.RenderSize.Width, child.RenderSize.Height) + }; - var rect = new Rectangle() + var rect = new Rectangle() + { + Width = elementWidth, + Height = elementHeight, + Fill = visualBrush + }; + + Canvas.SetLeft(rect, relativeLeft); + Canvas.SetTop(rect, relativeTop); + + tempCanvas.Children.Add(rect); + elementCount++; + + Trace.WriteLine($"[ScreenshotManager] ✅ Renderizado {child.GetType().Name} - Absoluta:({elementRect.X:F1},{elementRect.Y:F1}) → Relativa:({relativeLeft:F1},{relativeTop:F1})"); + } + catch (Exception brushEx) { - Width = child.RenderSize.Width * scaleFactor, - Height = child.RenderSize.Height * scaleFactor, - Fill = visualBrush - }; - - Canvas.SetLeft(rect, (elementRect.X - captureRect.X) * scaleFactor); - Canvas.SetTop(rect, (elementRect.Y - captureRect.Y) * scaleFactor); - - tempCanvas.Children.Add(rect); - elementCount++; - - Trace.WriteLine($"[ScreenshotManager] Capturado UserControl: {child.GetType().Name} en ({elementRect.X:F1}, {elementRect.Y:F1})"); + Trace.WriteLine($"[ScreenshotManager] Error con VisualBrush para {child.GetType().Name}: {brushEx.Message}"); + + // Fallback: Rectángulo de placeholder visible + var placeholder = new Rectangle() + { + Width = elementWidth, + Height = elementHeight, + Fill = Brushes.LightBlue, + Stroke = Brushes.DarkBlue, + StrokeThickness = 2, + Opacity = 0.7 + }; + + Canvas.SetLeft(placeholder, relativeLeft); + Canvas.SetTop(placeholder, relativeTop); + tempCanvas.Children.Add(placeholder); + elementCount++; + } } - catch (Exception brushEx) + else { - Trace.WriteLine($"[ScreenshotManager] Error con VisualBrush para {child.GetType().Name}: {brushEx.Message}"); - - // Fallback: Rectángulo de placeholder - var placeholder = new Rectangle() - { - Width = child.RenderSize.Width * scaleFactor, - Height = child.RenderSize.Height * scaleFactor, - Fill = Brushes.LightGray, - Stroke = Brushes.Red, - StrokeThickness = 2 - }; - - Canvas.SetLeft(placeholder, (elementRect.X - captureRect.X) * scaleFactor); - Canvas.SetTop(placeholder, (elementRect.Y - captureRect.Y) * scaleFactor); - tempCanvas.Children.Add(placeholder); + Trace.WriteLine($"[ScreenshotManager] ⚠️ UserControl {child.GetType().Name} fuera del área visible - Rel:({relativeLeft:F1},{relativeTop:F1}) Canvas:({tempCanvasWidth:F1}×{tempCanvasHeight:F1})"); } } }