Getting Started

Installation

// WPF (includes Core automatically)
Install-Package Notification.Wpf

// Or use Core directly for cross-platform
Install-Package Notification.CoreUI

// Platform-specific
Install-Package Notification.Console
Install-Package Notification.Avalonia
Install-Package Notification.Maui

DI Registration

WPF

services.AddWpfNotifications(config =>
{
    config.DefaultExpirationTime = TimeSpan.FromSeconds(5);
    config.MessagePosition = NotificationPosition.BottomRight;
});
Full App.xaml.cs example
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;

public sealed partial class App
{
    public static IServiceProvider Services => Hosting.Services;
    private static IHost __Hosting;

    public static IHost Hosting => __Hosting ??=
        CreateHostBuilder(Environment.GetCommandLineArgs()).Build();

    public static IHostBuilder CreateHostBuilder(string[] args) => Host
       .CreateDefaultBuilder(args)
       .ConfigureServices(ConfigureServices);

    private static void ConfigureServices(HostBuilderContext host, IServiceCollection services)
    {
        services.AddWpfNotifications(config =>
        {
            config.DefaultExpirationTime = TimeSpan.FromSeconds(5);
        });
    }

    protected override async void OnStartup(StartupEventArgs e)
    {
        var host = Hosting;
        base.OnStartup(e);
        await host.StartAsync();
    }

    protected override async void OnExit(ExitEventArgs e)
    {
        base.OnExit(e);
        using var host = Hosting;
        await host.StopAsync();
    }
}

Console

services.AddConsoleNotifications();

Avalonia

var services = new ServiceCollection();
services.AddAvaloniaNotifications();
var provider = services.BuildServiceProvider();

var manager = provider.GetRequiredService<INotificationService>() as AvaloniaNotificationManager;
manager?.SetHost(this); // pass TopLevel

MAUI

// In MauiProgram.cs
public static MauiApp CreateMauiApp()
{
    MauiAppBuilder builder = MauiApp.CreateBuilder();
    builder
        .UseMauiApp<App>()
        .UseMauiCommunityToolkit()    // required by Notification.Maui
        .UseMauiNotifications(config =>
        {
            config.DefaultExpirationTime = TimeSpan.FromSeconds(3);
        });

    return builder.Build();
}

Windows Snackbar: if you need Snackbar (action buttons) on Windows, add options.SetShouldEnableSnackbarOnWindows(true) inside .UseMauiCommunityToolkit(options => { ... }). This may cause "No COM servers are registered" in Blazor Hybrid or unpackaged apps. Without this option, simple Toast notifications still work on all platforms.

WPF — Static API (no DI)

public static class Notifier
{
    private static readonly NotificationManager _manager = new();

    public static void Show(string title, string message, NotificationType type)
    {
        _manager.Show(title, message, type);
    }
}

First Notification

Builder API (cross-platform)

INotificationService service = /* from DI */;

service.Show(NotificationBuilder
    .Create("Title", "Message")
    .AsSuccess()
    .Build());

WPF Classic API

var notificationManager = new NotificationManager();
notificationManager.Show("Title", "Message", NotificationType.Success);

In-Window Notifications (WPF)

XAML:

xmlns:notifications="clr-namespace:Notification.Wpf.Controls;assembly=Notification.Wpf"

<notifications:NotificationArea x:Name="WindowArea" Position="TopLeft" MaxItems="3"/>

Code:

notificationManager.Show("Title", "Message", NotificationType.Warning, "WindowArea");

Progress Bar

using var progress = notificationManager.ShowProgressBar("Processing...", showCancelButton: true);

for (var i = 0; i <= 100; i++)
{
    progress.Cancel.ThrowIfCancellationRequested();
    progress.Report(new NotificationProgressReport(i, $"Step {i}", "With progress", true));
    await Task.Delay(TimeSpan.FromSeconds(0.02), progress.Cancel).ConfigureAwait(false);
}