Browse Source

Merge pull request #9277 from emmauss/notification

Allow NotifcationManager to be created on demand
pull/9434/head
Max Katz 4 years ago
committed by GitHub
parent
commit
379e2b56e5
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 12
      samples/ControlCatalog/MainWindow.xaml.cs
  2. 15
      samples/ControlCatalog/Pages/NotificationsPage.xaml.cs
  3. 32
      samples/ControlCatalog/ViewModels/MainWindowViewModel.cs
  4. 29
      samples/ControlCatalog/ViewModels/NotificationViewModel.cs
  5. 17
      src/Avalonia.Controls/Notifications/WindowNotificationManager.cs
  6. 1
      src/Avalonia.Controls/TopLevel.cs

12
samples/ControlCatalog/MainWindow.xaml.cs

@ -11,23 +11,13 @@ namespace ControlCatalog
{ {
public class MainWindow : Window public class MainWindow : Window
{ {
private WindowNotificationManager _notificationArea;
private NativeMenu? _recentMenu; private NativeMenu? _recentMenu;
public MainWindow() public MainWindow()
{ {
this.InitializeComponent(); this.InitializeComponent();
//Renderer.DrawFps = true; DataContext = new MainWindowViewModel();
//Renderer.DrawDirtyRects = Renderer.DrawFps = true;
_notificationArea = new WindowNotificationManager(this)
{
Position = NotificationPosition.TopRight,
MaxItems = 3
};
DataContext = new MainWindowViewModel(_notificationArea);
_recentMenu = ((NativeMenu.GetMenu(this)?.Items[0] as NativeMenuItem)?.Menu?.Items[2] as NativeMenuItem)?.Menu; _recentMenu = ((NativeMenu.GetMenu(this)?.Items[0] as NativeMenuItem)?.Menu?.Items[2] as NativeMenuItem)?.Menu;
} }

15
samples/ControlCatalog/Pages/NotificationsPage.xaml.cs

@ -1,18 +1,33 @@
using Avalonia;
using Avalonia.Controls; using Avalonia.Controls;
using Avalonia.Markup.Xaml; using Avalonia.Markup.Xaml;
using ControlCatalog.ViewModels;
namespace ControlCatalog.Pages namespace ControlCatalog.Pages
{ {
public class NotificationsPage : UserControl public class NotificationsPage : UserControl
{ {
private NotificationViewModel _viewModel;
public NotificationsPage() public NotificationsPage()
{ {
this.InitializeComponent(); this.InitializeComponent();
_viewModel = new NotificationViewModel();
DataContext = _viewModel;
} }
private void InitializeComponent() private void InitializeComponent()
{ {
AvaloniaXamlLoader.Load(this); AvaloniaXamlLoader.Load(this);
} }
protected override void OnAttachedToVisualTree(VisualTreeAttachmentEventArgs e)
{
base.OnAttachedToVisualTree(e);
_viewModel.NotificationManager = new Avalonia.Controls.Notifications.WindowNotificationManager(VisualRoot as TopLevel);
}
} }
} }

32
samples/ControlCatalog/ViewModels/MainWindowViewModel.cs

@ -24,25 +24,8 @@ namespace ControlCatalog.ViewModels
private bool _preferSystemChromeEnabled; private bool _preferSystemChromeEnabled;
private double _titleBarHeight; private double _titleBarHeight;
public MainWindowViewModel(IManagedNotificationManager notificationManager) public MainWindowViewModel()
{ {
_notificationManager = notificationManager;
ShowCustomManagedNotificationCommand = MiniCommand.Create(() =>
{
NotificationManager.Show(new NotificationViewModel(NotificationManager) { Title = "Hey There!", Message = "Did you know that Avalonia now supports Custom In-Window Notifications?" });
});
ShowManagedNotificationCommand = MiniCommand.Create(() =>
{
NotificationManager.Show(new Avalonia.Controls.Notifications.Notification("Welcome", "Avalonia now supports Notifications.", NotificationType.Information));
});
ShowNativeNotificationCommand = MiniCommand.Create(() =>
{
NotificationManager.Show(new Avalonia.Controls.Notifications.Notification("Error", "Native Notifications are not quite ready. Coming soon.", NotificationType.Error));
});
AboutCommand = MiniCommand.CreateFromTask(async () => AboutCommand = MiniCommand.CreateFromTask(async () =>
{ {
var dialog = new AboutAvaloniaDialog(); var dialog = new AboutAvaloniaDialog();
@ -52,7 +35,6 @@ namespace ControlCatalog.ViewModels
await dialog.ShowDialog(mainWindow); await dialog.ShowDialog(mainWindow);
} }
}); });
ExitCommand = MiniCommand.Create(() => ExitCommand = MiniCommand.Create(() =>
{ {
(App.Current?.ApplicationLifetime as IClassicDesktopStyleApplicationLifetime)?.Shutdown(); (App.Current?.ApplicationLifetime as IClassicDesktopStyleApplicationLifetime)?.Shutdown();
@ -143,24 +125,12 @@ namespace ControlCatalog.ViewModels
set { this.RaiseAndSetIfChanged(ref _windowStates, value); } set { this.RaiseAndSetIfChanged(ref _windowStates, value); }
} }
public IManagedNotificationManager NotificationManager
{
get { return _notificationManager; }
set { this.RaiseAndSetIfChanged(ref _notificationManager, value); }
}
public bool IsMenuItemChecked public bool IsMenuItemChecked
{ {
get { return _isMenuItemChecked; } get { return _isMenuItemChecked; }
set { this.RaiseAndSetIfChanged(ref _isMenuItemChecked, value); } set { this.RaiseAndSetIfChanged(ref _isMenuItemChecked, value); }
} }
public MiniCommand ShowCustomManagedNotificationCommand { get; }
public MiniCommand ShowManagedNotificationCommand { get; }
public MiniCommand ShowNativeNotificationCommand { get; }
public MiniCommand AboutCommand { get; } public MiniCommand AboutCommand { get; }
public MiniCommand ExitCommand { get; } public MiniCommand ExitCommand { get; }

29
samples/ControlCatalog/ViewModels/NotificationViewModel.cs

@ -6,16 +6,33 @@ namespace ControlCatalog.ViewModels
{ {
public class NotificationViewModel public class NotificationViewModel
{ {
public NotificationViewModel(INotificationManager manager) public WindowNotificationManager? NotificationManager { get; set; }
public NotificationViewModel()
{ {
ShowCustomManagedNotificationCommand = MiniCommand.Create(() =>
{
NotificationManager?.Show(new NotificationViewModel() { Title = "Hey There!", Message = "Did you know that Avalonia now supports Custom In-Window Notifications?" , NotificationManager = NotificationManager});
});
ShowManagedNotificationCommand = MiniCommand.Create(() =>
{
NotificationManager?.Show(new Avalonia.Controls.Notifications.Notification("Welcome", "Avalonia now supports Notifications.", NotificationType.Information));
});
ShowNativeNotificationCommand = MiniCommand.Create(() =>
{
NotificationManager?.Show(new Avalonia.Controls.Notifications.Notification("Error", "Native Notifications are not quite ready. Coming soon.", NotificationType.Error));
});
YesCommand = MiniCommand.Create(() => YesCommand = MiniCommand.Create(() =>
{ {
manager.Show(new Avalonia.Controls.Notifications.Notification("Avalonia Notifications", "Start adding notifications to your app today.")); NotificationManager?.Show(new Avalonia.Controls.Notifications.Notification("Avalonia Notifications", "Start adding notifications to your app today."));
}); });
NoCommand = MiniCommand.Create(() => NoCommand = MiniCommand.Create(() =>
{ {
manager.Show(new Avalonia.Controls.Notifications.Notification("Avalonia Notifications", "Start adding notifications to your app today. To find out more visit...")); NotificationManager?.Show(new Avalonia.Controls.Notifications.Notification("Avalonia Notifications", "Start adding notifications to your app today. To find out more visit..."));
}); });
} }
@ -26,5 +43,11 @@ namespace ControlCatalog.ViewModels
public MiniCommand NoCommand { get; } public MiniCommand NoCommand { get; }
public MiniCommand ShowCustomManagedNotificationCommand { get; }
public MiniCommand ShowManagedNotificationCommand { get; }
public MiniCommand ShowNativeNotificationCommand { get; }
} }
} }

17
src/Avalonia.Controls/Notifications/WindowNotificationManager.cs

@ -3,11 +3,10 @@ using System.Collections;
using System.Linq; using System.Linq;
using System.Reactive.Linq; using System.Reactive.Linq;
using System.Threading.Tasks; using System.Threading.Tasks;
using Avalonia.Controls.Metadata;
using Avalonia.Controls.Primitives; using Avalonia.Controls.Primitives;
using Avalonia.Rendering; using Avalonia.Rendering;
using Avalonia.Data;
using Avalonia.VisualTree; using Avalonia.VisualTree;
using Avalonia.Controls.Metadata;
namespace Avalonia.Controls.Notifications namespace Avalonia.Controls.Notifications
{ {
@ -55,20 +54,12 @@ namespace Avalonia.Controls.Notifications
/// Initializes a new instance of the <see cref="WindowNotificationManager"/> class. /// Initializes a new instance of the <see cref="WindowNotificationManager"/> class.
/// </summary> /// </summary>
/// <param name="host">The window that will host the control.</param> /// <param name="host">The window that will host the control.</param>
public WindowNotificationManager(Window host) public WindowNotificationManager(TopLevel? host)
{ {
if (VisualChildren.Count != 0) if (host != null)
{ {
Install(host); Install(host);
} }
else
{
Observable.FromEventPattern<TemplateAppliedEventArgs>(host, nameof(host.TemplateApplied)).Take(1)
.Subscribe(_ =>
{
Install(host);
});
}
UpdatePseudoClasses(Position); UpdatePseudoClasses(Position);
} }
@ -151,7 +142,7 @@ namespace Avalonia.Controls.Notifications
/// of the host <see cref="Window"/>. /// of the host <see cref="Window"/>.
/// </summary> /// </summary>
/// <param name="host">The <see cref="Window"/> that will be the host.</param> /// <param name="host">The <see cref="Window"/> that will be the host.</param>
private void Install(Window host) private void Install(TemplatedControl host)
{ {
var adornerLayer = host.FindDescendantOfType<VisualLayerManager>()?.AdornerLayer; var adornerLayer = host.FindDescendantOfType<VisualLayerManager>()?.AdornerLayer;

1
src/Avalonia.Controls/TopLevel.cs

@ -1,6 +1,7 @@
using System; using System;
using System.Reactive.Linq; using System.Reactive.Linq;
using Avalonia.Controls.Metadata; using Avalonia.Controls.Metadata;
using Avalonia.Controls.Notifications;
using Avalonia.Controls.Platform; using Avalonia.Controls.Platform;
using Avalonia.Controls.Primitives; using Avalonia.Controls.Primitives;
using Avalonia.Input; using Avalonia.Input;

Loading…
Cancel
Save