fix: Mejorar la lógica de captura en ScreenshotManager para manejar posiciones relativas y errores de VisualBrush

This commit is contained in:
Miguel 2025-09-08 22:52:57 +02:00
parent 369bcce3d7
commit fa637eb323
1 changed files with 60 additions and 38 deletions

View File

@ -569,50 +569,72 @@ namespace CtrEditor.Services
child.UpdateLayout(); child.UpdateLayout();
child.InvalidateVisual(); child.InvalidateVisual();
// Usar VisualBrush mejorado con manejo robusto de errores // CORRECCIÓN: Calcular posición relativa dentro del área de captura
try 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, var visualBrush = new VisualBrush(child)
AlignmentX = AlignmentX.Left, {
AlignmentY = AlignmentY.Top, Stretch = Stretch.None,
ViewboxUnits = BrushMappingMode.Absolute, AlignmentX = AlignmentX.Left,
Viewbox = new Rect(0, 0, child.RenderSize.Width, child.RenderSize.Height) 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, Trace.WriteLine($"[ScreenshotManager] Error con VisualBrush para {child.GetType().Name}: {brushEx.Message}");
Height = child.RenderSize.Height * scaleFactor,
Fill = visualBrush // Fallback: Rectángulo de placeholder visible
}; var placeholder = new Rectangle()
{
Canvas.SetLeft(rect, (elementRect.X - captureRect.X) * scaleFactor); Width = elementWidth,
Canvas.SetTop(rect, (elementRect.Y - captureRect.Y) * scaleFactor); Height = elementHeight,
Fill = Brushes.LightBlue,
tempCanvas.Children.Add(rect); Stroke = Brushes.DarkBlue,
elementCount++; StrokeThickness = 2,
Opacity = 0.7
Trace.WriteLine($"[ScreenshotManager] Capturado UserControl: {child.GetType().Name} en ({elementRect.X:F1}, {elementRect.Y:F1})"); };
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}"); Trace.WriteLine($"[ScreenshotManager] ⚠️ UserControl {child.GetType().Name} fuera del área visible - Rel:({relativeLeft:F1},{relativeTop:F1}) Canvas:({tempCanvasWidth:F1}×{tempCanvasHeight:F1})");
// 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);
} }
} }
} }