From 7ee12d27b3703274e45cf0d7d8f7efb46ae9d3d9 Mon Sep 17 00:00:00 2001 From: DmitryZhelnin Date: Sat, 23 Sep 2023 02:30:25 +0300 Subject: [PATCH] TopLevel: avoid capturing of this reference when listening for property changes of PointerOverElement (#12996) Co-authored-by: Dmitry Zhelnin --- src/Avalonia.Controls/TopLevel.cs | 27 ++++++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/src/Avalonia.Controls/TopLevel.cs b/src/Avalonia.Controls/TopLevel.cs index 7180e859b8..158469d231 100644 --- a/src/Avalonia.Controls/TopLevel.cs +++ b/src/Avalonia.Controls/TopLevel.cs @@ -153,6 +153,20 @@ namespace Avalonia.Controls } } }); + + PointerOverElementProperty.Changed.AddClassHandler((topLevel, e) => + { + if (e.OldValue is InputElement oldInputElement) + { + oldInputElement.PropertyChanged -= topLevel.PointerOverElementOnPropertyChanged; + } + + if (e.NewValue is InputElement newInputElement) + { + topLevel.PlatformImpl?.SetCursor(newInputElement.Cursor?.PlatformImpl); + newInputElement.PropertyChanged += topLevel.PointerOverElementOnPropertyChanged; + } + }); } /// @@ -215,11 +229,6 @@ namespace Avalonia.Controls ClientSize = impl.ClientSize; FrameSize = impl.FrameSize; - this.GetObservable(PointerOverElementProperty) - .Select( - x => (x as InputElement)?.GetObservable(CursorProperty) ?? Observable.Empty()) - .Switch().Subscribe(cursor => PlatformImpl?.SetCursor(cursor?.PlatformImpl)); - if (((IStyleHost)this).StylingParent is IResourceHost applicationResources) { _resourcesChangesSubscriber = new TargetWeakEventSubscriber( @@ -751,6 +760,14 @@ namespace Avalonia.Controls } } + private void PointerOverElementOnPropertyChanged(object? sender, AvaloniaPropertyChangedEventArgs e) + { + if (e.Property == CursorProperty && sender is InputElement inputElement) + { + PlatformImpl?.SetCursor(inputElement.Cursor?.PlatformImpl); + } + } + private void GlobalActualThemeVariantChanged(object? sender, EventArgs e) { SetValue(ActualThemeVariantProperty, ((IThemeVariantHost)sender!).ActualThemeVariant, BindingPriority.Template);