【问题标题】:How can I navigate through xaml pages with Monogame in a Windows Phone 8 project?如何在 Windows Phone 8 项目中使用 Monogame 浏览 xaml 页面?
【发布时间】:2014-05-21 21:56:33
【问题描述】:

我完成了 XNA 游戏的开发,然后创建了 Monogame 项目,并在我的设备上对其进行了测试。现在我制作了一些其他页面,例如“关于”页面。考虑到我有一个 Monogame 项目并且只有一个 XNA 代码,我该如何访问该页面?特别是在我的游戏中,我制作了一个主菜单,您可以在其中单击“关于”按钮并知道是否有人单击了:如何将该事件链接到“转到 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

【问题讨论】:

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


    【解决方案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 和 monogame(Window.Current 是 WP 和 WinRT 框架的一部分)。在这里,您将了解如何集成这两个框架以使用 WinRT xaml 视图创建单人游戏:)

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

    编辑

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

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

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

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

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

    XAML 呈现仍采用控件内的任何透明度 考虑到,所以很可能有控制是 部分透明或使用 alpha 着色。这些将融入 MonoGame 图形的前面,正如您所期望的那样。

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

    希望这能帮助您解决问题。

    【讨论】:

    • 我使用的不是 Windows Phone 8 项目模板,而是 Monogame 项目模板。它没有找到 Windows.Current !
    • @misiMe 用新信息编辑了我的答案。
    【解决方案2】:

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

        public static Frame RootFrame { get; private set; }
    

    然后在您的点击事件中放置这些行

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

    这行得通吗?

    【讨论】:

      【解决方案3】:

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

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

      此外,请确保在卸载游戏 xaml 页面时处置游戏对象。您可以通过订阅GamePageUnloaded 事件并在游戏对象上调用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());
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-04-20
        • 1970-01-01
        • 2016-07-23
        • 1970-01-01
        • 2016-10-20
        • 2015-02-12
        • 1970-01-01
        • 2014-05-22
        相关资源
        最近更新 更多