protected override Size ArrangeOverride(Size finalSizeInHostCoordinates) { var effectiveZoomFactor = ZoomFactor; var finalSizeInViewCoordinates = finalSizeInHostCoordinates.Scale(effectiveZoomFactor); var requiredSizeInViewCoordinates = base.ArrangeOverride(finalSizeInViewCoordinates); var requiredSizeInHostCoordinates = requiredSizeInViewCoordinates.Scale(1 / effectiveZoomFactor); if (effectiveZoomFactor != 1) { transform.ScaleX = transform.ScaleY = 1 / effectiveZoomFactor; contentHolder.RenderTransform = transform; } else contentHolder.RenderTransform = null; #if LOG_MEASURE_ARRANGE_OVERRIDE Debug.WriteLine("*** ArrangeOverride ***"); Debug.WriteLine(" input size (host coordinates): {0:#.} x {1:#.}", finalSizeInHostCoordinates.Width, finalSizeInHostCoordinates.Height); Debug.WriteLine(" converted (view coordinates): {0:#.} x {1:#.}", finalSizeInViewCoordinates.Width, finalSizeInViewCoordinates.Height); Debug.WriteLine(" required size (view coordinates): {0:#} x {1:#.}", requiredSizeInViewCoordinates.Width, requiredSizeInViewCoordinates.Height); Debug.WriteLine(" scaling factor: {0:#.##}", ZoomFactor); Debug.WriteLine(" returning (host coordinates): {0:#.} x {1:#.}", requiredSizeInHostCoordinates.Width, requiredSizeInHostCoordinates.Height); #endif return requiredSizeInHostCoordinates; }
protected override Size MeasureOverride(Size availableSizeInHostCoordinates) { var effectiveZoomFactor = ZoomFactor; var availableSizeInViewCoordinates = availableSizeInHostCoordinates.Scale(effectiveZoomFactor); var desiredSizeInViewCoordinates = base.MeasureOverride(availableSizeInViewCoordinates); var desiredSizeInHostCoordinates = desiredSizeInViewCoordinates.Scale(1 / effectiveZoomFactor); #if LOG_MEASURE_ARRANGE_OVERRIDE Debug.WriteLine("*** MeasureOverride ***"); Debug.WriteLine(" input size (host coordinates): {0:#.} x {1:#.}", availableSizeInHostCoordinates.Width, availableSizeInHostCoordinates.Height); Debug.WriteLine(" converted (view coordinates): {0:#.} x {1:#.}", availableSizeInViewCoordinates.Width, availableSizeInViewCoordinates.Height); Debug.WriteLine(" required size (view coordinates): {0:#} x {1:#.}", desiredSizeInViewCoordinates.Width, desiredSizeInViewCoordinates.Height); Debug.WriteLine(" scaling factor: {0:#.##}", ZoomFactor); Debug.WriteLine(" returning (host coordinates): {0:#.} x {1:#.}", desiredSizeInHostCoordinates.Width, desiredSizeInHostCoordinates.Height); #endif return desiredSizeInHostCoordinates; }