Browse Source

TopLevel: avoid capturing of this reference when listening for property changes of PointerOverElement (#12996)

Co-authored-by: Dmitry Zhelnin <d.zhelnin@of-group.ru>
pull/13001/head
DmitryZhelnin 3 years ago
committed by GitHub
parent
commit
7ee12d27b3
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 27
      src/Avalonia.Controls/TopLevel.cs

27
src/Avalonia.Controls/TopLevel.cs

@ -153,6 +153,20 @@ namespace Avalonia.Controls
} }
} }
}); });
PointerOverElementProperty.Changed.AddClassHandler<TopLevel>((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;
}
});
} }
/// <summary> /// <summary>
@ -215,11 +229,6 @@ namespace Avalonia.Controls
ClientSize = impl.ClientSize; ClientSize = impl.ClientSize;
FrameSize = impl.FrameSize; FrameSize = impl.FrameSize;
this.GetObservable(PointerOverElementProperty)
.Select(
x => (x as InputElement)?.GetObservable(CursorProperty) ?? Observable.Empty<Cursor>())
.Switch().Subscribe(cursor => PlatformImpl?.SetCursor(cursor?.PlatformImpl));
if (((IStyleHost)this).StylingParent is IResourceHost applicationResources) if (((IStyleHost)this).StylingParent is IResourceHost applicationResources)
{ {
_resourcesChangesSubscriber = new TargetWeakEventSubscriber<TopLevel, ResourcesChangedEventArgs>( _resourcesChangesSubscriber = new TargetWeakEventSubscriber<TopLevel, ResourcesChangedEventArgs>(
@ -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) private void GlobalActualThemeVariantChanged(object? sender, EventArgs e)
{ {
SetValue(ActualThemeVariantProperty, ((IThemeVariantHost)sender!).ActualThemeVariant, BindingPriority.Template); SetValue(ActualThemeVariantProperty, ((IThemeVariantHost)sender!).ActualThemeVariant, BindingPriority.Template);

Loading…
Cancel
Save