July 2012 1 post
Setting up SwapChainBackgroundPanel in a XAML app
Monday, July 30, 2012
After creating a XAML app for Windows 8 using the Blank XAML app template, I changed the body of MainPage.xaml from this:
<Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}"> </Grid>to this:
<SwapChainBackgroundPanel></SwapChainBackgroundPanel>
While this compiles without warnings, it crashes on launch. With a C++/XAML app, a console message appears:
First-chance exception at 0x754F7945 (KernelBase.dll) in HelloWorld.exe: 0x40080201: WinRT originate error (parameters: 0x80004005, 0x0000005E, 0x031FDCE4).
In both C++ and C#, the exception message is as follows:
Page element must be root of visual tree when its content is SwapChainBackgroundPanel element.
This is because the default XAML template creates a Frame
that hosts your app's pages, and it, not the Page
object, is the root. To remove it, edit App.xaml.cpp
's OnLaunched()
function and replace this:
// Create a Frame to act navigation context and navigate to the first page auto rootFrame = ref new Frame(); if (!rootFrame->Navigate(TypeName(MainPage::typeid))) { throw ref new FailureException("Failed to create initial page"); } // Place the frame in the current Window and ensure that it is active Window::Current->Content = rootFrame; Window::Current->Activate();
with this:
Window::Current->Content = ref new MainPage(); Window::Current->Activate();
If you're using C# and not C++, it's pretty much identical. Just omit the ref
before new MainPage()
.
If you want to learn more about Direct3D and XAML, there is a good article on MSDN about the interop options available.