Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Это важно
В этом разделе используются или упоминаются типы из репозитория CommunityToolkit/Microsoft.Toolkit.Win32 GitHub. Сведения о поддержке островов XAML UWP см. в уведомлении XAML Islands в этом репозитории.
Размещение стандартного элемента управления UWP и размещение пользовательского элемента управления UWP содержат инструкции и примеры по размещению островков XAML UWP в классическом приложении C++ (Win32). Однако примеры кода в этих статьях не обрабатывают множество сложных сценариев, которые могут потребоваться для обработки классических приложений для обеспечения плавного взаимодействия с пользователем. В этой статье приводятся рекомендации по некоторым из этих сценариев и указателей на связанные примеры кода.
Ввод клавиатуры
Чтобы правильно обрабатывать входные данные клавиатуры для каждого острова XAML, приложение должно передавать все сообщения Windows в платформу XAML UWP, чтобы некоторые сообщения могли обрабатываться правильно. Для этого в каком-то месте в вашем приложении, которое может обращаться к циклу сообщений, преобразуйте объект DesktopWindowXamlSource для каждого острова XAML к интерфейсу COM IDesktopWindowXamlSourceNative2. Затем вызовите метод PreTranslateMessage этого интерфейса и передайте текущее сообщение.
C++ desktop (Win32):: приложение может вызывать PreTranslateMessage непосредственно в основном цикле обработки сообщений. Пример см. в файле XamlBridge.cpp.
WPF: Приложение может вызывать событие PreTranslateMessage из обработчика событий для события ComponentDispatcher.ThreadFilterMessage. Пример см. в файле WindowsXamlHostBase.Focus.cs в наборе средств сообщества Windows.
Windows Forms: Приложение может вызывать метод PreTranslateMessage из переопределения для метода Control.PreprocessMessage. Пример см. в файле WindowsXamlHostBase.KeyboardFocus.cs в наборе средств сообщества Windows.
Навигация фокуса клавиатуры
Когда пользователь перемещается по элементам пользовательского интерфейса в приложении с помощью клавиатуры (например, нажатием клавиши TAB или стрелка или направление), вам потребуется программным способом переместить фокус в объект DesktopWindowXamlSource и выйти из него. Когда навигация по клавиатуре пользователя достигает DesktopWindowXamlSource, переместите фокус на первый объект Windows.UI.Xaml.UIElement в порядке навигации для пользовательского интерфейса, продолжайте перемещать фокус на следующие объекты Windows.UI.Xaml.UIElement, пока пользователь перебирает элементы, а затем переместите фокус обратно из DesktopWindowXamlSource в родительский элемент пользовательского интерфейса.
API размещения XAML UWP предоставляет несколько типов и членов, которые помогут вам выполнить эти задачи.
Когда навигация по клавиатуре входит в DesktopWindowXamlSource, вызывается событие GotFocus. Обработайте это событие и программным образом переместите фокус на первый размещенный элемент Windows.UI.Xaml.UIElement с помощью метода NavigateFocus .
Когда пользователь находится на последнем фокусируемом элементе в DesktopWindowXamlSource и нажимает клавишу TAB или стрелку, вызывается событие TakeFocusRequested . Обработайте это событие и программным образом переместите фокус на следующий фокусируемый элемент в основном приложении. Например, в приложении WPF, где размещен DesktopWindowXamlSource в System.Windows.Interop.HwndHost, Метод MoveFocus можно использовать для передачи фокуса следующему фокусируемому элементу в основном приложении.
Примеры, демонстрирующие, как это сделать в контексте работающего примера приложения, см. в следующих файлах кода:
C++ desktop (Win32): см. файл XamlBridge.cpp.
WPF: См. файл WindowsXamlHostBase.Focus.cs в наборе средств сообщества Windows.
Windows Forms: См. файл WindowsXamlHostBase.KeyboardFocus.cs в наборе средств сообщества Windows.
Обработка изменений макета
Когда пользователь изменяет размер родительского элемента пользовательского интерфейса, необходимо обработать все необходимые изменения макета, чтобы убедиться, что элементы управления UWP отображаются должным образом. Ниже приведены некоторые важные сценарии для рассмотрения.
В классическом приложении C++ при обработке сообщения WM_SIZE приложение может изменить положение размещенного острова XAML с помощью функции SetWindowPos. Пример см. в файле кода SampleApp.cpp.
Если родительский элемент пользовательского интерфейса должен получить размер прямоугольной области, необходимой для размещения объекта Windows.UI.Xaml.UIElement , размещенного в DesktopWindowXamlSource, вызовите метод Measureобъекта Windows.UI.Xaml.UIElement. Рассмотрим пример.
В приложении WPF это можно сделать из метода MeasureOverride метода HwndHost, на котором размещен метод DesktopWindowXamlSource. Пример см. в файле WindowsXamlHostBase.Layout.cs в наборе средств сообщества Windows.
В приложении Windows Forms это можно сделать из метода GetPreferredSize метода Control, на котором размещен метод DesktopWindowXamlSource. Пример см. в файле WindowsXamlHostBase.Layout.cs в наборе средств сообщества Windows.
При изменении размера родительского элемента пользовательского интерфейса вызовите метод "Упорядочить " корневого элемента Windows.UI.Xaml.UIElement , который вы размещаете в DesktopWindowXamlSource. Рассмотрим пример.
В приложении WPF это можно сделать из метода ArrangeOverride объекта HwndHost, на котором размещен DesktopWindowXamlSource. Пример см. в файле WindowsXamlHost.Layout.cs в наборе средств сообщества Windows.
В приложении Windows Forms это можно сделать из обработчика события SizeChanged элемента Control, на котором размещен DesktopWindowXamlSource. Пример см. в файле WindowsXamlHost.Layout.cs в наборе средств сообщества Windows.
Обработка изменений DPI
Платформа XAML UWP обрабатывает изменения DPI для размещенных элементов управления UWP автоматически (например, когда пользователь перетаскивает окно между мониторами с разным DPI экрана). Для оптимальной работы рекомендуется настроить настольное приложение Windows Forms, WPF или C++ так, чтобы оно учитывало DPI каждого монитора.
Чтобы настроить приложение с учетом DPI каждого монитора, добавьте манифест сборки side-by-side в проект и установите элемент <dpiAwareness> в значение PerMonitorV2. Дополнительные сведения об этом значении см. в описании DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2.
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<application xmlns="urn:schemas-microsoft-com:asm.v3">
<windowsSettings>
<dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">PerMonitorV2</dpiAwareness>
</windowsSettings>
</application>
</assembly>
Связанные темы
- Встраивание элементов управления UWP XAML в классические приложения (UWP XAML Islands)
- Использование API размещения XAML UWP в классическом приложении C++
- Размещение стандартного элемента управления UWP в классическом приложении C++
- Размещение пользовательского элемента управления UWP в классическом приложении C++
- Примеры кода XAML Islands UWP
- Пример для настольного приложения C++ на платформе UWP с использованием XAML Islands