From c8bd858e18162a9062db0a2a20e8b7b32b038a80 Mon Sep 17 00:00:00 2001 From: Emmanuel Hansen Date: Wed, 10 Jan 2024 18:33:09 +0000 Subject: [PATCH] fix text selection handles crash on reattach to visual tree (#14096) Co-authored-by: Tim <47110241+timunie@users.noreply.github.com> --- .../Presenters/TextPresenter.cs | 20 +++++++++---------- .../Primitives/TextSelectionCanvas.cs | 2 ++ 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/src/Avalonia.Controls/Presenters/TextPresenter.cs b/src/Avalonia.Controls/Presenters/TextPresenter.cs index 9a89ccaf28..37fbbaa2e9 100644 --- a/src/Avalonia.Controls/Presenters/TextPresenter.cs +++ b/src/Avalonia.Controls/Presenters/TextPresenter.cs @@ -595,12 +595,6 @@ namespace Avalonia.Controls.Presenters InvalidateMeasure(); } - protected override void OnLoaded(RoutedEventArgs e) - { - base.OnLoaded(e); - EnsureTextSelectionLayer(); - } - protected override Size MeasureOverride(Size availableSize) { _constraint = availableSize; @@ -894,8 +888,7 @@ namespace Avalonia.Controls.Presenters ResetCaretTimer(); - if (TextSelectionHandleCanvas is { } canvas && _layer != null && !_layer.Children.Contains(canvas)) - _layer?.Add(TextSelectionHandleCanvas); + EnsureTextSelectionLayer(); } private void EnsureTextSelectionLayer() @@ -903,10 +896,17 @@ namespace Avalonia.Controls.Presenters if (TextSelectionHandleCanvas == null) { TextSelectionHandleCanvas = new TextSelectionHandleCanvas(); - TextSelectionHandleCanvas.SetPresenter(this); } + TextSelectionHandleCanvas.SetPresenter(this); _layer = TextSelectorLayer.GetTextSelectorLayer(this); - if (_layer != null && !_layer.Children.Contains(TextSelectionHandleCanvas)) + if (TextSelectionHandleCanvas.VisualParent is { } parent && parent != _layer) + { + if (parent is TextSelectorLayer l) + { + l.Remove(TextSelectionHandleCanvas); + } + } + if (_layer != null && TextSelectionHandleCanvas.VisualParent != _layer) _layer?.Add(TextSelectionHandleCanvas); } diff --git a/src/Avalonia.Controls/Primitives/TextSelectionCanvas.cs b/src/Avalonia.Controls/Primitives/TextSelectionCanvas.cs index c9a58aed0b..07e48653d7 100644 --- a/src/Avalonia.Controls/Primitives/TextSelectionCanvas.cs +++ b/src/Avalonia.Controls/Primitives/TextSelectionCanvas.cs @@ -250,6 +250,8 @@ namespace Avalonia.Controls.Primitives internal void SetPresenter(TextPresenter? textPresenter) { + if (_presenter == textPresenter) + return; _presenter = textPresenter; if (_presenter != null) {