Browse Source

Second attempt to fix text measurements with scaling

pull/8053/head
Benedikt Stebner 4 years ago
parent
commit
a056f0b654
  1. 27
      src/Avalonia.Controls/Presenters/TextPresenter.cs
  2. 19
      src/Avalonia.Controls/TextBlock.cs

27
src/Avalonia.Controls/Presenters/TextPresenter.cs

@ -511,30 +511,39 @@ namespace Avalonia.Controls.Presenters
InvalidateMeasure();
}
protected override Size MeasureOverride(Size availableSize)
{
if (string.IsNullOrEmpty(Text))
{
return new Size();
}
_constraint = availableSize;
_textLayout = null;
InvalidateArrange();
var measuredSize = PixelSize.FromSize(TextLayout.Bounds.Size, 1);
return new Size(measuredSize.Width, measuredSize.Height);
var measuredSize = TextLayout.Bounds.Size;
return measuredSize;
}
protected override Size ArrangeOverride(Size finalSize)
{
if (finalSize.Width < TextLayout.Bounds.Width)
{
finalSize = finalSize.WithWidth(TextLayout.Bounds.Width);
}
if (MathUtilities.AreClose(_constraint.Width, finalSize.Width))
{
return finalSize;
}
var textSize = PixelSize.FromSize(finalSize, VisualRoot?.RenderScaling ?? 1);
_constraint = new Size(textSize.Width, textSize.Height);
_constraint = new Size(finalSize.Width, double.PositiveInfinity);
_textLayout = null;

19
src/Avalonia.Controls/TextBlock.cs

@ -604,7 +604,9 @@ namespace Avalonia.Controls
return new Size();
}
var padding = Padding;
var scale = LayoutHelper.GetLayoutScale(this);
var padding = LayoutHelper.RoundLayoutThickness(Padding, scale, scale);
_constraint = availableSize.Deflate(padding);
@ -612,23 +614,24 @@ namespace Avalonia.Controls
InvalidateArrange();
var measuredSize = PixelSize.FromSize(TextLayout.Bounds.Size, 1);
var measuredSize = TextLayout.Bounds.Size.Inflate(padding);
return new Size(measuredSize.Width, measuredSize.Height).Inflate(padding);
return measuredSize;
}
protected override Size ArrangeOverride(Size finalSize)
{
if(finalSize.Width < TextLayout.Bounds.Width)
{
finalSize = finalSize.WithWidth(TextLayout.Bounds.Width);
}
if (MathUtilities.AreClose(_constraint.Width, finalSize.Width))
{
return finalSize;
}
var padding = Padding;
var textSize = PixelSize.FromSize(finalSize.Deflate(padding), VisualRoot?.RenderScaling ?? 1);
_constraint = new Size(textSize.Width, textSize.Height);
_constraint = new Size(finalSize.Width, double.PositiveInfinity);
_textLayout = null;

Loading…
Cancel
Save