From 9403a3d0c7050a1553c0b5a0958304570453ed9b Mon Sep 17 00:00:00 2001 From: Benedikt Stebner Date: Tue, 1 Nov 2022 09:07:42 +0100 Subject: [PATCH] Fix TextBlock inlines logical tree handling --- .../Documents/InlineCollection.cs | 25 ++++++++++--------- src/Avalonia.Controls/Documents/Span.cs | 4 +-- src/Avalonia.Controls/TextBlock.cs | 17 +++++++++---- 3 files changed, 27 insertions(+), 19 deletions(-) diff --git a/src/Avalonia.Controls/Documents/InlineCollection.cs b/src/Avalonia.Controls/Documents/InlineCollection.cs index 9ff5627434..54ee9c99d5 100644 --- a/src/Avalonia.Controls/Documents/InlineCollection.cs +++ b/src/Avalonia.Controls/Documents/InlineCollection.cs @@ -12,7 +12,7 @@ namespace Avalonia.Controls.Documents [WhitespaceSignificantCollection] public class InlineCollection : AvaloniaList { - private ILogical? _parent; + private IAvaloniaList? _parent; private IInlineHost? _inlineHost; /// @@ -24,28 +24,28 @@ namespace Avalonia.Controls.Documents this.ForEachItem( x => - { - ((ISetLogicalParent)x).SetParent(Parent); + { x.InlineHost = InlineHost; + Parent?.Add(x); Invalidate(); }, x => { - ((ISetLogicalParent)x).SetParent(null); + Parent?.Remove(x); x.InlineHost = InlineHost; Invalidate(); }, () => throw new NotSupportedException()); } - internal ILogical? Parent + internal IAvaloniaList? Parent { get => _parent; set { _parent = value; - OnParentChanged(value); + OnParentChanged(_parent, value); } } @@ -157,20 +157,21 @@ namespace Avalonia.Controls.Documents Invalidated?.Invoke(this, EventArgs.Empty); } - private void OnParentChanged(ILogical? parent) + private void OnParentChanged(IAvaloniaList? oldParent, IAvaloniaList? newParent) { foreach (var child in this) { - var oldParent = child.Parent; - - if (oldParent != parent) + if (oldParent != newParent) { if (oldParent != null) { - ((ISetLogicalParent)child).SetParent(null); + oldParent.Remove(child); } - ((ISetLogicalParent)child).SetParent(parent); + if(newParent != null) + { + newParent.Add(child); + } } } } diff --git a/src/Avalonia.Controls/Documents/Span.cs b/src/Avalonia.Controls/Documents/Span.cs index 363ce1011b..041cdc74ce 100644 --- a/src/Avalonia.Controls/Documents/Span.cs +++ b/src/Avalonia.Controls/Documents/Span.cs @@ -21,7 +21,7 @@ namespace Avalonia.Controls.Documents { Inlines = new InlineCollection { - Parent = this + Parent = LogicalChildren }; } @@ -85,7 +85,7 @@ namespace Avalonia.Controls.Documents if (newValue is not null) { - newValue.Parent = this; + newValue.Parent = LogicalChildren; newValue.InlineHost = InlineHost; newValue.Invalidated += (s, e) => InlineHost?.Invalidate(); } diff --git a/src/Avalonia.Controls/TextBlock.cs b/src/Avalonia.Controls/TextBlock.cs index 7d4d326a0c..75a275f778 100644 --- a/src/Avalonia.Controls/TextBlock.cs +++ b/src/Avalonia.Controls/TextBlock.cs @@ -156,7 +156,7 @@ namespace Avalonia.Controls { Inlines = new InlineCollection { - Parent = this, + Parent = LogicalChildren, InlineHost = this }; } @@ -635,9 +635,16 @@ namespace Avalonia.Controls { if (_textRuns != null) { - LogicalChildren.Clear(); + foreach (var textRun in _textRuns) + { + if (textRun is EmbeddedControlRun controlRun && + controlRun.Control is Control control) + { + VisualChildren.Remove(control); - VisualChildren.Clear(); + LogicalChildren.Remove(control); + } + } } var textRuns = new List(); @@ -772,7 +779,7 @@ namespace Avalonia.Controls if (newValue is not null) { - newValue.Parent = this; + newValue.Parent = LogicalChildren; newValue.InlineHost = this; newValue.Invalidated += (s, e) => InvalidateTextLayout(); } @@ -841,7 +848,7 @@ namespace Avalonia.Controls continue; } - if (textRun is TextCharacters textCharacters) + if (textRun is TextCharacters) { return new TextCharacters(textRun.Text.Skip(Math.Max(0, textSourceIndex - currentPosition)), textRun.Properties!); }