private void NotifyIcon_OnLoaded(object sender, RoutedEventArgs e) { if (!isLoaded) { TrayIcon = DataContext as ManagedShell.WindowsTray.NotifyIcon; if (TrayIcon == null) { return; } applyEffects(); TrayIcon.NotificationBalloonShown += TrayIcon_NotificationBalloonShown; // If a notification was received before we started listening, it will be here. Show the first one that is not expired. NotificationBalloon firstUnexpiredNotification = TrayIcon.MissedNotifications.FirstOrDefault(balloon => balloon.Received.AddMilliseconds(balloon.Timeout) > DateTime.Now); if (firstUnexpiredNotification != null && Host != null && Host.Screen.Primary) { BalloonControl.Show(firstUnexpiredNotification, NotifyIconBorder); TrayIcon.MissedNotifications.Remove(firstUnexpiredNotification); } isLoaded = true; } }
private void NotificationArea_NotificationBalloonShown(object sender, NotificationBalloonEventArgs e) { // This is used to promote unpinned icons to show when the tray is collapsed. if (NotificationArea == null) { return; } ManagedShell.WindowsTray.NotifyIcon notifyIcon = e.Balloon.NotifyIcon; if (NotificationArea.PinnedIcons.Contains(notifyIcon)) { // Do not promote pinned icons (they're already there!) return; } if (promotedIcons.Contains(notifyIcon)) { // Do not duplicate promoted icons return; } promotedIcons.Add(notifyIcon); DispatcherTimer unpromoteTimer = new DispatcherTimer { Interval = TimeSpan.FromMilliseconds(e.Balloon.Timeout + 500) // Keep it around for a few ms for the animation to complete }; unpromoteTimer.Tick += (object sender, EventArgs e) => { if (promotedIcons.Contains(notifyIcon)) { promotedIcons.Remove(notifyIcon); } unpromoteTimer.Stop(); }; unpromoteTimer.Start(); }