fix: Mejorar la lógica de captura en ScreenshotManager para manejar posiciones relativas y errores de VisualBrush
This commit is contained in:
parent
369bcce3d7
commit
fa637eb323
|
@ -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})");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue