把XNA嵌入到WPF中運行

來源:互聯網
上載者:User

首先要明確一點,我這篇所謂的把XNA嵌入到WPF中,並不是直接嵌入到WPF中,而是先嵌入到WinForm的Control中,然後再通過WindowHost控制項嵌入到WPF中。因為我之前也找過把XNA嵌入到WPF中的方法,找了很多文章也包括英文的,但看了大半天發現其實現方式也都是通過WinForm中轉了一下。也有可能XNA出現的時候,WPF還沒有出現,所以支援不好。但XNA和WPF的底層都是D3D,所以,我覺得以後XNA應該是可以很方便的嵌入到WPF中的。

為什麼XNA能夠嵌入到Winfrom中呢,因為我們在運行XNA程式時,XNA呈現的視窗本身就是一個WinForm的視窗。我們可以通過下面的代碼擷取到運行該XNA程式的視窗。Form xnaWindow = (Form)Control.FromHandle((Game.Window.Handle));所以我們可以看出XNA對WinFrom有著很好的支援,從代碼上看,理論上包含Handle控制代碼的對象都可以稱為XNA的渲染目標對象。那我們就以Winform的Control對象為例,代碼如下:

this._graphicsDeviceManager.PreparingDeviceSettings += new EventHandler<PreparingDeviceSettingsEventArgs>(graphics_PreparingDeviceSettings);
this._sneceControl .OnSizeChanged +=new EventHandler(SneceControl_Resize);
private void graphics_PreparingDeviceSettings(object sender, PreparingDeviceSettingsEventArgs e)
{
e.GraphicsDeviceInformation.PresentationParameters.DeviceWindowHandle = this._sneceControl.ControlHandle;
}
private void SneceControl_Resize(object sender, EventArgs e)
{
this._graphicsDeviceManager.PreferredBackBufferWidth = this._sneceControl.ControlWidth;
this._graphicsDeviceManager.PreferredBackBufferHeight = this._sneceControl.ControlHeight;
this._graphicsDeviceManager.ApplyChanges();
}

上面的代碼中,有設定渲染目標的代碼,把渲染的目標設定為當前自己定義的Control的控制代碼。當Control的大小發生變化時,一些渲染的參數要發生變化。以上代碼是實現在Winform中載入XNA的最基礎的代碼,但僅僅這些代碼還不夠,還有一些輔助代碼。

例如,如果要把Control放在WPF的表單中,但XNA本身還有一個表單,這樣在系統運行時會同時彈出兩個表單。所以我們要加一些輔助代碼,在系統啟動時,把WPF的表單的Topmost設定成True,當初始化完畢,得到Game對象後,通過Game對象擷取XNA內建的WinForm表單,把該表單的可見度設定成False。

在用該功能時,首先要初始化一個情境控制項,然後添加到主表單上。在表單的FormLoad事件的函數中條用Game的Run函數。在條用Run函數之後,程式會再Run函數裡面進入迴圈,一直等程式運行結束後才會退出接下往下執行。

我在WPF中實驗時,每次開啟的狀體都是沒有渲染的,稍微改變一下表單的大小,就會顯示出來。所以我在表單初始化時,把表單設定為最小化狀態,在FormLoad函數裡面,調用Game.Run之前把表單設定為最大化,這樣就能保證表單在啟動時改變了大小,從而使渲染的結果顯示出來。代碼如下:

private void Window_Loaded(object sender, RoutedEventArgs e)
{
BM.WinScene.UI.SceneControl mySceneControl = new WinScene.UI.SceneControl();
this.Content = mySceneControl;

using (this._game = new WinScene.BLL.Game1(mySceneControl))
{
mySceneControl.SetApplication(this._game);
this.WindowState = System.Windows.WindowState.Maximized;
this._game.Run();
}
}

下面圖是系統在WPF中啟動並執行:

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.