Browse Source

Show and hide native control if visibility of any of its ancestors changes

pull/5732/head
João Neves 6 years ago
parent
commit
64b939bee8
  1. 22
      src/Avalonia.Controls/NativeControlHost.cs

22
src/Avalonia.Controls/NativeControlHost.cs

@ -16,30 +16,16 @@ namespace Avalonia.Controls
private bool _queuedForDestruction; private bool _queuedForDestruction;
private bool _queuedForMoveResize; private bool _queuedForMoveResize;
private readonly List<Visual> _propertyChangedSubscriptions = new List<Visual>(); private readonly List<Visual> _propertyChangedSubscriptions = new List<Visual>();
private readonly EventHandler<AvaloniaPropertyChangedEventArgs> _propertyChangedHandler;
static NativeControlHost()
{
IsVisibleProperty.Changed.AddClassHandler<NativeControlHost>(OnVisibleChanged);
}
public NativeControlHost()
{
_propertyChangedHandler = PropertyChangedHandler;
}
private static void OnVisibleChanged(NativeControlHost host, AvaloniaPropertyChangedEventArgs arg2)
=> host.UpdateHost();
protected override void OnAttachedToVisualTree(VisualTreeAttachmentEventArgs e) protected override void OnAttachedToVisualTree(VisualTreeAttachmentEventArgs e)
{ {
_currentRoot = e.Root as TopLevel; _currentRoot = e.Root as TopLevel;
var visual = (IVisual)this; var visual = (IVisual)this;
while (visual != _currentRoot) while (visual != null)
{ {
if (visual is Visual v) if (visual is Visual v)
{ {
v.PropertyChanged += _propertyChangedHandler; v.PropertyChanged += PropertyChangedHandler;
_propertyChangedSubscriptions.Add(v); _propertyChangedSubscriptions.Add(v);
} }
@ -51,7 +37,7 @@ namespace Avalonia.Controls
private void PropertyChangedHandler(object sender, AvaloniaPropertyChangedEventArgs e) private void PropertyChangedHandler(object sender, AvaloniaPropertyChangedEventArgs e)
{ {
if (e.IsEffectiveValueChange && e.Property == BoundsProperty) if (e.IsEffectiveValueChange && (e.Property == BoundsProperty || e.Property == IsVisibleProperty))
EnqueueForMoveResize(); EnqueueForMoveResize();
} }
@ -61,7 +47,7 @@ namespace Avalonia.Controls
if (_propertyChangedSubscriptions != null) if (_propertyChangedSubscriptions != null)
{ {
foreach (var v in _propertyChangedSubscriptions) foreach (var v in _propertyChangedSubscriptions)
v.PropertyChanged -= _propertyChangedHandler; v.PropertyChanged -= PropertyChangedHandler;
_propertyChangedSubscriptions.Clear(); _propertyChangedSubscriptions.Clear();
} }
UpdateHost(); UpdateHost();

Loading…
Cancel
Save