如何在Windows Phone 8项目中使用Monogame浏览xaml页面?

时间:2014-05-21 21:56:33

标签: c# windows-phone-8 xna monogame

我完成了开发XNA游戏,然后创建了Monogame项目,并在我的设备上进行了测试。现在我做了一些其他的页面,比如" about"页。考虑到我有一个Monogame项目和一个XNA代码,我怎么能去那个页面?特别是在我的游戏中,我创建了一个主菜单,您可以点击" about"按钮并知道是否有人点击过:如何将该事件链接到"转到about.xaml"功能

在XNA内部,更新方法:

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

我试过了:

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

但它抛出:System.UnauthorizedAccessException

3 个答案:

答案 0 :(得分:1)

我自己没有尝试过这个,但是WP框架有Window.Current.Content对象,您可以用它来加载不同的视图。

例如:

// 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();

因此,如果您使用的是Windows Phone 8项目模板,使用该对象可以轻松告诉应用程序加载xaml视图或游戏视图。

您还可以在this site上查看如何使用WinRT和单一游戏进行操作(Window.Current是WP和WinRT框架的一部分)。在这里,您将找到如何集成两个框架以使用WinRT xaml视图创建单一游戏:)

有关Window.Current的更多信息,请查看this link

修改

如果你使用monogame作为windows phone模板,你的项目中应该已经存在一个XAML页面,用于加载游戏本身,以及用于视频和声音播放的媒体元素。

该页面名为" GamePage.xaml",您可以将其用于导航目的。

此信息取自" Windows 8 and Windows Phone 8 Game Development"由Adam Dawes撰写的书(第13章)。

  

对于Windows Phone项目,GamePage实现为   一个普通的页面。 [...]   在Windows Phone页面中是一个完整页面   网格控制,其中是另一种全屏控制类型   DrawingSurface。这是DirectX可以使用的一种控件   将图形渲染到Windows Phone页面。我们的XAML内容也可以   放入网格。 MediaElement控件存在于   网格也是。 MonoGame使用它来进行一些音频播放   功能。

     

在两个平台上,XAML和DirectX的设计方式   interactive是首先处理DirectX渲染。一旦这个   已经完成,XAML渲染器然后控制并添加它   在呈现最终呈现页面之前,将内容作为第二步   给用户。 因此,XAML内容将始终显示在前面   MonoGame呈现的任何图形。这确保了任何XAML控件   我们用作我们的用户界面(用于控制按钮,文本显示和   所以)在游戏画面前会显得畅通无阻。

     

XAML渲染仍然在控件中采用任何透明度   考虑到,所以很可能有控制   部分透明或使用alpha阴影。这些将融入其中   MonoGame图形的正面,正如您所期望的那样。

考虑到这一点,你应该能够从你的游戏类(monogame)中抛出一个事件,xaml页面可以自我控制,然后在捕获时,渲染你的xaml页面(也许用户控件会更明智因为你不会离开主游戏页面。)

希望这可以帮助您解决问题。

答案 1 :(得分:1)

尝试在游戏页面中创建一个框架

    public static Frame RootFrame { get; private set; }

然后在你的点击事件中放入这些行

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

这样做了吗?

答案 2 :(得分:0)

您收到该错误,因为必须从UI线程调用,如下所示:

Deployment.Current.Dispatcher.BeginInvoke(() => 
    (App.Current.RootVisual as PhoneApplicationFrame).Navigate(new Uri("/Pages/MenuPage.xaml", UriKind.Relative)));

此外,请确保在卸载游戏xaml页面时丢弃游戏对象。您可以通过订阅Unloaded的{​​{1}}事件并在游戏对象上调用GamePage来实现此目的。见下文:

Dispose