From 8b0f2588fa70df49dfd72233f75c4de60428adc5 Mon Sep 17 00:00:00 2001 From: Benedikt Stebner Date: Mon, 28 Aug 2023 12:30:02 +0200 Subject: [PATCH 1/3] Only add embedded controls to the visual tree if they are part of the TextLayout --- .../Documents/InlineUIContainer.cs | 5 +++++ src/Avalonia.Controls/TextBlock.cs | 16 ++++++++++------ 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/src/Avalonia.Controls/Documents/InlineUIContainer.cs b/src/Avalonia.Controls/Documents/InlineUIContainer.cs index f06c8515ee..7f5aa55959 100644 --- a/src/Avalonia.Controls/Documents/InlineUIContainer.cs +++ b/src/Avalonia.Controls/Documents/InlineUIContainer.cs @@ -58,6 +58,11 @@ namespace Avalonia.Controls.Documents internal override void BuildTextRun(IList textRuns) { + if(!Child.IsMeasureValid) + { + Child.Measure(Size.Infinity); + } + textRuns.Add(new EmbeddedControlRun(Child, CreateTextRunProperties())); } diff --git a/src/Avalonia.Controls/TextBlock.cs b/src/Avalonia.Controls/TextBlock.cs index ea420c7c45..46503b9185 100644 --- a/src/Avalonia.Controls/TextBlock.cs +++ b/src/Avalonia.Controls/TextBlock.cs @@ -679,14 +679,18 @@ namespace Avalonia.Controls _textRuns = textRuns; - foreach (var textRun in _textRuns) + foreach (var textLine in TextLayout.TextLines) { - if (textRun is EmbeddedControlRun controlRun && - controlRun.Control is Control control) + foreach (var run in textLine.TextRuns) { - VisualChildren.Add(control); - - control.Measure(Size.Infinity); + if (run is DrawableTextRun drawable) + { + if (drawable is EmbeddedControlRun controlRun + && controlRun.Control is Control control) + { + VisualChildren.Add(control); + } + } } } } From 21cc95a014abf8060165445473b1298a5287d58a Mon Sep 17 00:00:00 2001 From: Benedikt Stebner Date: Wed, 30 Aug 2023 08:46:43 +0200 Subject: [PATCH 2/3] Fix failing test --- tests/Avalonia.Controls.UnitTests/TextBlockTests.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/Avalonia.Controls.UnitTests/TextBlockTests.cs b/tests/Avalonia.Controls.UnitTests/TextBlockTests.cs index eb1d6f5ea4..fc798fb737 100644 --- a/tests/Avalonia.Controls.UnitTests/TextBlockTests.cs +++ b/tests/Avalonia.Controls.UnitTests/TextBlockTests.cs @@ -170,6 +170,7 @@ namespace Avalonia.Controls.UnitTests target.Inlines.Add("123456"); target.Measure(Size.Infinity); + target.Arrange(new Rect(target.DesiredSize)); Assert.True(button.IsMeasureValid); Assert.Equal(80, button.DesiredSize.Width); From 51003c2f3e197904bee0b439b151edac49b342d0 Mon Sep 17 00:00:00 2001 From: NLNet Date: Thu, 31 Aug 2023 10:09:12 +0800 Subject: [PATCH 3/3] Fix the scrollbar attaching to wrong scrollviewer, like scrollviewer outer a datagrid. --- src/Avalonia.Controls/Primitives/ScrollBar.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/Avalonia.Controls/Primitives/ScrollBar.cs b/src/Avalonia.Controls/Primitives/ScrollBar.cs index 86bea8daa5..264b944566 100644 --- a/src/Avalonia.Controls/Primitives/ScrollBar.cs +++ b/src/Avalonia.Controls/Primitives/ScrollBar.cs @@ -195,14 +195,15 @@ namespace Avalonia.Controls.Primitives } /// - /// Locates the first ancestor and binds to its properties. Properties which have been set through other means are not bound. + /// Try to attach to TemplatedParent if it is a and binds to its properties. + /// Properties which have been set through other means are not bound. /// /// /// This method is automatically called when the control is attached to a visual tree. /// internal void AttachToScrollViewer() { - var owner = this.FindAncestorOfType(); + var owner = this.TemplatedParent as ScrollViewer; if (owner == null) {