Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I navigate through xaml pages with Monogame in a Windows Phone 8 project?

I finished to develop an XNA game, then I created the Monogame project, and tested it on my device. Now I made some other pages such as an "about" page. How can I go to that page considering I have a Monogame project and just an XNA code? In particular inside my game I made a Main Menu where you can click the "about" button and know if someone has clicked: how can I link that event to the "go to about.xaml" function?

Inside XNA, update method:

if (about_button.IsClicked())
{
    // Go to about.xaml
}

I tried:

   if (about_button.IsClicked())
    {
         ((PhoneApplicationFrame)Application.Current.RootVisual).Navigate(new Uri("/About.xaml", UriKind.Relative));
    }

But it throws: System.UnauthorizedAccessException

like image 536
Francesco Bonizzi Avatar asked Nov 01 '22 23:11

Francesco Bonizzi


2 Answers

I haven't tried this myself, but the WP framework has the Window.Current.Content object which you can use to load different views.

For example:

// Create a Frame to act navigation context and navigate to the first page
var rootFrame = new Frame();
rootFrame.Navigate(typeof(BlankPage));

// Place the frame in the current Window and ensure that it is active
Window.Current.Content = rootFrame;
Window.Current.Activate();

So if you are using a windows phone 8 project template, with that object you can easily tell the application to load a xaml view or the game one.

You can also check how to do it with WinRT and monogame on this site (the Window.Current is part of the WP and WinRT framework). Here, you will find how to integrate both frameworks in order to create a monogame using the WinRT xaml views :)

For more information on the Window.Current, check this link.

EDIT

If you used a monogame for windows phone template, a XAML page should already exist in your project which is used to load the game itself, as well as a media element for video and sound playback.

The page is called "GamePage.xaml", which you could use for your navigational purposes.

This info was taken from the "Windows 8 and Windows Phone 8 Game Development" book written by Adam Dawes (chapter 13).

In the case of the Windows Phone projects, GamePage is implemented as a normal page. [...] Within the Windows Phone page is a full-page Grid control, inside which is another full-screen control of type DrawingSurface. This is a type of control that DirectX can use to render graphics to a Windows Phone page. Our XAML content can also be placed into the Grid. A MediaElement control is present within the Grid, too. MonoGame uses this for some of its audio playback functionality.

On both platforms, the way that XAML and DirectX have been designed to interact is that the DirectX rendering is processed first. Once this has been completed, the XAML renderer then takes control and adds its content as a second step, prior to presenting the final rendered page to the user. As a result, XAML content will always appear in front of any graphics rendered by MonoGame. This ensures that any XAML controls we use as our user interface (for control buttons, text displays, and so on) will appear unobstructed in front of the game graphics.

The XAML rendering still takes any transparency within the controls into account, so it is quite possible to have controls that are partially transparent or that use alpha shading. These will blend in front of the MonoGame graphics, as you would expect them to.

With this into account, you should be able to throw an event from your game class (monogame), the xaml page can suscribe itself to it and then, when captured, render your xaml page (maybe a user control would be wiser as you won't navigate away from the main game page).

Hopefully, this will help you with your problem.

like image 171
Nahuel Ianni Avatar answered Nov 14 '22 03:11

Nahuel Ianni


Try to create a frame in your gamepage

    public static Frame RootFrame { get; private set; }

then in your click event put these lines

    RootFrame = new Frame();
    RootFrame.Navigate(typeof(about));

did this work?

like image 26
pandeSai Avatar answered Nov 14 '22 02:11

pandeSai