Compartir vía


Usar el SDK de Aplicaciones para Windows en una aplicación de Windows Forms (WinForms)

El SDK de Aplicaciones para Windows es la siguiente evolución en la plataforma de desarrollo de aplicaciones de Windows. Pero en este tema se muestra cómo puede usar las API de SDK de Aplicaciones para Windows (y las API de Windows Runtime) en una aplicación de Windows Forms (WinForms).

  • En muchos casos, querrá volver a crear la aplicación WinForms en forma de una aplicación de biblioteca de interfaz de usuario de Windows 3 (WinUI 3). Solo una de las ventajas de pasar a WinUI 3 es tener acceso a la Sistema Fluent Design (consulte también Diseño y código de aplicaciones de Windows). Y WinUI 3 forma parte del SDK de Aplicaciones para Windows, por lo que, naturalmente, una aplicación winUI 3 también puede usar las demás características y API de SDK de Aplicaciones para Windows. En este tema no se trata el proceso de migración de la aplicación WinForms a WinUI 3.
  • Pero si encuentra que usa características de WinForms que aún no están disponibles en WinUI 3, todavía puede usar SDK de Aplicaciones para Windows características (como ciclo de vida de la aplicación, MRT Core, DWriteCore y otros) en la aplicación WinForms. En este tema te mostramos cómo.

Y en caso de que aún no tenga un proyecto de WinForms existente(o quiera practicar el proceso), este tema incluye pasos para crear un proyecto de WinForms para poder seguirlo y configurarlo para llamar a SDK de Aplicaciones para Windows API.

Requisitos previos

  1. Instalación de herramientas para el SDK de Aplicaciones para Windows.
  2. En este tema se tratan las aplicaciones winForms empaquetadas y no empaquetadas. Si la aplicación WinForms está desempaquetada (que las aplicaciones winForms son de forma predeterminada), asegúrese de que todas las dependencias de las aplicaciones no empaquetadas estén instaladas (consulte SDK de Aplicaciones para Windows guía de implementación para aplicaciones dependientes del marco empaquetadas con ubicación externa o sin empaquetar). Una forma rápida de hacerlo es visitar Las descargas más recientes para la SDK de Aplicaciones para Windows, luego descargar y descomprimir y ejecutar una de las descargas estables en tiempo de ejecución de la versión estable.

Importante

La versión del runtime que instale debe coincidir con la versión del paquete NuGet Microsoft.WindowsAppSDK que instalará en un paso posterior.

Para obtener más información sobre los términos desempaquetados y empaquetados, consulta Ventajas y desventajas del empaquetado de la aplicación.

Cree un proyecto de WinForms si aún no tiene uno

Si ya tiene un proyecto de WinForms, puede pasar a la sección siguiente.

  1. En Visual Studio, cree un nuevo proyecto de aplicación de Windows Forms de C# (que es un proyecto de .NET). Tenga cuidado de elegir la plantilla de proyecto con el nombre exacto Windows Forms Aplicación y no la aplicación de Windows Forms (.NET Framework).
  2. Asigne un nombre al proyecto y acepte las opciones predeterminadas.

Ahora tiene un proyecto que compila una aplicación WinForms sin empaquetar.

Configuración del proyecto de WinForms para SDK de Aplicaciones para Windows compatibilidad

En primer lugar, editaremos el archivo del proyecto.

  1. En Explorador de soluciones, haga clic con el botón derecho en el proyecto y elija Editar archivo de proyecto.

  2. Este paso permite llamar a las API de Windows Runtime (WinRT) (incluidas las API de SDK de Aplicaciones para Windows). Dentro del elemento PropertyGroup se encuentra el elemento TargetFramework , que se establece en un valor como net6.0. Anexe a ese valor de marco de destino un moniker (en concreto, un Moniker de la plataforma de destino). Por ejemplo, usa lo siguiente si la aplicación tiene como destino Windows 10, versión 2004:

    <TargetFramework>net6.0-windows10.0.19041.0</TargetFramework>
    
  3. También dentro del elemento PropertyGroup , agregue un elemento RuntimeIdentifiers , de la siguiente manera:

    <RuntimeIdentifiers>win10-x86;win10-x64;win10-arm64</RuntimeIdentifiers>
    
  4. De forma predeterminada, una aplicación WinForms está desempaquetada (lo que significa que no está instalada mediante MSIX). Una aplicación sin empaquetar debe inicializar el entorno de ejecución de SDK de Aplicaciones para Windows antes de usar cualquier otra característica del SDK de Aplicaciones para Windows. Puedes hacerlo automáticamente cuando la aplicación se inicia a través de la inicialización automática. Simplemente establezca (también dentro del elemento PropertyGroup ) la WindowsPackageType propiedad del proyecto correctamente, de la siguiente manera:

    <WindowsPackageType>None</WindowsPackageType>
    

    Si tiene necesidades avanzadas (como el control de errores personalizado o para cargar una versión específica del SDK de Aplicaciones para Windows), en lugar de la inicialización automática, puede llamar explícitamente a la API del programa previo; para obtener más información, consulte Uso del entorno de ejecución de SDK de Aplicaciones para Windows para aplicaciones empaquetadas con ubicación externa o sin empaquetar.

  5. Guarda y cierra el archivo de proyecto.

A continuación, instalaremos el SDK de Aplicaciones para Windows paquete NuGet en el proyecto.

  1. En Explorador de soluciones, haga clic con el botón derecho en el nodo Dependencias del proyecto y elija Administrar paquetes Nuget....
  2. En la ventana Administrador de paquetes NuGet, seleccione la pestaña Examinar e instale el paquete Estable Microsoft.WindowsAppSDKmás reciente.

Usar algunas características de SDK de Aplicaciones para Windows en la aplicación WinForms

En esta sección se ofrece un ejemplo muy sencillo de llamar a las API de SDK de Aplicaciones para Windows desde una aplicación WinForms. Usa la característica MRT Core (consulte Administración de recursos con MRT Core). Si este ejemplo funciona para el proyecto de WinForms (y si ha creado uno nuevo para este tutorial, lo hará), puede seguir estos pasos.

  1. Abra Form1.cs (con el comando Ver Designer) y arrastre un botón y una etiqueta fuera del cuadro de herramientas y al diseñador.

  2. Haga doble clic en el botón1 para generar un controlador de eventos.

  3. Ahora agregaremos código que usa la clase ResourceManager en el SDK de Aplicaciones para Windows para cargar un recurso de cadena.

    1. Agregue un nuevo elemento Resources File (.resw) al proyecto (déjelo con el nombre predeterminado resources.resw).

    2. Con el archivo de recursos abierto en el editor, cree un nuevo recurso de cadena con las siguientes propiedades.

      • Nombre: Mensaje
      • Valor: ¡Hola, recursos!
    3. Guarde y cierre el archivo de recursos.

    4. Abra Form1.cs (con el comando Ver código ) y edite el controlador de eventos para que tenga este aspecto:

    private void button1_Click(object sender, EventArgs e)
    {
        // Construct a resource manager using the resource index generated during build.
        var manager =
            new Microsoft.Windows.ApplicationModel.Resources.ResourceManager();
    
        // Look up a string in the resources file using the string's name.
        label1.Text = manager.MainResourceMap.GetValue("Resources/Message").ValueAsString;
    }
    
  4. Compile el proyecto y ejecute la aplicación. Haga clic en el botón para ver la cadena Hello, resources! mostrada.

Sugerencia

Si en tiempo de ejecución ves un cuadro de mensaje que indica que la aplicación necesita una versión determinada de Windows App Runtime y pregunta si quieres instalarla ahora, haz clic en . Eso le llevará a las descargas más recientes para el SDK de Aplicaciones para Windows. Para obtener más información, consulta la sección Requisitos previos anterior.

Consulte También Arquitectura en tiempo de ejecución para obtener más información sobre la dependencia del paquete de Framework que toma la aplicación cuando usa la SDK de Aplicaciones para Windows y los componentes adicionales necesarios para trabajar en una aplicación sin empaquetar.

Empaquetar e implementar la aplicación WinForms con MSIX

Algunas características y API de Windows (incluidas las API de notificaciones de SDK de Aplicaciones para Windows) requieren que la aplicación tenga la identidad del paquete en tiempo de ejecución (es decir, la aplicación debe empaquetarse). Para más información, consulte Características que requieren identidad del paquete.

  1. En Explorador de soluciones en Visual Studio, haga clic con el botón derecho en la solución y elija Agregar>nuevo proyecto....
  2. En el cuadro de diálogo Agregar un nuevo proyecto , busque empaquetado, elija la plantilla de proyecto Proyecto de empaquetado de aplicaciones de Windows de C# y haga clic en Siguiente.
  3. Asigne un nombre al proyecto y haga clic en Crear.
  4. Queremos especificar qué aplicaciones de la solución se incluirán en el paquete. Por lo tanto, en el proyecto de empaquetado (no en el proyecto WinForms), haga clic con el botón derecho en el nodo Dependencias y elija Agregar referencia de proyecto....
  5. En la lista de proyectos de la solución, elija el proyecto winForms y haga clic en Aceptar.
  6. Expandael nodoAplicaciones de dependencias> del proyecto de empaquetado y confirme que se hace referencia al proyecto de WinForms y resaltado en negrita. Esto significa que se usará como punto de partida para el paquete.
  7. Haga clic con el botón derecho en el proyecto de empaquetado y elija Establecer como proyecto de inicio.
  8. Haga clic con el botón derecho en el proyecto WinForms y elija Editar archivo de proyecto.
  9. Elimine <WindowsPackageType>None</WindowsPackageType>, guarde y cierre.
  10. En la lista desplegable Plataformas de solución, seleccione x64 (en lugar de Cualquier CPU).
  11. Confirme que puede compilar y ejecutar.

Ahora que ha empaquetado la aplicación WinForms, puede llamar a las API que requieren la identidad del paquete. Por lo tanto, abra Form1.cs (con el comando Ver código ) y edite el controlador de eventos para que tenga este aspecto:

private void button1_Click(object sender, EventArgs e)
{
    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);
}

Compile y ejecute de nuevo. Haga clic en el botón y confirme que se muestra una notificación del sistema. Cuando se llama desde un proceso que carece de identidad de paquete en tiempo de ejecución, las API de notificaciones producen una excepción.

Nota

Los pasos de esta sección le mostraron cómo crear una aplicación empaquetada. Una alternativa es crear una aplicación empaquetada con ubicación externa. Para obtener un recordatorio de todos estos términos, consulta Ventajas y desventajas del empaquetado de la aplicación.