private void OnNotificationViewUnloaded(object sender, EventArgs e) { var notificationControl = sender as NotificationView; if (notificationControl == null) { return; } var notification = notificationControl.DataContext as INotification; if (notification == null) { var notificationViewModel = notificationControl.DataContext as NotificationViewModel; if (notificationViewModel == null) { notificationViewModel = notificationControl.ViewModel as NotificationViewModel; } if (notificationViewModel != null) { notification = notificationViewModel.Notification; } } if (notification != null) { CurrentNotifications.Remove(notification); ClosedNotification?.Invoke(this, new NotificationEventArgs(notification)); } }
/// <summary>Handles opening of views that are notification messages</summary> /// <param name="context">The request context.</param> /// <param name="overrideTimeout">Overrides the theme's default notification timeout.</param> /// <returns>True of view was handled</returns> protected virtual bool HandleNotificationMessage(RequestContext context, TimeSpan?overrideTimeout = null) { var notificationResult = context.Result as NotificationMessageResult; if (notificationResult == null) { return(false); } var wrapper = new NotificationViewResultWrapper { Model = notificationResult.Model }; if (notificationResult.View != null) { wrapper.View = notificationResult.View; notificationResult.View.DataContext = wrapper.Model; } else { wrapper.View = Controller.LoadView(StandardViews.Notification); if (wrapper.View != null) { wrapper.View.DataContext = wrapper.Model; } } if (NotificationSort == NotificationSort.NewestFirst) { CurrentNotifications.Add(wrapper); } else { CurrentNotifications.Insert(0, wrapper); } while (CurrentNotifications.Count > MaximumNotificationCount) { // Handling this like a stack, popping the oldest one off if (NotificationSort == NotificationSort.NewestFirst) { CurrentNotifications.RemoveAt(0); } else { CurrentNotifications.RemoveAt(CurrentNotifications.Count - 1); } } CurrentNotificationsCount = CurrentNotifications.Count; RaiseEvent(new RoutedEventArgs(NotificationChangedEvent)); var timeout = overrideTimeout ?? NotificationTimeout; wrapper.InternalTimer = new Timer(state => Application.Current.Dispatcher.BeginInvoke(new Action(() => { CurrentNotifications.Remove(wrapper); CurrentNotificationsCount = CurrentNotifications.Count; })), null, timeout, new TimeSpan(-1)); return(true); }