diff options
Diffstat (limited to 'Software/Visual_Studio/StubsUtils/Notifications.Wpf/Controls/NotificationArea.cs')
| -rw-r--r-- | Software/Visual_Studio/StubsUtils/Notifications.Wpf/Controls/NotificationArea.cs | 150 |
1 files changed, 150 insertions, 0 deletions
diff --git a/Software/Visual_Studio/StubsUtils/Notifications.Wpf/Controls/NotificationArea.cs b/Software/Visual_Studio/StubsUtils/Notifications.Wpf/Controls/NotificationArea.cs new file mode 100644 index 000000000..7163e46f4 --- /dev/null +++ b/Software/Visual_Studio/StubsUtils/Notifications.Wpf/Controls/NotificationArea.cs @@ -0,0 +1,150 @@ +using System; +using System.Collections; +using System.Linq; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Media; +using System.Windows.Threading; + +namespace Notifications.Wpf.Controls +{ + public class NotificationArea : Control + { + + + + public NotificationPosition Position + { + get { return (NotificationPosition)GetValue(PositionProperty); } + set { SetValue(PositionProperty, value); } + } + + // Using a DependencyProperty as the backing store for Position. This enables animation, styling, binding, etc... + public static readonly DependencyProperty PositionProperty = + DependencyProperty.Register("Position", typeof(NotificationPosition), typeof(NotificationArea), new PropertyMetadata(NotificationPosition.BottomRight)); + + + public int MaxItems + { + get { return (int)GetValue(MaxItemsProperty); } + set { SetValue(MaxItemsProperty, value); } + } + + public static readonly DependencyProperty MaxItemsProperty = + DependencyProperty.Register("MaxItems", typeof(int), typeof(NotificationArea), new PropertyMetadata(int.MaxValue)); + + private IList _items; + + public NotificationArea() + { + NotificationManager.AddArea(this); + } + + static NotificationArea() + { + DefaultStyleKeyProperty.OverrideMetadata(typeof(NotificationArea), + new FrameworkPropertyMetadata(typeof(NotificationArea))); + } + + public override void OnApplyTemplate() + { + base.OnApplyTemplate(); + var itemsControl = GetTemplateChild("PART_Items") as Panel; + _items = itemsControl?.Children; + } + +#if NET40 + public void Show(object content, TimeSpan expirationTime, Action onClick, Action onClose) +#else + public async void Show(object content, TimeSpan expirationTime, Action onClick, Action onClose) +#endif + { + var notification = new Notification + { + Content = content + }; + + notification.MouseLeftButtonDown += (sender, args) => + { + if (onClick != null) + { + onClick.Invoke(); + (sender as Notification)?.Close(); + } + }; + notification.NotificationClosed += (sender, args) => onClose?.Invoke(); + notification.NotificationClosed += OnNotificationClosed; + + if (!IsLoaded) + { + return; + } + + var w = Window.GetWindow(this); + var x = PresentationSource.FromVisual(w); + if (x == null) + { + return; + } + + lock (_items) + { + _items.Add(notification); + + if (_items.OfType<Notification>().Count(i => !i.IsClosing) > MaxItems) + { + _items.OfType<Notification>().First(i => !i.IsClosing).Close(); + } + } + +#if NET40 + DelayExecute(expirationTime, () => + { +#else + if (expirationTime == TimeSpan.MaxValue) + { + return; + } + await Task.Delay(expirationTime); +#endif + notification.Close(); +#if NET40 + }); +#endif + } + + private void OnNotificationClosed(object sender, RoutedEventArgs routedEventArgs) + { + var notification = sender as Notification; + _items.Remove(notification); + } + +#if NET40 + private static void DelayExecute(TimeSpan delay, Action actionToExecute) + { + if (actionToExecute != null) + { + var timer = new DispatcherTimer + { + Interval = delay + }; + timer.Tick += (sender, args) => + { + timer.Stop(); + actionToExecute(); + }; + timer.Start(); + } + } +#endif + } + + public enum NotificationPosition + { + TopLeft, + TopRight, + BottomLeft, + BottomRight + } +}
\ No newline at end of file |
