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.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);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue