diff --git a/src/CommunityToolkit.Maui/Alerts/Snackbar/Snackbar.shared.cs b/src/CommunityToolkit.Maui/Alerts/Snackbar/Snackbar.shared.cs index 17585435f8..2a1f9f9e72 100644 --- a/src/CommunityToolkit.Maui/Alerts/Snackbar/Snackbar.shared.cs +++ b/src/CommunityToolkit.Maui/Alerts/Snackbar/Snackbar.shared.cs @@ -8,6 +8,7 @@ public partial class Snackbar : ISnackbar static readonly WeakEventManager weakEventManager = new(); bool isDisposed; + WeakReference? weakView; /// /// Initializes a new instance of @@ -57,7 +58,20 @@ public string ActionButtonText public Action? Action { get; init; } /// - public IView? Anchor { get; init; } + public IView? Anchor + { + get => weakView?.GetTargetOrDefault(); + init + { + if (value is null) + { + weakView = null; + return; + } + + weakView = new(value); + } + } /// /// Occurs when changes. diff --git a/src/CommunityToolkit.Maui/Extensions/WeakReferenceExtensions.cs b/src/CommunityToolkit.Maui/Extensions/WeakReferenceExtensions.cs new file mode 100644 index 0000000000..fcc629519b --- /dev/null +++ b/src/CommunityToolkit.Maui/Extensions/WeakReferenceExtensions.cs @@ -0,0 +1,17 @@ +namespace CommunityToolkit.Maui.Extensions; + +static class WeakReferenceExtensions +{ + public static T? GetTargetOrDefault(this WeakReference self) + where T : class + { + ArgumentNullException.ThrowIfNull(self); + + if (self.TryGetTarget(out var target)) + { + return target; + } + + return default; + } +}