Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этом разделе рассматривается пример использования приложения C# UWP PhotoLab и его переноса на платформу Windows App SDK.
Начните с клонирования репозитория примера приложения UWP и открытия решения в Visual Studio.
Внимание
Рекомендации и стратегии для подхода к процессу миграции и настройке среды разработки для миграции см. в статье "Общая стратегия миграции". Особенно важно увидеть , что поддерживается при переносе из UWP в WinUI 3 , чтобы убедиться, что все необходимые функции поддерживаются перед попыткой миграции.
Установка инструментов для Windows App SDK
Чтобы настроить среду разработки на компьютере, выполните инструкции из статьи Установка средств для пакета SDK для приложений Windows.
Внимание
Среди разделов с заметками о выпуске вы найдете раздел Каналы выпуска Windows App SDK. Для каждого канала есть заметки о выпуске. Не забудьте проверить все ограничения и известные проблемы в этих заметках о выпуске, так как они могут повлиять на результаты в ходе данного примера и/или на выполнение перенесенного приложения.
Создание нового проекта
В Visual Studio создайте новый проект C# из шаблона проекта Blank App, Packaged (WinUI 3 in Desktop). Назовите проект PhotoLabWinUI, снимите флажок с опции Разместить решение и проект в одном каталоге. В качестве целевой версии вы можете выбрать последний выпуск (не предварительную версию) операционной системы клиента.
Примечание.
Мы будем ссылаться на версию примера проекта UWP (клонированную из репозитория) в качестве исходного решения или проекта. Мы будем называть версию пакета SDK для приложений Windows в качестве целевого решения или проекта.
Порядок переноса кода
MainPage — это важная и видная часть приложения. Но если бы мы начали переносить это, то вскоре поняли бы, что MainPage имеет зависимость от представления DetailPage, а затем, что DetailPage имеет зависимость от модели ImageFileInfo. Поэтому для этого пошагового руководства мы рассмотрим этот подход.
- Начнем с копирования файлов ресурсов.
- Затем мы переносим модель ImageFileInfo .
- Далее мы мигрируем класс App (так как это требует внесения изменений, от которых будут зависеть DetailPage, MainPage и LoadedImageBrush).
- Затем мы переносим класс LoadedImageBrush .
- Затем сначала мы начнем перенос представлений, начиная с DetailPage .
- И мы завершим, перенеся вид MainPage.
Копирование файлов ресурсов
В вашем целевом проекте в Visual Studio в окне Обозреватель решений щелкните правой кнопкой мыши на папке «Активы» и добавьте новую папку с именем
Samples.В клоне исходного проекта в Проводник найдите папку Windows-appsample-photo-lab>PhotoLab>Assets. В этой папке вы найдете семь файлов ресурсов, а также вложенную папку с названием Примеры, содержащую образцы изображений. Выберите эти семь файлов активов и вложенную папку "Примеры", и скопируйте их в буфер обмена.
Также в Проводнике найдите соответствующую папку в целевом проекте, который вы создали. Путь к этой папке — PhotoLabWinUI>PhotoLabWinUI>Assets. Вставьте в эту папку файлы ресурсов и вложенную папку, которую вы только что скопировали, и примите запрос на замену всех файлов, которые уже существуют в папке назначения.
В целевом проекте в Visual Studio, в Обозревателе решений, с развернутой папкой Assets, вы увидите в папке Samples содержимое вложенной папки Samples (которую вы только что вставили). Можно навести указатель мыши на файлы ресурсов. Эскизы миниатюр будут отображаться для каждого, чтобы подтвердить, что вы правильно заменили или добавили файлы ресурсов.
Перенос модели ImageFileInfo
ImageFileInfo — это модель (в смысле моделей, представлений и моделей представления), представляющая файл изображения, например фотографию.
Копирование файлов исходного кода ImageFileInfo
В вашем клоне исходного проекта в Проводнике найдите папку Windows-appsample-photo-lab>PhotoLab. В этой папке вы найдете файл
ImageFileInfo.csисходного кода; этот файл содержит реализацию ImageFileInfo. Выберите этот файл и скопируйте его в буфер обмена.В Visual Studio щелкните правой кнопкой мыши узел целевого проекта и выберите Открыть папку в Проводнике. Откроется целевая папка проекта в программе Проводник. Вставьте в эту папку только что скопированный файл.
Перенос исходного кода ImageFileInfo
- Выполните указанные ниже действия по поиску и замене (регистр совпадения и целое слово) в
ImageFileInfo.csфайле, который вы только что вставили.
-
namespace PhotoLab=>namespace PhotoLabWinUI -
Windows.UI.Xaml=>Microsoft.UI.Xaml
Windows.UI.Xaml — это пространство имен для XAML UWP; Microsoft.UI.Xaml — это пространство имен для Xaml WinUI.
Примечание.
Тема Mapping UWP APIs to the Windows App SDK предоставляет сопоставление API UWP с их эквивалентами в пакете Windows App SDK. Приведенное выше изменение является примером изменения имени пространства имен, необходимого во время процесса миграции.
- Теперь убедитесь, что вы можете создать целевое решение (но пока не запускайте его).
Перенос класса App
- В исходном проекте в элементе
<Application.Resources>App.xamlнайдите следующие четыре строки. Скопируйте их и вставьте их в целевой проект.
<SolidColorBrush x:Key="RatingControlSelectedForeground" Color="White"/>
<!-- Window width adaptive breakpoints. -->
<x:Double x:Key="MinWindowBreakpoint">0</x:Double>
<x:Double x:Key="MediumWindowBreakpoint">641</x:Double>
<x:Double x:Key="LargeWindowBreakpoint">1008</x:Double>
Примечание.
Так как целевой проект будет использовать другую (и более простую) навигацию, чем в исходном проекте, нет необходимости копировать какой-либо дополнительный код из исходного проекта App.xaml.cs.
- В целевом проекте приложение сохраняет объект главного окна в своем частном поле m_window. На более позднем этапе процесса миграции (когда мы перенесем использование Window.Current из исходного проекта) будет удобно, если это частное поле станет общедоступным статическим свойством. Поэтому замените поле m_window свойством Window и измените ссылки на m_window, как показано ниже.
// App.xaml.cs
public partial class App : Application
{
...
protected override void OnLaunched(Microsoft.UI.Xaml.LaunchActivatedEventArgs args)
{
Window = new MainWindow();
Window.Activate();
}
public static MainWindow Window { get; private set; }
}
- Далее в процессе миграции (при переносе кода, который отображает FileSavePicker), будет удобно, если Приложение предоставляет дескрипторглавного окна (HWND). Поэтому добавьте свойство WindowHandle и инициализировать его в методе OnLaunched , как показано ниже.
// App.xaml.cs
public partial class App : Application
{
...
protected override void OnLaunched(Microsoft.UI.Xaml.LaunchActivatedEventArgs args)
{
Window = new MainWindow();
Window.Activate();
WindowHandle = WinRT.Interop.WindowNative.GetWindowHandle(Window);
}
public static IntPtr WindowHandle { get; private set; }
}
Перенос модели LoadedImageBrush
LoadedImageBrush — это специализация XamlCompositionBrushBase. Пример приложения PhotoLab использует класс LoadedImageBrush для применения эффектов к фотографиям.
Ссылка на пакет NuGet Win2D
Для поддержки кода в LoadedImageBrush исходный проект имеет зависимость от Win2D. Поэтому нам также потребуется зависимость от Win2D в целевом проекте.
В целевом решении в Visual Studio щелкните Инструменты>Диспетчер пакетов NuGet>Управление пакетами NuGet для решения...>Обзор, и введите или вставьте Microsoft.Graphics.Win2D. Выберите правильный элемент в результатах поиска, проверьте проект PhotoLabWinUI и нажмите кнопку "Установить ", чтобы установить пакет в этом проекте.
Копирование файлов исходного кода LoadedImageBrush
Скопируйте LoadedImageBrush.cs из исходного проекта в целевой проект так же, как вы скопировали ImageFileInfo.cs.
Перенос исходного кода LoadedImageBrush
- Выполните указанные ниже действия по поиску и замене (регистр совпадения и целое слово) в
LoadedImageBrush.csфайле, который вы только что вставили.
-
namespace PhotoLab=>namespace PhotoLabWinUI -
Windows.UI.Composition=>Microsoft.UI.Composition -
Windows.UI.Xaml=>Microsoft.UI.Xaml -
Window.Current.Compositor=>App.Window.Compositor(см. раздел "Изменение Windows.UI.Xaml.Window.Current на App.Window")
- Убедитесь, что вы можете построить требуемое решение, но пока не запускайте.
Перенос представления DetailPage
DetailPage — это класс, представляющий страницу редактора фотографий, где эффекты Win2D переключаются, задаются и объединяются. Перейдите на страницу редактора фотографий, выбрав эскиз фотографии в MainPage. DetailPage — это модель (в смысле моделей, представлений и моделей представления).
Копирование файлов исходного кода DetailPage
Скопируйте DetailPage.xaml и DetailPage.xaml.cs из исходного проекта в целевой проект так же, как скопировали файлы на предыдущих шагах.
Перенос исходного кода DetailPage
- Выполните указанные ниже действия по поиску и замене (регистр совпадения и целое слово) в
DetailPage.xamlфайле, который вы только что вставили.
-
PhotoLab=>PhotoLabWinUI
- Выполните указанные ниже действия по поиску и замене (регистр совпадения и целое слово) в
DetailPage.xaml.csфайле, который вы только что вставили.
-
namespace PhotoLab=>namespace PhotoLabWinUI -
Windows.UI.Colors=>Microsoft.UI.Colors -
Windows.UI.Xaml=>Microsoft.UI.Xaml
- На следующем шаге мы внесём изменения, описанные в ContentDialog и Popup. Добавьте этот код непосредственно перед строкой
ContentDialogResult result = await saveDialog.ShowAsync();, все еще находясь вDetailPage.xaml.cs, в методе ShowSaveDialog.
if (Windows.Foundation.Metadata.ApiInformation.IsApiContractPresent("Windows.Foundation.UniversalApiContract", 8))
{
saveDialog.XamlRoot = this.Content.XamlRoot;
}
- Тем не менее в
DetailPage.xaml.csметоде OnNavigatedTo удалите следующие две строки кода. Только эти две строки; позже в этом примере мы повторно добавим функции кнопки назад, которую мы только что удалили.
...
SystemNavigationManager.GetForCurrentView().AppViewBackButtonVisibility =
AppViewBackButtonVisibility.Visible;
...
SystemNavigationManager.GetForCurrentView().AppViewBackButtonVisibility =
AppViewBackButtonVisibility.Collapsed;
...
- На этом шаге мы внесём изменения, описанные в MessageDialog и Выборах. Тем не менее в
DetailPage.xaml.csметоде ExportImage непосредственно перед строкойvar outputFile = await fileSavePicker.PickSaveFileAsync();добавьте эту строку кода.
WinRT.Interop.InitializeWithWindow.Initialize(fileSavePicker, App.WindowHandle);
MainPage имеет зависимости от DetailPage, поэтому сначала мы переносили DetailPage. Но DetailPage также имеет зависимости от MainPage, поэтому мы еще не сможем построить.
Перенос представления MainPage
Главная страница приложения представляет представление, которое вы увидите сначала при запуске приложения. Это страница, которая загружает фотографии из папки "Примеры ", встроенной в пример приложения, и отображает представление эскизов с плитками.
Копирование файлов исходного кода MainPage
Скопируйте MainPage.xaml и MainPage.xaml.cs из исходного проекта в целевой проект так же, как скопировали файлы на предыдущих шагах.
Перенос исходного кода MainPage
- Выполните указанные ниже действия по поиску и замене (совпадение по регистру и целое слово) в файле
MainPage.xaml, который вы только что вставили.
-
PhotoLab=>PhotoLabWinUI
Все еще в
MainPage.xaml, найдите разметкуanimations:ReorderGridAnimation.Duration="400"и удалите ее.Выполните указанные ниже действия по поиску и замене (регистр совпадения и целое слово) в
MainPage.xaml.csфайле, который вы только что вставили.
-
namespace PhotoLab=>namespace PhotoLabWinUI -
Windows.UI.Xaml=>Microsoft.UI.Xaml
- На этом шаге мы внесем изменение, описанное в ContentDialog и всплывающем окне. Таким образом, все еще в
MainPage.xaml.cs, в методе GetItemsAsync, непосредственно перед строкойContentDialogResult resultNotUsed = await unsupportedFilesDialog.ShowAsync();, добавьте этот код.
if (Windows.Foundation.Metadata.ApiInformation.IsApiContractPresent("Windows.Foundation.UniversalApiContract", 8))
{
unsupportedFilesDialog.XamlRoot = this.Content.XamlRoot;
}
- Тем не менее в
MainPage.xaml.csметоде OnNavigatedTo удалите следующую строку кода.
SystemNavigationManager.GetForCurrentView().AppViewBackButtonVisibility =
AppViewBackButtonVisibility.Collapsed;
Далее в этом примере мы повторно добавим функции кнопки "Назад", которую мы только что удалили.
- Убедитесь, что вы можете собрать решение (но пока не запускайте).
Перейдите к MainPage
Пример приложения PhotoLab использует логику навигации для перехода в MainPage (а затем между MainPage и DetailPage). Дополнительные сведения о приложениях Windows App SDK, которым требуется навигация (и тем, которым не требуется), см. в статье «Необходимо ли реализовать навигацию по страницам?».
Таким образом, изменения, которые мы внесём, будут поддерживать эту навигацию.
-
MainWindow.xamlУдалите<StackPanel>элемент и замените его только именованным<Frame>элементом. Результат выглядит следующим образом.
<Window ...>
<Frame x:Name="rootFrame"/>
</Window>
В
MainWindow.xaml.csудалите метод myButton_Click.Находясь в
MainWindow.xaml.cs, добавьте следующую строку кода в конструктор.
public sealed partial class MainWindow : Window
{
public MainWindow()
{
this.InitializeComponent();
rootFrame.Navigate(typeof(MainPage));
}
}
- Убедитесь, что вы можете создать целевое решение (но пока не запускайте его).
Восстановление функциональных возможностей кнопки "Назад"
- В
DetailPage.xamlкорневым элементом является RelativePanel. Добавьте следующую разметку внутри этого элемента RelativePanel сразу после элемента StackPanel .
<AppBarButton x:Name="BackButton" Click="BackButton_Click" Margin="0,0,12,0">
<SymbolIcon Symbol="Back"/>
</AppBarButton>
- В
DetailPage.xaml.csдобавьте две следующие строки кода в метод OnNavigatedTo в указанном месте.
if (this.Frame.CanGoBack)
{
BackButton.Visibility = Microsoft.UI.Xaml.Visibility.Visible;
}
else
{
BackButton.Visibility = Microsoft.UI.Xaml.Visibility.Collapsed;
}
- Оставаясь в
DetailPage.xaml.cs, добавьте следующий обработчик событий.
private void BackButton_Click(object sender, Microsoft.UI.Xaml.RoutedEventArgs e)
{
Frame.GoBack();
}
Тестирование перенесенного приложения
Теперь создайте проект и запустите приложение для его тестирования. Выберите изображение, задайте уровень масштабирования, выберите эффекты и настройте их.
См. также
Windows developer