Skenario tingkat lanjut untuk Kepulauan XAML di aplikasi desktop C++ (Win32)
Penting
Topik ini menggunakan atau menyebutkan jenis dari repositori GitHub CommunityToolkit/Microsoft.Toolkit.Win32 . Untuk informasi penting tentang dukungan Kepulauan XAML, silakan lihat Pemberitahuan Kepulauan XAML di repositori tersebut.
Host kontrol UWP standar dan menghosting artikel kontrol UWP kustom memberikan instruksi dan contoh untuk menghosting Kepulauan XAML di aplikasi desktop C++ (Win32). Namun, contoh kode dalam artikel ini tidak menangani banyak skenario lanjutan yang mungkin perlu ditangani aplikasi desktop untuk memberikan pengalaman pengguna yang lancar. Artikel ini menyediakan panduan untuk beberapa skenario dan penunjuk ini ke sampel kode terkait.
Input keyboard
Untuk menangani input keyboard dengan benar untuk setiap Pulau XAML, aplikasi Anda harus meneruskan semua pesan Windows ke kerangka kerja UWP XAML sehingga pesan tertentu dapat diproses dengan benar. Untuk melakukan ini, di beberapa tempat di aplikasi Anda yang dapat mengakses perulangan pesan, transmisikan objek DesktopWindowXamlSource untuk setiap Pulau XAML ke antarmuka COM IDesktopWindowXamlSourceNative2 . Kemudian, panggil metode PreTranslateMessage antarmuka ini dan teruskan pesan saat ini.
Desktop C++ (Win32):: Aplikasi dapat memanggil PreTranslateMessage langsung dalam perulangan pesan utamanya. Misalnya, lihat file XamlBridge.cpp .
WPF: Aplikasi dapat memanggil PreTranslateMessage dari penanganan aktivitas untuk peristiwa ComponentDispatcher.ThreadFilterMessage . Misalnya, lihat file WindowsXamlHostBase.Focus.cs di Toolkit Komunitas Windows.
Formulir Windows: Aplikasi ini dapat memanggil PreTranslateMessage dari penimpaan untuk metode Control.PreprocessMessage. Misalnya, lihat file WindowsXamlHostBase.KeyboardFocus.cs di Toolkit Komunitas Windows.
Navigasi fokus keyboard
Saat pengguna menavigasi melalui elemen UI di aplikasi Anda menggunakan keyboard (misalnya, dengan menekan Tab atau tombol arah/panah), Anda harus memindahkan fokus secara terprogram ke dalam dan ke luar objek DesktopWindowXamlSource . Saat navigasi keyboard pengguna mencapai DesktopWindowXamlSource, pindahkan fokus ke objek Windows.UI.Xaml.UIElement pertama dalam urutan navigasi untuk UI Anda, terus pindahkan fokus ke objek Windows.UI.Xaml.UIElement berikut saat pengguna menelusuri elemen, lalu memindahkan fokus kembali dari DesktopWindowXamlSource dan ke elemen UI induk.
API hosting UWP XAML menyediakan beberapa jenis dan anggota untuk membantu Anda menyelesaikan tugas-tugas ini.
Saat navigasi keyboard memasuki DesktopWindowXamlSource Anda, acara GotFocus dinaikkan. Tangani peristiwa ini dan pindahkan fokus secara terprogram ke Windows.UI.Xaml.UIElement pertama yang dihosting dengan menggunakan metode NavigateFocus.
Saat pengguna berada pada elemen terakhir yang dapat difokuskan di DesktopWindowXamlSource Anda dan menekan tombol Tab atau tombol panah, peristiwa TakeFocusRequested dinaikkan. Tangani peristiwa ini dan pindahkan fokus secara terprogram ke elemen yang dapat difokuskan berikutnya di aplikasi host. Misalnya, dalam aplikasi WPF di mana DesktopWindowXamlSource dihosting dalam System.Windows.Interop.HwndHost, Anda dapat menggunakan metode MoveFocus untuk mentransfer fokus ke elemen yang dapat difokuskan berikutnya di aplikasi host.
Untuk contoh yang menunjukkan cara melakukan ini dalam konteks aplikasi sampel kerja, lihat file kode berikut:
Desktop C++ (Win32): Lihat file XamlBridge.cpp .
WPF: Lihat file WindowsXamlHostBase.Focus.cs di Toolkit Komunitas Windows.
Formulir Windows: Lihat file WindowsXamlHostBase.KeyboardFocus.cs di Toolkit Komunitas Windows.
Menangani perubahan tata letak
Saat pengguna mengubah ukuran elemen UI induk, Anda harus menangani perubahan tata letak yang diperlukan untuk memastikan kontrol UWP Anda ditampilkan seperti yang Anda harapkan. Berikut adalah beberapa skenario penting yang perlu dipertimbangkan.
Dalam aplikasi desktop C++, ketika aplikasi Anda menangani pesan WM_SIZE, aplikasi dapat memposisikan ulang Pulau XAML yang dihosting dengan menggunakan fungsi SetWindowPos . Misalnya, lihat file kode SampleApp.cpp .
Ketika elemen UI induk perlu mendapatkan ukuran area persegi panjang yang diperlukan agar sesuai dengan Windows.UI.Xaml.UIElement yang Anda hosting di DesktopWindowXamlSource, panggil metode Pengukuran Windows.UI.Xaml.UIElement. Contohnya:
Dalam aplikasi WPF, Anda dapat melakukan ini dari metode MeasureOverride HwndHost yang menghosting DesktopWindowXamlSource. Misalnya, lihat file WindowsXamlHostBase.Layout.cs di Toolkit Komunitas Windows.
Dalam aplikasi Formulir Windows Anda mungkin melakukan ini dari metode GetPreferredSize kontrol yang menghosting DesktopWindowXamlSource. Misalnya, lihat file WindowsXamlHostBase.Layout.cs di Toolkit Komunitas Windows.
Ketika ukuran elemen UI induk berubah, panggil metode Atur windows.UI.Xaml.UIElement akar yang Anda hosting di DesktopWindowXamlSource. Contohnya:
Dalam aplikasi WPF, Anda dapat melakukan ini dari metode ArrangeOverride objek HwndHost yang menghosting DesktopWindowXamlSource. Misalnya, lihat file WindowsXamlHost.Layout.cs di Toolkit Komunitas Windows.
Dalam aplikasi Formulir Windows Anda dapat melakukan ini dari handler untuk peristiwa SizeChanged dari Kontrol yang menghosting DesktopWindowXamlSource. Misalnya, lihat file WindowsXamlHost.Layout.cs di Toolkit Komunitas Windows.
Menangani perubahan DPI
Kerangka kerja UWP XAML menangani perubahan DPI untuk kontrol UWP yang dihosting secara otomatis (misalnya, ketika pengguna menyeret jendela antara monitor dengan DPI layar yang berbeda). Untuk pengalaman terbaik, kami sarankan aplikasi desktop Formulir Windows, WPF, atau C++ Anda dikonfigurasi agar diketahui oleh DPI per monitor.
Untuk mengonfigurasi aplikasi Anda agar sadar per monitor DPI, tambahkan manifes perakitan berdampingan ke proyek Anda dan atur< elemen dpiAwareness> ke PerMonitorV2. Untuk informasi selengkapnya tentang nilai ini, lihat deskripsi untuk 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>
Topik terkait
Windows developer