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