如何在Windows Phone 8项目中使用Monogame浏览xaml页面?
本文关键字:Monogame 浏览 xaml 页面 Windows Phone 项目 | 更新日期: 2023-09-27 18:04:26
我完成了一款XNA游戏的开发,然后我创建了《Monogame》项目,并在我的设备上进行了测试。现在我做了一些其他的页面,比如"关于"页面。考虑到我有一个《一夫一妻制》项目,而且只有XNA代码,我怎么才能进入那个页面?特别是在我的游戏中,我制作了一个主菜单,你可以点击"关于"按钮,并知道是否有人点击了:我如何将该事件链接到"转到关于"。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
我自己没有尝试过,但是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视图或游戏视图。
你也可以在这个网站上查看如何使用WinRT和monogame (Window.Current
是WP和WinRT框架的一部分)。在这里,您将发现如何集成这两个框架,以便使用WinRT xaml视图创建一个单游戏:)
查看有关窗口的更多信息。当前,查看此链接
编辑
如果你使用的是windows phone的单游戏模板,那么你的项目中应该已经存在一个XAML页面,用于加载游戏本身,以及用于视频和声音播放的媒体元素。
这个页面叫做"GamePage"。Xaml ",您可以将其用于导航目的。
这个信息来自Adam Dawes写的《Windows 8和Windows Phone 8游戏开发》一书(第13章)
在Windows Phone项目中,GamePage实现为一个正常的页面。[…]在Windows Phone页面内是一个完整的页面网格控件,里面是另一个全屏控件对DrawingSurface。这是DirectX可以使用的一种控件将图形渲染到Windows Phone页面。我们的XAML内容也可以是放入网格中。控件中存在一个MediaElement控件网格。《一夫一妻》在一些音频回放中使用了这个功能功能。
在这两个平台上,XAML和DirectX的设计方式交互是DirectX渲染首先被处理。一旦这个完成后,XAML呈现器就会控制并添加它的内容作为第二步,在呈现最终呈现的页面之前给用户。因此,XAML内容将始终出现在任何由MonoGame渲染的图形。这确保了任何XAML控件作为我们的用户界面(用于控制按钮、文本显示和)
XAML呈现仍然在控件中使用任何透明性考虑,所以很有可能有这样的控件部分透明或使用alpha阴影。这些会混在一起
考虑到这一点,你应该能够抛出一个事件从你的游戏类(monogame), xaml页面可以订阅它自己,然后,当捕获,呈现你的xaml页面(也许一个用户控件会更明智,因为你不会从主游戏页面导航)。
希望这对你的问题有帮助。
尝试在你的游戏中创建一个框架
public static Frame RootFrame { get; private set; }
然后在点击事件中输入以下行
RootFrame = new Frame();
RootFrame.Navigate(typeof(about));
这个有用吗?
你会收到这个错误,因为调用必须从UI线程进行,像这样:
Deployment.Current.Dispatcher.BeginInvoke(() =>
(App.Current.RootVisual as PhoneApplicationFrame).Navigate(new Uri("/Pages/MenuPage.xaml", UriKind.Relative)));
另外,确保在卸载游戏xaml页面时处理游戏对象。您可以通过订阅GamePage
的Unloaded
事件并在游戏对象上调用Dispose
来实现这一点。见下文:
public partial class GamePage : PhoneApplicationPage
{
private LoonieGame _game;
public GamePage()
{
InitializeComponent();
_game = XamlGame<LoonieGame>.Create("", this);
this.Unloaded += GamePage_Unloaded;
}
void GamePage_Unloaded(object sender, RoutedEventArgs e)
{
Deployment.Current.Dispatcher.BeginInvoke(() => _game.Dispose());
}
}