Использование Windows App SDK в приложении WPF

Windows App SDK является следующим развитием платформы разработки приложений Windows. Но в этом разделе показано, как использовать API Windows App SDK (и среда выполнения Windows API) в приложении Windows Presentation Foundation (WPF)!

  • Во многих случаях вы хотите повторно создать приложение WPF в виде приложения WinUI 3. Одним из преимуществ перехода на WinUI является получение доступа к Fluent Design System (см. также Разработка и кодирование приложений для Windows). И WinUI является частью Windows App SDK, поэтому, естественно, приложение WinUI может использовать другие Windows App SDK функции и API, а также. В этом разделе не рассматривается процесс переноса приложения WPF в WinUI.
  • Но если вы обнаружите, что вы используете функции WPF, которые еще не доступны в WinUI, вы по-прежнему можете использовать Windows App SDK функции (например, жизненный цикл приложений, MRT Core, DWriteCore и другие) в приложении WPF. Эта тема объясняет, как это сделать.

И в случае, если у вас еще нет существующего проекта WPF или вы хотите поработать с этим процессом, в этом разделе содержатся шаги по созданию проекта WPF, чтобы вы могли следовать и настраивать его для вызова API Windows App SDK.

Предварительные условия

  1. Установите инструменты для Windows App SDK.
  2. В данном разделе рассматриваются приложения WPF без упаковки и в упаковке. Если приложение WPF неупаковано (что является настройкой по умолчанию для приложений WPF), убедитесь, что установлены все зависимости для неупакованных приложений (см. руководство по развертыванию Windows App SDK для приложений, зависящих от платформы, с внешним расположением или неупакованных). Быстрый способ сделать это — посетить Последние загрузки для Windows App SDK, а затем загрузить, распаковать и запустить один из стабильных выпусков Runtime downloads.

Внимание

Версия Runtime, которую вы устанавливаете, должна соответствовать версии пакета NuGet Microsoft.WindowsAppSDK, который вы установите на следующем этапе.

Дополнительные сведения о терминах распаковки и упаковки см. в разделе "Преимущества и недостатки упаковки приложения".

Создание проекта WPF, если у вас еще нет проекта

Если у вас уже есть проект WPF, вы можете перейти к следующему разделу.

  1. В Visual Studio создайте новый проект WPF-приложения на языке C# (это проект для .NET). Будьте внимательны, чтобы выбрать шаблон проекта с точным именем WPF Application, а не приложением WPF (.NET Framework).
  2. Присвойте project имени и примите все параметры по умолчанию.

Теперь у вас есть проект, который создает неупакованное WPF-приложение.

Настройка проекта WPF для поддержки Windows App SDK

Сначала мы изменим файл project.

  1. В Обозреватель решений щелкните правой кнопкой мыши project и выберите Edit Project File.

  2. Этот шаг позволяет вызывать API-интерфейсы среда выполнения Windows (WinRT (включая API Windows App SDK). Внутри элемента PropertyGroup используется элемент TargetFramework, который имеет значение, например net6.0. Добавьте к значению целевой платформы идентификатор (в частности, идентификатор целевой платформы). Например, используйте следующее, если приложение предназначено для Windows 10 версии 2004:

    <TargetFramework>net8.0-windows10.0.19041.0</TargetFramework>
    
  3. Кроме того, внутри элемента PropertyGroup добавьте элемент RuntimeIdentifiers, как показано ниже. Если вы используете .NET 8 или более поздней версии, используйте вместо этого значение win-x86;win-x64;win-arm64.

    <RuntimeIdentifiers>win-x86;win-x64;win-arm64</RuntimeIdentifiers>
    
  4. По умолчанию приложение WPF является непакетированным (то есть оно не установлено с использованием MSIX). Неупакованное приложение должно инициализировать исполняемую среду Windows App SDK до использования любых других функций Windows App SDK. Это можно сделать автоматически при запуске приложения с помощью автоматической инициализации. Вы просто задаете (также внутри элемента PropertyGroup) свойство WindowsPackageType project соответствующим образом, как показано ниже.

    <WindowsPackageType>None</WindowsPackageType>
    

    Если у вас есть дополнительные потребности (например, настраиваемая обработка ошибок или загрузка определенной версии Windows App SDK), вместо автоинициализации можно явно вызвать API начальной загрузки — дополнительные сведения см. в разделе Использование среды выполнения Windows App SDK для приложений, упакованных с внешним расположением или распакованных.

  5. Сохраните и закройте файл project.

Затем мы установим пакет NuGet Windows App SDK в проекте.

  1. В Обозреватель решений щелкните правой кнопкой мыши узел Dependencies узла проекта и выберите Manage Nuget Packages... .
  2. В окне NuGet диспетчер пакетов откройте вкладку Browse и установите Latest stableMicrosoft. Пакет WindowsAppSDK.

Использование некоторых функций Windows App SDK в приложении WPF

В этом разделе представлен очень простой пример вызова API Windows App SDK из приложения WPF. Он использует функцию MRT Core (см. раздел "Управление ресурсами с помощью MRT Core"). Если этот пример работает для вашего проекта WPF (и если вы создали новый проект для этого пошагового руководства, то он будет работать), тогда вы можете выполнить следующие шаги.

  1. Добавьте следующую разметку в MainWindow.xaml (ее можно вставить в корневой Grid):

    <StackPanel>
        <Button HorizontalAlignment="Center" Click="Button_Click">Click me!</Button>
        <TextBlock HorizontalAlignment="Center" x:Name="myTextBlock">Hello, World!</TextBlock>
    </StackPanel>
    
  2. Теперь мы добавим код, использующий класс ResourceManager в Windows App SDK для загрузки строкового ресурса.

    1. Добавьте новый элемент файл ресурсов (.resw) в проект (оставьте его именем по умолчанию Resources.resw).

    2. Открыв файл ресурсов в редакторе, создайте новый строковый ресурс со следующими свойствами.

      • Имя: сообщение
      • Значение: Hello, resources!
    3. Сохраните и закройте файл ресурсов.

    4. Добавьте MainWindow.xaml.csследующий обработчик событий:

    private void Button_Click(object sender, RoutedEventArgs 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.
        myTextBlock.Text = manager.MainResourceMap.GetValue("Resources/Message").ValueAsString;
    }
    
  3. Создайте project и запустите приложение. Нажмите кнопку, чтобы отобразить строку Hello, resources! .

Совет

Если во время выполнения отображается окно сообщения, указывающее, что приложению требуется определенная версия среды выполнения приложение для Windows, и спрашивает, нужно ли установить ее сейчас, а затем щелкните Yes. Это приведет вас на страницу Последние загрузки для Windows App SDK. Дополнительные сведения см. в разделе "Предварительные требования" выше.

Кроме того, ознакомьтесь с архитектурой Runtime чтобы узнать больше о зависимости пакета Framework, которую ваше приложение принимает при использовании Windows App SDK, а также дополнительные компоненты, необходимые для работы в непакованном приложении.

Упаковка и развертывание приложения WPF с помощью MSIX

Некоторые функции и API Windows требуют, чтобы у вашего приложения была идентификация пакета во время выполнения (другими словами, приложение должно быть упаковано). Дополнительные сведения см. в разделе "Функции, требующие удостоверения пакета". Упаковка MSIX также требуется для отправок формата MSIX в Microsoft Store.

  1. В Visual Studio Обозреватель решений щелкните решение правой кнопкой мыши и выберите Add>New Project... .
  2. В диалоговом окне Добавить новый проект найдите упаковка, выберите шаблон проекта Windows Packaging Project для приложений на C# и щелкните Далее.
  3. Назовите project и щелкните Create.
  4. Мы хотим указать, какие приложения в решении должны быть включены в пакет. Итак, в проекте упаковки (не WPF-проект), кликните правой кнопкой мыши узел Dependencies и выберите Add Project Reference....
  5. В списке проектов в решении выберите проект WPF и щелкните OK.
  6. Разверните узел Dependencies>Applications и убедитесь, что проект WPF выделен полужирным шрифтом. Это означает, что он будет использоваться в качестве стартовой точки пакета.
  7. Щелкните правой кнопкой мыши проект упаковки и выберите Установить как стартовый проект.
  8. Щелкните правой кнопкой мыши WPF project и выберите Edit Project File.
  9. Удаление <WindowsPackageType>None</WindowsPackageType>, сохранение и закрытие.
  10. В раскрывающемся списке "Платформы решений" выберите x64 (вместо любого ЦП).
  11. Убедитесь, что можно создать и запустить.

Теперь, когда вы упаковали приложение WPF, можно вызвать API, для которых требуется удостоверение пакета. MainWindow.xaml.csТаким образом, измените обработчик событий, чтобы выглядеть следующим образом:

private void Button_Click(object sender, RoutedEventArgs 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);
}

Создайте и запустите еще раз. Нажмите кнопку и подтвердите, что отображается уведомление.

Примечание.

В этом разделе показано, как создать упакованое приложение. Альтернативой является создание пакетного приложения с внешней локализацией. Напоминание обо всех этих терминах см. в разделе "Преимущества и недостатки упаковки приложения".

Запуск кода в фоновом режиме

Для WPF приложений, которые должны выполнять код, если приложение не запущено, существует три подхода в зависимости от упаковки и рабочей нагрузки:

Подход Требуется упаковка лучше всего подходит для
Windows App SDK фоновые задачи Да (MSIX) Триггеры, управляемые системой, энергоэффективные (время/система)
Планировщик заданий Нет Периодическая синхронизация, распаковка приложений
.NET Worker Services Нет Длительные рабочие нагрузки без головы, любая модель развертывания

Для фоновых задач Windows App SDK приложение WPF регистрирует com-компонент с помощью BackgroundTaskBuilder так же, как приложение WinUI 3 — событие Application.Startup в WPF сопоставляется с ролью, которая App.OnLaunched играет в WinUI 3. Полный пошаговое руководство см. в разделе Пользование фоновых задач в приложениях Windows.

Примечание.

Задачи в фоновом режиме в "Windows App SDK" требуют упаковки в MSIX. Для распаковки приложений WPF используйте планировщик задач или .NET рабочие службы.