diff --git a/src/TheXamlGuy.NotificationFlyout.Uwp.UI.Controls/NotificationFlyout/NotificationFlyout.cs b/src/TheXamlGuy.NotificationFlyout.Uwp.UI.Controls/NotificationFlyout/NotificationFlyout.cs index 61ea40e..d46f3c7 100644 --- a/src/TheXamlGuy.NotificationFlyout.Uwp.UI.Controls/NotificationFlyout/NotificationFlyout.cs +++ b/src/TheXamlGuy.NotificationFlyout.Uwp.UI.Controls/NotificationFlyout/NotificationFlyout.cs @@ -17,8 +17,13 @@ namespace TheXamlGuy.NotificationFlyout.Uwp.UI.Controls typeof(ImageSource), typeof(NotificationFlyout), new PropertyMetadata(null, OnIconPropertyChanged)); + public static readonly DependencyProperty IsLightDismissEnabledProperty = + DependencyProperty.Register(nameof(IsLightDismissEnabled), + typeof(bool), typeof(NotificationFlyout), + new PropertyMetadata(true)); + public static readonly DependencyProperty LightIconSourceProperty = - DependencyProperty.Register(nameof(LightIconSource), + DependencyProperty.Register(nameof(LightIconSource), typeof(ImageSource), typeof(NotificationFlyout), new PropertyMetadata(null)); @@ -43,6 +48,12 @@ namespace TheXamlGuy.NotificationFlyout.Uwp.UI.Controls set => SetValue(IconSourceProperty, value); } + public bool IsLightDismissEnabled + { + get => (bool)GetValue(IsLightDismissEnabledProperty); + set => SetValue(IsLightDismissEnabledProperty, value); + } + public ImageSource LightIconSource { get => (ImageSource)GetValue(LightIconSourceProperty); @@ -51,6 +62,33 @@ namespace TheXamlGuy.NotificationFlyout.Uwp.UI.Controls public static INotificationFlyoutApplication GetApplication() => _applicationInstance; + public void Hide() + { + if (_popup == null) + { + PreparePopup(); + } + + if (IsLightDismissEnabled) + { + _popup.IsOpen = false; + } + } + + public void Show() + { + if (_popup == null) + { + PreparePopup(); + } + + if (!_popup.IsOpen) + { + _popup.Child = _child; + _popup.IsOpen = true; + } + } + internal static void SetApplication(INotificationFlyoutApplication application) => _applicationInstance = application; internal void SetPlacement(double horizontalOffset, double verticalOffset, NotificationFlyoutTaskbarPlacement flyoutTaskbarPlacement) @@ -93,18 +131,6 @@ namespace TheXamlGuy.NotificationFlyout.Uwp.UI.Controls VisualStateManager.GoToState(this, flyoutTaskbarPlacement.ToString(), true); } - - internal void Show() - { - if (_popup == null) - { - PreparePopup(); - } - - _popup.Child = _child; - _popup.IsOpen = true; - } - internal void ShowContextMenuAt(double x, double y) { if (ContextFlyout == null) return; @@ -162,6 +188,12 @@ namespace TheXamlGuy.NotificationFlyout.Uwp.UI.Controls private void PreparePopup() { + if (_popup != null) + { + _popup.Opened -= OnPopupOpened; + _popup.Closed -= OnPopupClosed; + } + _popup = new Popup { XamlRoot = XamlRoot, diff --git a/src/TheXamlGuy.NotificationFlyout.Wpf.UI.Controls/NotificationFlyout/NotificationFlyoutApplication.cs b/src/TheXamlGuy.NotificationFlyout.Wpf.UI.Controls/NotificationFlyout/NotificationFlyoutApplication.cs index b0899d2..fbe4e6c 100644 --- a/src/TheXamlGuy.NotificationFlyout.Wpf.UI.Controls/NotificationFlyout/NotificationFlyoutApplication.cs +++ b/src/TheXamlGuy.NotificationFlyout.Wpf.UI.Controls/NotificationFlyout/NotificationFlyoutApplication.cs @@ -21,10 +21,10 @@ namespace TheXamlGuy.NotificationFlyout.Wpf.UI.Controls new PropertyMetadata(null, OnFlyoutPropertyChanged)); private const string ShellTrayHandleName = "Shell_TrayWnd"; - private TransparentXamlHost _notificationFlyoutXamlHost; private readonly NotificationIconHelper _notificationIconHelper; private readonly SystemPersonalisationHelper _systemPersonalisationHelper; private readonly TaskbarHelper _taskbarHelper; + private TransparentXamlHost _notificationFlyoutXamlHost; public NotificationFlyoutApplication() { @@ -84,6 +84,8 @@ namespace TheXamlGuy.NotificationFlyout.Wpf.UI.Controls private void OnIconSourceChanged(object sender, EventArgs args) => UpdateIcons(); + private void OnInteractedWith(object sender, EventArgs args) => _notificationFlyoutXamlHost.Activate(); + private void OnNotificationFlyoutXamlHostClosed(object sender, EventArgs args) => _notificationIconHelper?.Dispose(); private void OnTaskbarChanged(object sender, EventArgs args) => UpdateFlyoutPlacement(); @@ -98,7 +100,7 @@ namespace TheXamlGuy.NotificationFlyout.Wpf.UI.Controls { if (Flyout == null) return; Flyout.IconSourceChanged += OnIconSourceChanged; - Flyout.InteractedWith += Flyout_Focused; ; + Flyout.InteractedWith += OnInteractedWith; var content = _notificationFlyoutXamlHost.GetHostContent(); if (content != null) @@ -109,16 +111,11 @@ namespace TheXamlGuy.NotificationFlyout.Wpf.UI.Controls UpdateIcons(); } - private void Flyout_Focused(object sender, EventArgs e) - { - _notificationFlyoutXamlHost.Activate(); - } - private void PrepareFlyoutHost() { _notificationFlyoutXamlHost = new TransparentXamlHost(); _notificationFlyoutXamlHost.Closed += OnNotificationFlyoutXamlHostClosed; - + _notificationFlyoutXamlHost.Deactivated += OnNotificationFlyoutXamlHostDeactivated; var taskbarState = _taskbarHelper.GetCurrentState(); _notificationFlyoutXamlHost.Left = taskbarState.Screen.WorkingArea.Left; _notificationFlyoutXamlHost.Top = taskbarState.Screen.WorkingArea.Top; @@ -126,16 +123,26 @@ namespace TheXamlGuy.NotificationFlyout.Wpf.UI.Controls _notificationFlyoutXamlHost.Show(); } + private void OnNotificationFlyoutXamlHostDeactivated(object sender, EventArgs args) + { + if (Flyout == null) return; + Flyout.Hide(); + } + private void ShowFlyout() { - UpdateFlyoutPlacement(); + if (Flyout == null) return; + UpdateFlyoutPlacement(); _notificationFlyoutXamlHost.Activate(); + Flyout.Show(); } private void UpdateFlyoutPlacement() { + if (Flyout == null) return; + var taskbarState = _taskbarHelper.GetCurrentState(); _notificationFlyoutXamlHost.Left = 0;