# Notification 使用文档
本文档介绍 AtomUI Notification 控件的各种使用方式,示例代码摘自 Gallery 演示程序。
> 📖 Gallery 源码位置:`controlgallery/AtomUIGallery/ShowCases/Views/Feedback/NotificationShowCase.axaml`
---
## 前置准备
在 AXAML 中使用 Notification 相关控件,需要引入以下命名空间:
```xml
xmlns:atom="https://atomui.net"
xmlns:antdicons="https://atomui.net/icons/antdesign"
```
在 C# 代码中引入:
```csharp
using AtomUI.Desktop.Controls; // WindowNotificationManager, Notification, NotificationCard
using AtomUI.Icons.AntDesign; // 自定义图标(如 SettingOutlined)
using Avalonia.Controls; // TopLevel
```
---
## 1. 基本用法
Notification 是通过编程式 API 调用的(而非在 AXAML 中声明),需要先创建 `WindowNotificationManager` 实例并挂载到窗口。
### 初始化 NotificationManager
```csharp
// 在控件的 OnAttachedToVisualTree 中初始化
protected override void OnAttachedToVisualTree(VisualTreeAttachmentEventArgs e)
{
base.OnAttachedToVisualTree(e);
var topLevel = TopLevel.GetTopLevel(this);
_notificationManager = new WindowNotificationManager(topLevel)
{
MaxItems = 3 // 最多同时显示 3 条
};
}
// 在 OnDetachedFromVisualTree 中释放资源
protected override void OnDetachedFromVisualTree(VisualTreeAttachmentEventArgs e)
{
base.OnDetachedFromVisualTree(e);
_notificationManager?.Dispose();
}
```
### 弹出简单通知
```csharp
_notificationManager?.Show(new Notification(
"Notification Title",
"Hello, AtomUI/Avalonia!"
));
```
对应 AXAML 按钮触发:
```xml
Show Notification
```
```csharp
private void ShowSimpleNotification(object? sender, RoutedEventArgs e)
{
_notificationManager?.Show(new Notification(
"Notification Title",
"Hello, AtomUI/Avalonia!"
));
}
```
---
## 2. 通知类型
AtomUI 提供四种通知类型,通过 `type` 参数设置:
```xml
Success
Info
Warning
Error
```
```csharp
private void ShowSuccessNotification(object? sender, RoutedEventArgs e)
{
_notificationManager?.Show(new Notification(
type: NotificationType.Success,
title: "Notification Title",
content: "This is the content of the notification."
));
}
private void ShowInfoNotification(object? sender, RoutedEventArgs e)
{
_notificationManager?.Show(new Notification(
type: NotificationType.Information,
title: "Notification Title",
content: "This is the content of the notification."
));
}
private void ShowWarningNotification(object? sender, RoutedEventArgs e)
{
_notificationManager?.Show(new Notification(
type: NotificationType.Warning,
title: "Notification Title",
content: "This is the content of the notification."
));
}
private void ShowErrorNotification(object? sender, RoutedEventArgs e)
{
_notificationManager?.Show(new Notification(
type: NotificationType.Error,
title: "Notification Title",
content: "This is the content of the notification."
));
}
```
**使用场景指引**:
- **Information**:一般性信息通知、系统公告
- **Success**:操作成功的反馈、任务完成
- **Warning**:需要注意的警告信息
- **Error**:操作失败、系统错误
---
## 3. 永不自动关闭
设置 `expiration: TimeSpan.Zero` 使通知仅能通过关闭按钮手动关闭:
```csharp
private void ShowNeverCloseNotification(object? sender, RoutedEventArgs e)
{
_notificationManager?.Show(new Notification(
expiration: TimeSpan.Zero,
title: "Notification Title",
content: "I will never close automatically. This is a purposely very very long description that has many many characters and words."
));
}
```
---
## 4. 弹出位置
支持六种弹出位置,通过 `WindowNotificationManager.Position` 属性设置。每个位置需要一个独立的 Manager 实例:
```csharp
// 初始化不同位置的管理器
_topLeftManager = new WindowNotificationManager(topLevel)
{
Position = NotificationPosition.TopLeft,
MaxItems = 3
};
_topManager = new WindowNotificationManager(topLevel)
{
Position = NotificationPosition.TopCenter,
MaxItems = 3
};
_topRightManager = new WindowNotificationManager(topLevel)
{
Position = NotificationPosition.TopRight,
MaxItems = 3
};
_bottomLeftManager = new WindowNotificationManager(topLevel)
{
Position = NotificationPosition.BottomLeft,
MaxItems = 3
};
_bottomManager = new WindowNotificationManager(topLevel)
{
Position = NotificationPosition.BottomCenter,
MaxItems = 3
};
_bottomRightManager = new WindowNotificationManager(topLevel)
{
Position = NotificationPosition.BottomRight,
MaxItems = 3
};
```
在 AXAML 中提供位置选择按钮:
```xml
Top
Bottom
TopLeft
TopRight
BottomLeft
BottomRight
```
```csharp
private void ShowTopNotification(object? sender, RoutedEventArgs e)
{
_topManager?.Show(new Notification("Notification Top", "Hello, AtomUI/Avalonia!"));
}
private void ShowBottomNotification(object? sender, RoutedEventArgs e)
{
_bottomManager?.Show(new Notification("Notification Bottom", "Hello, AtomUI/Avalonia!"));
}
private void ShowTopLeftNotification(object? sender, RoutedEventArgs e)
{
_topLeftManager?.Show(new Notification("Notification TopLeft", "Hello, AtomUI/Avalonia!"));
}
private void ShowTopRightNotification(object? sender, RoutedEventArgs e)
{
_topRightManager?.Show(new Notification("Notification TopRight", "Hello, AtomUI/Avalonia!"));
}
private void ShowBottomLeftNotification(object? sender, RoutedEventArgs e)
{
_bottomLeftManager?.Show(new Notification("Notification BottomLeft", "Hello, AtomUI/Avalonia!"));
}
private void ShowBottomRightNotification(object? sender, RoutedEventArgs e)
{
_bottomRightManager?.Show(new Notification("Notification BottomRight", "Hello, AtomUI/Avalonia!"));
}
```
> ⚠️ **注意**:不同位置的通知需要使用不同的 `WindowNotificationManager` 实例。不要在同一个 Manager 上频繁切换 `Position` 属性。
---
## 5. 自定义图标
通过 `icon` 参数替换默认的类型图标:
```csharp
private void ShowCustomIconNotification(object? sender, RoutedEventArgs e)
{
_notificationManager?.Show(new Notification(
"Notification Title",
"This is the content of the notification.",
icon: new SettingOutlined()
));
}
```
可以使用 `AtomUI.Icons.AntDesign` 中的任意图标:
```csharp
using AtomUI.Icons.AntDesign;
// 一些常用的图标
icon: new SettingOutlined() // 设置图标
icon: new BellOutlined() // 铃铛图标
icon: new MailOutlined() // 邮件图标
icon: new CalendarOutlined() // 日历图标
```
---
## 6. 带进度条的通知
设置 `showProgress: true` 在通知底部显示倒计时进度条:
```xml
Pause on hover
Don't pause on hover
Show Notification
```
```csharp
private void ShowProgressNotification(object? sender, RoutedEventArgs e)
{
_notificationManager?.Show(new Notification(
type: NotificationType.Information,
title: "Notification Title",
content: "This is the content of the notification.",
showProgress: true
));
}
```
### 控制悬停暂停
配合 `OptionButtonGroup` 切换悬停暂停行为:
```csharp
private void HandleHoverOptionGroupCheckedChanged(object? sender, OptionCheckedChangedEventArgs args)
{
if (_notificationManager is not null)
{
_notificationManager.IsPauseOnHover = args.Index == 0;
}
}
```
---
## 7. 带回调的通知
通过 `onClick` 和 `onClose` 参数设置交互回调:
```csharp
_notificationManager?.Show(new Notification(
title: "可点击的通知",
content: "点击通知区域执行操作",
onClick: () =>
{
// 用户点击通知时执行的逻辑
Console.WriteLine("Notification clicked!");
},
onClose: () =>
{
// 通知关闭时执行的逻辑(无论自动关闭还是手动关闭)
Console.WriteLine("Notification closed!");
}
));
```
---
## 8. 资源管理
`WindowNotificationManager` 实现了 `IDisposable`,使用完毕后务必释放资源:
```csharp
protected override void OnDetachedFromVisualTree(VisualTreeAttachmentEventArgs e)
{
base.OnDetachedFromVisualTree(e);
_basicManager?.Dispose();
_topLeftManager?.Dispose();
_topManager?.Dispose();
_topRightManager?.Dispose();
_bottomLeftManager?.Dispose();
_bottomManager?.Dispose();
_bottomRightManager?.Dispose();
}
```
---
## 常见组合模式
### 异步操作完成通知
```csharp
public async Task SubmitForm()
{
try
{
await _repository.SaveAsync();
_notificationManager?.Show(new Notification(
type: NotificationType.Success,
title: "提交成功",
content: "表单数据已成功保存"
));
}
catch (Exception ex)
{
_notificationManager?.Show(new Notification(
type: NotificationType.Error,
title: "提交失败",
content: $"保存数据时发生错误:{ex.Message}",
expiration: TimeSpan.Zero // 错误通知不自动关闭
));
}
}
```
### 后台任务进度通知
```csharp
_notificationManager?.Show(new Notification(
type: NotificationType.Information,
title: "文件上传中",
content: "正在上传文件,请稍候...",
showProgress: true,
expiration: TimeSpan.FromSeconds(10)
));
```
### 系统级重要通知
```csharp
_notificationManager?.Show(new Notification(
type: NotificationType.Warning,
title: "系统维护通知",
content: "系统将于今晚 22:00 进行维护,届时服务将暂停约 30 分钟。",
expiration: TimeSpan.Zero, // 重要通知不自动关闭
onClose: () => { /* 记录用户已阅读 */ }
));
```