I'm trying to use XAML Islands for WinUI 3 in a Win32 application.
After creating a new Win32 Desktop application from the File -> New Projet wizard, and:
- Installing the latest versions of the Windows App SDK and CppWinRT NuGet packages (which are versions 1.4.231115000 and 2.0.230706.1 respectively),
- Unloading the project, then adding
<WindowsPackageType>None</WindowsPackageType>to the<PropertyGroup Label="Globals">section of project file, and - Replacing the contents of the main .cpp file with the following:
#include "framework.h"
#include "WinUI3XamlIslandsWin32.h"
#include <windows.ui.xaml.hosting.desktopwindowxamlsource.h>
#include <winrt/Microsoft.UI.Dispatching.h>
#include <winrt/Microsoft.UI.Xaml.Hosting.h>
#include <cassert>
int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
_In_opt_ HINSTANCE hPrevInstance,
_In_ LPWSTR lpCmdLine,
_In_ int nCmdShow)
{
winrt::init_apartment(winrt::apartment_type::single_threaded);
auto dispatcherQueueController = winrt::Microsoft::UI::Dispatching::DispatcherQueueController::CreateOnCurrentThread();
auto windowsXamlManager = winrt::Microsoft::UI::Xaml::Hosting::WindowsXamlManager::InitializeForCurrentThread();
winrt::Microsoft::UI::Xaml::Hosting::DesktopWindowXamlSource desktopWindowXamlSource;
auto interop = desktopWindowXamlSource.as<IDesktopWindowXamlSourceNative>();
assert(interop != nullptr);
return EXIT_SUCCESS;
}
If you run this program, it can successfully create the DesktopWindowXamlSource, but the line desktopWindowXamlSource.as<IDesktopWindowXamlSourceNative>() fails with E_NOINTERFACE. Indeed, if you try winrt::get_interfaces(desktopWindowXamlSource) to list the interfaces the DesktopWindowXamlSource supports, it only lists:
IDesktopWindowXamlSourceICompositionSupportsSystemBackdropIClosableIWeakReferenceSourceISupportErrorInfoIUnknownIInspectable
Is there some extra step of setup necessary to allow the DesktopWindowXamlSource to be casted to the IDesktopWindowXamlSourceNative interface?
I've created a sample project at https://github.com/litherum/WinUI3XamlIslandsWin32 demonstrating the problem.
It looks like WinUI 3 changed how XAML Islands work.
IDesktopWindowXamlSourceNative::AttachToWindow()DesktopWindowXamlSource::Initialize()IDesktopWindowXamlSourceNative::get_WindowHandle()DesktopWindowXamlSource::SiteBridge().WindowID()IDesktopWindowXamlSourceNative2::PreTranslateMessage()ContentPreTranslateMessage()You can convert between
HWNDs andWindowIDs byGetWindowFromWindowId()andGetWindowIdFromWindow().