Use notificações de aplicação com uma aplicação WPF

Uma notificação de aplicação é um pop-up na interface que aparece fora da janela da sua aplicação, fornecendo informações ou ações oportunas ao utilizador. As notificações podem ser puramente informativas, podem abrir a sua aplicação ao clicar, ou podem desencadear uma ação em segundo plano sem trazer a aplicação para o primeiro plano.

Captura de ecrã de uma notificação de aplicação

Este artigo explica-te os passos para criar e enviar uma notificação de aplicação a partir de uma aplicação WPF, e depois tratar da ativação quando o utilizador interagir com ela. Este artigo utiliza as APIs SDK de Aplicações WindowsMicrosoft.Windows.AppNotifications.

Para uma visão geral das notificações de aplicações e orientações para outros frameworks, consulte Visão geral das notificações de aplicações.

Este artigo aborda as notificações locais. Para informações sobre como entregar notificações a partir de um serviço na cloud, consulte Notificações Push.

Importante

As notificações para aplicações elevadas (de administrador) não são atualmente suportadas.

Pré-requisitos

  • Uma aplicação WPF direcionada para .NET 6 ou versões posteriores
  • O pacote NuGet SDK de Aplicações Windows (Microsoft.WindowsAppSDK)

Configure o seu projeto

No ficheiro do teu projeto (.csproj), certifica-te de que o TargetFramework inclui um framework de Windows alvo:

<TargetFramework>net9.0-windows10.0.19041.0</TargetFramework>

Adicionar o pacote NuGet do SDK de Aplicações Windows:

<PackageReference Include="Microsoft.WindowsAppSDK" Version="1.7.250310001" />

Para aplicações não embaladas, adicione:

<WindowsPackageType>None</WindowsPackageType>

Registe-se para receber notificações de aplicações

No teu App.xaml.cs, regista-te para notificações no Startup gestor de eventos. Deve registar o seu NotificationInvoked handler antes de chamar Registar.

Primeiro, atualize App.xaml para usar um Startup gestor de eventos em vez de StartupUri:

App.xaml

<Application x:Class="WpfNotifications.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             Startup="OnStartup">
</Application>

Depois, implemente a lógica de arranque e gestão de notificações:

App.xaml.cs

using System.Windows;
using Microsoft.Windows.AppNotifications;

namespace WpfNotifications;

public partial class App : Application
{
    private void OnStartup(object sender, StartupEventArgs e)
    {
        // Register the notification handler before calling Register
        AppNotificationManager.Default.NotificationInvoked += OnNotificationInvoked;
        AppNotificationManager.Default.Register();

        // Show the main window
        var mainWindow = new MainWindow();
        mainWindow.Show();
    }

    private void OnNotificationInvoked(
        AppNotificationManager sender, 
        AppNotificationActivatedEventArgs args)
    {
        // NotificationInvoked is raised on a background thread,
        // so dispatch to the UI thread for any UI updates
        Current.Dispatcher.Invoke(() =>
        {
            // Parse args.Argument to determine what action to take.
            // args.Argument contains the arguments from the notification
            // or button that was clicked, as key=value pairs separated
            // by '&', for example "action=reply&conversationId=9813".
        });
    }

    protected override void OnExit(ExitEventArgs e)
    {
        AppNotificationManager.Default.Unregister();
        base.OnExit(e);
    }
}

Importante

Tens de ligar Register antes de ligar AppInstance.GetCurrent().GetActivatedEventArgs(). O NotificationInvoked handler deve estar registado antes de Register() ser chamado.

Observação

Para aplicações não empacotadas, o Register() configura automaticamente o registo do servidor COM, que permite Windows iniciar a sua aplicação quando uma notificação é clicada. Não precisas de configurar manualmente a ativação do COM ou um AUMID.

Enviar uma notificação de aplicação

Use o AppNotificationBuilder para construir o conteúdo das notificações e o AppNotificationManager.Show para enviar uma notificação.

MainWindow.xaml.cs

using Microsoft.Windows.AppNotifications;
using Microsoft.Windows.AppNotifications.Builder;

private void SendNotification()
{
    var notification = new AppNotificationBuilder()
        .AddArgument("action", "viewConversation")
        .AddArgument("conversationId", "9813")
        .AddText("Andrew sent you a picture")
        .AddText("Check this out, The Enchantments in Washington!")
        .BuildNotification();

    AppNotificationManager.Default.Show(notification);
}

Para informações sobre como adicionar botões, imagens, entradas e outro conteúdo rico às suas notificações, consulte Conteúdo de notificações da aplicação.

Configuração de aplicação empacotada

Para aplicações de WPF não embaladas, Register() trata automaticamente do registo COM. Para aplicações empacotadas (MSIX), precisa de adicionar as seguintes extensões ao seu Package.appxmanifest:

<Package
  xmlns:com="http://schemas.microsoft.com/appx/manifest/com/windows10"
  xmlns:desktop="http://schemas.microsoft.com/appx/manifest/desktop/windows10"
  IgnorableNamespaces="... com desktop">

  <Applications>
    <Application>
      <Extensions>

        <!--Specify which CLSID to activate when notification is clicked-->
        <desktop:Extension Category="windows.toastNotificationActivation">
          <desktop:ToastNotificationActivation 
            ToastActivatorCLSID="YOUR-GUID-HERE" />
        </desktop:Extension>

        <!--Register COM CLSID-->
        <com:Extension Category="windows.comServer">
          <com:ComServer>
            <com:ExeServer 
              Executable="YourApp.exe" 
              Arguments="----AppNotificationActivated:" 
              DisplayName="YourApp">
              <com:Class Id="YOUR-GUID-HERE" />
            </com:ExeServer>
          </com:ComServer>
        </com:Extension>

      </Extensions>
    </Application>
  </Applications>
</Package>

Importante

O Executable atributo deve conter apenas o nome do ficheiro executável (por exemplo, YourApp.exe), e não um caminho de subdiretório.