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,6 +569,21 @@ namespace CtrEditor.Services
child.UpdateLayout();
child.InvalidateVisual();
// 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)
{
// Usar VisualBrush mejorado con manejo robusto de errores
try
{
@ -583,36 +598,43 @@ namespace CtrEditor.Services
var rect = new Rectangle()
{
Width = child.RenderSize.Width * scaleFactor,
Height = child.RenderSize.Height * scaleFactor,
Width = elementWidth,
Height = elementHeight,
Fill = visualBrush
};
Canvas.SetLeft(rect, (elementRect.X - captureRect.X) * scaleFactor);
Canvas.SetTop(rect, (elementRect.Y - captureRect.Y) * scaleFactor);
Canvas.SetLeft(rect, relativeLeft);
Canvas.SetTop(rect, relativeTop);
tempCanvas.Children.Add(rect);
elementCount++;
Trace.WriteLine($"[ScreenshotManager] Capturado UserControl: {child.GetType().Name} en ({elementRect.X:F1}, {elementRect.Y:F1})");
Trace.WriteLine($"[ScreenshotManager] ✅ Renderizado {child.GetType().Name} - Absoluta:({elementRect.X:F1},{elementRect.Y:F1}) → Relativa:({relativeLeft:F1},{relativeTop:F1})");
}
catch (Exception brushEx)
{
Trace.WriteLine($"[ScreenshotManager] Error con VisualBrush para {child.GetType().Name}: {brushEx.Message}");
// Fallback: Rectángulo de placeholder
// Fallback: Rectángulo de placeholder visible
var placeholder = new Rectangle()
{
Width = child.RenderSize.Width * scaleFactor,
Height = child.RenderSize.Height * scaleFactor,
Fill = Brushes.LightGray,
Stroke = Brushes.Red,
StrokeThickness = 2
Width = elementWidth,
Height = elementHeight,
Fill = Brushes.LightBlue,
Stroke = Brushes.DarkBlue,
StrokeThickness = 2,
Opacity = 0.7
};
Canvas.SetLeft(placeholder, (elementRect.X - captureRect.X) * scaleFactor);
Canvas.SetTop(placeholder, (elementRect.Y - captureRect.Y) * scaleFactor);
Canvas.SetLeft(placeholder, relativeLeft);
Canvas.SetTop(placeholder, relativeTop);
tempCanvas.Children.Add(placeholder);
elementCount++;
}
}
else
{
Trace.WriteLine($"[ScreenshotManager] ⚠️ UserControl {child.GetType().Name} fuera del área visible - Rel:({relativeLeft:F1},{relativeTop:F1}) Canvas:({tempCanvasWidth:F1}×{tempCanvasHeight:F1})");
}
}
}