From 8fe22dc3eeb6718216565472b74f66992134e135 Mon Sep 17 00:00:00 2001 From: Compunet <117437050+dme-compunet@users.noreply.github.com> Date: Thu, 9 Jan 2025 15:28:17 +0200 Subject: [PATCH] Fix TextLayout overflow (#17914) * Update TextLayout only if finalSize is different from _constraint * Added comment --- .../Presenters/TextPresenter.cs | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/src/Avalonia.Controls/Presenters/TextPresenter.cs b/src/Avalonia.Controls/Presenters/TextPresenter.cs index 622727ccbe..e0cb22607d 100644 --- a/src/Avalonia.Controls/Presenters/TextPresenter.cs +++ b/src/Avalonia.Controls/Presenters/TextPresenter.cs @@ -634,6 +634,8 @@ namespace Avalonia.Controls.Presenters protected override Size ArrangeOverride(Size finalSize) { + var finalWidth = finalSize.Width; + var textWidth = Math.Ceiling(TextLayout.OverhangLeading + TextLayout.WidthIncludingTrailingWhitespace + TextLayout.OverhangTrailing); if (finalSize.Width < textWidth) @@ -641,15 +643,17 @@ namespace Avalonia.Controls.Presenters finalSize = finalSize.WithWidth(textWidth); } - if (MathUtilities.AreClose(_constraint.Width, finalSize.Width)) + // Check if the '_constraint' has changed since the last measure, + // if so recalculate the TextLayout according to the new size + // NOTE: It is important to check this against the actual final size + // (excluding the trailing whitespace) to avoid TextLayout overflow. + if (MathUtilities.AreClose(_constraint.Width, finalWidth) == false) { - return finalSize; - } - - _constraint = new Size(Math.Ceiling(finalSize.Width), double.PositiveInfinity); + _constraint = new Size(Math.Ceiling(finalWidth), double.PositiveInfinity); - _textLayout?.Dispose(); - _textLayout = null; + _textLayout?.Dispose(); + _textLayout = null; + } return finalSize; }