feat: add TryGetXXManager to WindowXXManager.

This commit is contained in:
Zhang Dian
2025-03-27 23:36:32 +08:00
parent f6f01ae1d9
commit 89b17752f3
8 changed files with 65 additions and 9 deletions

View File

@@ -1,8 +1,11 @@
using System;
using Avalonia;
using Avalonia.Controls;
using Avalonia.Controls.Notifications;
using Avalonia.Controls.Primitives;
using Avalonia.VisualTree;
using Ursa.Controls;
using WindowNotificationManager = Ursa.Controls.WindowNotificationManager;
namespace Ursa.Demo.Dialogs;
@@ -25,6 +28,13 @@ public partial class CustomDemoDialog : UserControl
_viewModel.NotificationManager = new WindowNotificationManager(visualLayerManager) { MaxItems = 3 };
_viewModel.ToastManager = new WindowToastManager(visualLayerManager) { MaxItems = 3 };
}
WindowNotificationManager.TryGetNotificationManager(visualLayerManager, out var manager);
if (manager is not null && _viewModel is not null)
{
Console.WriteLine(ReferenceEquals(_viewModel.NotificationManager, manager));
manager.Position = NotificationPosition.TopCenter;
}
}
protected override void OnDetachedFromVisualTree(VisualTreeAttachmentEventArgs e)

View File

@@ -1,6 +1,5 @@
using Avalonia;
using Avalonia.Controls;
using Avalonia.LogicalTree;
using Ursa.Controls;
using Ursa.Demo.ViewModels;
@@ -21,12 +20,11 @@ public partial class NotificationDemo : UserControl
{
base.OnAttachedToVisualTree(e);
var topLevel = TopLevel.GetTopLevel(this);
_viewModel.NotificationManager = new WindowNotificationManager(topLevel) { MaxItems = 3 };
}
protected override void OnDetachedFromLogicalTree(LogicalTreeAttachmentEventArgs e)
{
base.OnDetachedFromLogicalTree(e);
_viewModel.NotificationManager?.Uninstall();
WindowNotificationManager.TryGetNotificationManager(topLevel, out var manager);
if (manager is not null)
{
_viewModel.NotificationManager = manager;
}
}
}

View File

@@ -1,16 +1,19 @@
using System;
using System.Collections.ObjectModel;
using Avalonia;
using Avalonia.Controls.Notifications;
using Avalonia.Styling;
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Messaging;
using Ursa.Controls;
using Ursa.Themes.Semi;
using Notification = Ursa.Controls.Notification;
using WindowNotificationManager = Ursa.Controls.WindowNotificationManager;
namespace Ursa.Demo.ViewModels;
public partial class MainViewViewModel : ViewModelBase
{
public WindowNotificationManager? NotificationManager { get; set; }
public MenuViewModel Menus { get; set; } = new MenuViewModel();
private object? _content;
@@ -107,6 +110,10 @@ public partial class MainViewViewModel : ViewModelBase
if (app is not null)
{
app.RequestedThemeVariant = newValue.Theme;
NotificationManager?.Show(
new Notification("Theme changed", $"Theme changed to {newValue.Name}"),
type: NotificationType.Success,
classes: ["Light"]);
}
}

View File

@@ -1,11 +1,28 @@
using Avalonia;
using Avalonia.Controls;
using Ursa.Controls;
using Ursa.Demo.ViewModels;
namespace Ursa.Demo.Views;
public partial class MainView : UserControl
{
private MainViewViewModel? _viewModel;
public MainView()
{
InitializeComponent();
}
protected override void OnAttachedToVisualTree(VisualTreeAttachmentEventArgs e)
{
base.OnAttachedToVisualTree(e);
_viewModel = DataContext as MainViewViewModel;
var topLevel = TopLevel.GetTopLevel(this);
WindowNotificationManager.TryGetNotificationManager(topLevel, out var manager);
if (manager is not null && _viewModel is not null)
{
_viewModel.NotificationManager = manager;
}
}
}

View File

@@ -5,9 +5,12 @@ namespace Ursa.Demo.Views;
public partial class MainWindow : UrsaWindow
{
public WindowNotificationManager? NotificationManager { get; set; }
public MainWindow()
{
InitializeComponent();
NotificationManager = new WindowNotificationManager(this) { MaxItems = 3 };
}
protected override async Task<bool> CanClose()