Usar notificações de aplicativo com um aplicativo WPF

Uma notificação de aplicativo é um pop-up de interface do usuário que aparece fora da janela do aplicativo, fornecendo informações ou ações oportunas ao usuário. As notificações podem ser puramente informativas, podem iniciar seu aplicativo quando clicadas ou podem disparar uma ação em segundo plano sem colocar seu aplicativo em primeiro plano.

Captura de tela de uma notificação do aplicativo

Este artigo guia você pelas etapas para criar e enviar uma notificação de aplicativo de um aplicativo WPF e, em seguida, como manipular a ativação quando o usuário interagir com ele. Este artigo usa as APIs SDK do Aplicativo WindowsMicrosoft.Windows.AppNotifications.

Para obter uma visão geral das notificações do aplicativo e das diretrizes para outras estruturas, consulte a visão geral das notificações do aplicativo.

Este artigo aborda as notificações locais. Para obter informações sobre como fornecer notificações de um serviço de nuvem, consulte as notificações por push.

Importante

No momento, não há suporte para notificações para aplicativos com privilégios elevados (administrador).

Pré-requisitos

Configure seu projeto

No arquivo de projeto (.csproj), verifique se o TargetFramework inclui uma estrutura de destino Windows:

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

Adicione o pacote NuGet SDK do Aplicativo Windows:

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

Para aplicativos não empacotados, adicione:

<WindowsPackageType>None</WindowsPackageType>

Registrar-se para notificações de aplicativo

Em seu App.xaml.cs, registre-se para receber notificações no Startup manipulador de eventos. Você deve registrar seu manipulador NotificationInvokedantes de chamar o Registro.

Primeiro, atualize App.xaml para usar um Startup manipulador 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>

Em seguida, implemente a lógica de inicialização e tratamento de notificação.

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

Você deve ligar Register antes de ligar AppInstance.GetCurrent().GetActivatedEventArgs(). O NotificationInvoked manipulador deve ser registrado antes de Register() ser chamado.

Observação

Para aplicativos não empacotados, Register() configura automaticamente o registro do servidor COM que permite que Windows inicie seu aplicativo quando uma notificação é clicada. Você não precisa configurar a ativação COM ou um AUMID manualmente.

Enviar uma notificação do aplicativo

Use AppNotificationBuilder para construir o conteúdo da notificação e 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 obter informações sobre como adicionar botões, imagens, entradas e outros conteúdos avançados às notificações, consulte o conteúdo da notificação do aplicativo.

Configuração do aplicativo em pacote

Para aplicativos de WPF não empacotados, Register() manipula automaticamente o registro COM. Para aplicativos empacotados (MSIX), você precisa 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 arquivo executável (por exemplo, YourApp.exe), não um caminho de subdiretório.