@ -1,5 +1,7 @@
using System ;
using System ;
using System.Collections.Generic ;
using System.Linq ;
using System.Linq ;
using System.Threading ;
using Avalonia.Controls.Templates ;
using Avalonia.Controls.Templates ;
using Avalonia.Input ;
using Avalonia.Input ;
using Avalonia.Media ;
using Avalonia.Media ;
@ -14,11 +16,14 @@ namespace Avalonia.Controls.Primitives
/// </summary>
/// </summary>
internal class LightDismissOverlayLayer : Border , ICustomHitTest
internal class LightDismissOverlayLayer : Border , ICustomHitTest
{
{
public IInputElement ? InputPassThroughElement { get ; set ; }
private readonly List < Registration > _ registrations = [ ] ;
public IInputElement ? InputPassThroughElement = > _ registrations . LastOrDefault ( ) ? . InputPassThroughElement ;
static LightDismissOverlayLayer ( )
static LightDismissOverlayLayer ( )
{
{
BackgroundProperty . OverrideDefaultValue < LightDismissOverlayLayer > ( Brushes . Transparent ) ;
BackgroundProperty . OverrideDefaultValue < LightDismissOverlayLayer > ( Brushes . Transparent ) ;
IsVisibleProperty . OverrideDefaultValue < LightDismissOverlayLayer > ( false ) ;
}
}
/// <summary>
/// <summary>
@ -46,6 +51,14 @@ namespace Avalonia.Controls.Primitives
return manager ? . LightDismissOverlayLayer ;
return manager ? . LightDismissOverlayLayer ;
}
}
public IDisposable Register ( IInputElement ? inputPassThroughElement )
{
var registration = new Registration ( this , inputPassThroughElement ) ;
_ registrations . Add ( registration ) ;
UpdateState ( ) ;
return registration ;
}
/// <inheritdoc />
/// <inheritdoc />
public bool HitTest ( Point point )
public bool HitTest ( Point point )
{
{
@ -59,5 +72,30 @@ namespace Avalonia.Controls.Primitives
return true ;
return true ;
}
}
private void Unregister ( Registration registration )
{
_ registrations . Remove ( registration ) ;
UpdateState ( ) ;
}
private void UpdateState ( )
{
IsVisible = _ registrations . Count > 0 ;
}
private sealed class Registration ( LightDismissOverlayLayer owner , IInputElement ? inputPassThroughElement ) : IDisposable
{
private LightDismissOverlayLayer ? _ owner = owner ;
public IInputElement ? InputPassThroughElement { get ; } = inputPassThroughElement ;
public void Dispose ( )
{
var owner = _ owner ;
_ owner = null ;
owner ? . Unregister ( this ) ;
}
}
}
}
}
}