Browse Source

fix text selection handles crash on reattach to visual tree (#14096)

Co-authored-by: Tim <47110241+timunie@users.noreply.github.com>
pull/14168/head
Emmanuel Hansen 2 years ago
committed by GitHub
parent
commit
c8bd858e18
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 20
      src/Avalonia.Controls/Presenters/TextPresenter.cs
  2. 2
      src/Avalonia.Controls/Primitives/TextSelectionCanvas.cs

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

@ -595,12 +595,6 @@ namespace Avalonia.Controls.Presenters
InvalidateMeasure(); InvalidateMeasure();
} }
protected override void OnLoaded(RoutedEventArgs e)
{
base.OnLoaded(e);
EnsureTextSelectionLayer();
}
protected override Size MeasureOverride(Size availableSize) protected override Size MeasureOverride(Size availableSize)
{ {
_constraint = availableSize; _constraint = availableSize;
@ -894,8 +888,7 @@ namespace Avalonia.Controls.Presenters
ResetCaretTimer(); ResetCaretTimer();
if (TextSelectionHandleCanvas is { } canvas && _layer != null && !_layer.Children.Contains(canvas)) EnsureTextSelectionLayer();
_layer?.Add(TextSelectionHandleCanvas);
} }
private void EnsureTextSelectionLayer() private void EnsureTextSelectionLayer()
@ -903,10 +896,17 @@ namespace Avalonia.Controls.Presenters
if (TextSelectionHandleCanvas == null) if (TextSelectionHandleCanvas == null)
{ {
TextSelectionHandleCanvas = new TextSelectionHandleCanvas(); TextSelectionHandleCanvas = new TextSelectionHandleCanvas();
TextSelectionHandleCanvas.SetPresenter(this);
} }
TextSelectionHandleCanvas.SetPresenter(this);
_layer = TextSelectorLayer.GetTextSelectorLayer(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); _layer?.Add(TextSelectionHandleCanvas);
} }

2
src/Avalonia.Controls/Primitives/TextSelectionCanvas.cs

@ -250,6 +250,8 @@ namespace Avalonia.Controls.Primitives
internal void SetPresenter(TextPresenter? textPresenter) internal void SetPresenter(TextPresenter? textPresenter)
{ {
if (_presenter == textPresenter)
return;
_presenter = textPresenter; _presenter = textPresenter;
if (_presenter != null) if (_presenter != null)
{ {

Loading…
Cancel
Save