簡體   English   中英

如何在Windows Phone 8項目中使用Monogame瀏覽xaml頁面?

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

我完成了開發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

我自己沒有嘗試過,但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視圖創建單一游戲:)

有關Window.Current的更多信息,請查看此鏈接

編輯

如果你使用monogame用於windows phone模板,你的項目中應該已經存在一個XAML頁面,用於加載游戲本身,以及用於視頻和聲音播放的媒體元素。

該頁面名為“GamePage.xaml”,您可以將其用於導航目的。

此信息來自Adam Dawes撰寫的“ Windows 8和Windows Phone 8游戲開發 ”一書(第13章)。

對於Windows Phone項目,GamePage實現為普通頁面。 [...]在Windows Phone頁面中是一個整頁Grid控件,其中是另一個DrawingSurface類型的全屏控件。 這是DirectX可用於將圖形呈現到Windows Phone頁面的一種控件。 我們的XAML內容也可以放入網格中。 MediaElement控件也存在於Grid中。 MonoGame使用它來實現一些音頻播放功能。

在這兩個平台上,XAML和DirectX設計為交互的方式是首先處理DirectX渲染。 完成此操作后,XAML渲染器將獲取控制權並在將最終呈現的頁面呈現給用戶之前將其內容添加為第二步。 因此,XAML內容將始終顯示在MonoGame呈現的任何圖形的前面 這確保了我們使用的任何XAML控件作為我們的用戶界面(用於控制按鈕,文本顯示等)將在游戲圖形前面顯得暢通無阻。

XAML渲染仍然會將控件中的任何透明度考慮在內,因此很可能擁有部分透明的控件或使用alpha着色的控件。 這些將融合在MonoGame圖形的前面,正如您所期望的那樣。

考慮到這一點,你應該能夠從你的游戲類(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頁面時丟棄游戲對象。 您可以通過訂閱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());
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM