Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этом разделе описано, как выполнить пример приложения UWP PhotoLab и перенести его в Windows App SDK.
Начните с того, чтобы клонировать репозиторий образца приложения UWP и открыть решение в Visual Studio.
Внимание
Рекомендации и стратегии для подхода к процессу миграции и настройке среды разработки для миграции см. в статье "Общая стратегия миграции". Особенно важно увидеть , что поддерживается при переносе из UWP в WinUI 3 , чтобы убедиться, что все необходимые функции поддерживаются перед попыткой миграции.
Установка средств для Windows App SDK
Сведения о настройке компьютера разработки см. в статье Install tools for the Windows App SDK.
Внимание
Вы найдете темы заметок о новом выпуске совместно с темой каналы выпуска Windows App SDK. Для каждого канала есть заметки о выпуске. Не забудьте проверить все ограничения и известные проблемы в этих заметках о выпуске, так как они могут повлиять на результаты в ходе данного примера и/или на выполнение перенесенного приложения.
Создание проекта
В Visual Studio создайте проект C# из шаблона проекта WinUI Blank App (Packaged ). Задайте имя проекту PhotoLabWinUI, снимите флажок Разместить решение и проект в одном каталоге. В качестве целевой версии вы можете выбрать последний выпуск (не предварительную версию) операционной системы клиента.
Примечание.
Мы будем ссылаться на версию UWP проекта (клонированную из его репозитория) как на исходное решение/проект. Мы будем называть версию Windows App SDK целевым решением/проектом.
Порядок переноса кода
MainPage — это важная и видная часть приложения. Но если бы мы начали переносить это, то вскоре поняли бы, что MainPage имеет зависимость от представления DetailPage, а затем, что DetailPage имеет зависимость от модели ImageFileInfo. Поэтому для этого пошагового руководства мы рассмотрим этот подход.
- Начнем с копирования файлов ресурсов.
- Затем мы переносим модель ImageFileInfo .
- Далее мы мигрируем класс App (так как это требует внесения изменений, от которых будут зависеть DetailPage, MainPage и LoadedImageBrush).
- Затем мы переносим класс LoadedImageBrush .
- Затем сначала мы начнем перенос представлений, начиная с DetailPage .
- И мы завершим, перенеся вид MainPage.
Копирование файлов ресурсов
В целевом project в Visual Studio в папке Solution Explorer щелкните правой кнопкой мыши папку Assets и добавьте новую папку с именем
Samples.В клоне исходного project в File Explorer найдите папку Windows-appsample-photo-lab>PhotoLab>Assets. В этой папке вы найдете семь файлов ресурсов, а также вложенную папку с названием Примеры, содержащую образцы изображений. Выберите эти семь файлов активов и вложенную папку "Примеры", и скопируйте их в буфер обмена.
Кроме того, в File Explorer теперь найдите соответствующую папку в созданном целевом project. Путь к этой папке — PhotoLabWinUI>PhotoLabWinUI>Assets. Вставьте в эту папку файлы ресурсов и вложенную папку, которую вы только что скопировали, и примите запрос на замену всех файлов, которые уже существуют в папке назначения.
В целевом проекте в Visual Studio, в Solution Explorer с раскрытой папкой Assets вы увидите в папке Samples содержимое вложенной папки Samples (которое вы только что вставили). Можно навести указатель мыши на файлы ресурсов. Эскизы миниатюр будут отображаться для каждого, чтобы подтвердить, что вы правильно заменили или добавили файлы ресурсов.
Перенос модели ImageFileInfo
ImageFileInfo — это модель (в смысле моделей, представлений и моделей представления), представляющая файл изображения, например фотографию.
Копирование файлов исходного кода ImageFileInfo
В клоне исходного project в File Explorer найдите папку Windows-appsample-photo-lab>PhotoLab. В этой папке вы найдете файл
ImageFileInfo.csисходного кода; этот файл содержит реализацию ImageFileInfo. Выберите этот файл и скопируйте его в буфер обмена.В Visual Studio щелкните правой кнопкой мыши целевой проект и выберите Открыть папку в Проводнике. Откроется целевая папка project в File Explorer. Вставьте в эту папку только что скопированный файл.
Перенос исходного кода ImageFileInfo
- Выполните указанные ниже действия по поиску и замене (регистр совпадения и целое слово) в
ImageFileInfo.csфайле, который вы только что вставили.
-
namespace PhotoLab=>namespace PhotoLabWinUI -
Windows.UI.Xaml=>Microsoft.UI.Xaml
Windows.UI.Xaml — это пространство имен для XAML UWP; Microsoft.UI.Xaml — это пространство имен для Xaml WinUI.
Примечание.
Тема Сопоставление API UWP с 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.
- В целевом проекте App сохраняет основной объект окна в своем закрытом поле 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), было бы удобно, если приложение App предоставляет дескриптор главного окна handle (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 щелкните Tools>NuGet Package Manager>Manage NuGet Packages for Solution... >Browse и введите или вставьте Microsoft.Graphics.Win2D. Выберите правильный элемент в результатах поиска, проверьте PhotoLabWinUI project и щелкните Install, чтобы установить пакет в этот project.
Копирование файлов исходного кода LoadedImageBrush
Скопируйте LoadedImageBrush.cs из исходного project в целевой project так же, как вы скопировали 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 из исходного project в целевой project таким же образом, как вы скопировали файлы на предыдущих шагах.
Перенос исходного кода 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. Добавьте этот код непосредственно перед строкой
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 и Pickers. Тем не менее в
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 из исходного project в целевой project таким же образом, как вы скопировали файлы на предыдущих шагах.
Перенос исходного кода 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 и Popup. Таким образом, все еще в
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();
}
Тестирование перенесенного приложения
Теперь создайте project и запустите приложение, чтобы протестировать его. Выберите изображение, задайте уровень масштабирования, выберите эффекты и настройте их.
См. также
Windows developer