我想在Windows窗體主機控件的WPF窗口內託管XNA遊戲。我有一個奇怪的問題,當我運行遊戲時會創建一個「幻影」窗口。它是在第一次調用遊戲的Update
方法退出時創建的。在WPF內部託管XNA - 奇怪的「幽靈」窗口問題
這裏是更新代碼,從一個新的XNA項目的默認之一:
protected override void Update(GameTime gameTime)
{
// Allows the game to exit
if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
this.Exit();
// TODO: Add your update logic here
base.Update(gameTime);
}
創建後,我從最後一個大括號步驟在最底層的窗口。 (是的,怪異要把它不是在base.Update
之後卻在該}
後)
我有一個Windows窗體主機正如我已經說過,用下面的代碼:
相關的XAML是在這裏(我已經得到了明顯的形式命名空間等進行設置,所以沒有必要在這裏貼):
<WindowsFormsHost Margin="12" Name="windowsFormsHost1">
<forms:Panel x:Name="p"></forms:Panel>
</WindowsFormsHost>
和代碼隱藏:
private void Window_Loaded(object sender, RoutedEventArgs e)
{
Viewer v = new Viewer(p.Handle);
v.Run();
}
在觀衆是我的邯E類(從XNA),具有:
public Viewer(IntPtr handle)
{
graphics = new GraphicsDeviceManager(this);
Content.RootDirectory = "Content";
panelHandle = handle;
graphics.PreparingDeviceSettings += new EventHandler<PreparingDeviceSettingsEventArgs>(graphics_PreparingDeviceSettings);
}
void graphics_PreparingDeviceSettings(object sender, PreparingDeviceSettingsEventArgs e)
{
e.GraphicsDeviceInformation.PresentationParameters.DeviceWindowHandle = panelHandle;
}
這種技術是從一個博客帖子我前幾天發現(我不能再現在發現,它是完全一樣的方式 - 用這個帖子是舊的,並沒有我遇到的問題的例外)。
問題是,我建立並運行,但隨着我的「正常」窗口,有一個幻影窗口創建。在我的主窗口中,XNA呈現正確。但幻影窗口(窗口標題是我的程序集名稱),沒有任何內容,不可調整大小,光標不在其內部顯示,並且它在主窗口中起作用,因爲當我最小化該窗口時,我的主窗口停止渲染XNA內容,直到我將幻像窗口最小化。我的程序不會退出,直到我關閉兩個窗口。 (如果我只關閉幻像,我猜主窗口會停止渲染我的XNA內容)。我試着用App.Current.Windows迭代我的應用程序窗口,我所有的主窗口都列在那裏,這就是爲什麼我將這個半響應窗口稱爲「幻影」窗口的原因。它在WPF中的對象模型中不可見。
當我寫「XNA WPF幻影窗口」,第一我有是這樣的:WPF: How to determine the origin of a phantom window?
所以我去,並試圖窺探。但是Snoop可能也依賴於迭代,並且在那裏也沒有看到任何額外的窗口。我使用十字拖動功能(將光標拖動到屏幕上,Snoop會告訴它屬於哪個進程和窗口),並且Snoop會告訴Phantom Window實際上是我的MainWindow。但據Snoop稱,我的MainWindow也是同一個窗口。所以這個幻影與我的MainWindow實例有些密切相關(或者可能是一個「孩子」?),但我需要一種方法來關閉它(或者至少隱藏它)。
任何想法?
好,必須有一些方法來糾正地方。我希望儘可能保持高水平,而且我已經有了工作,只需要一個幻影窗口,所以應該有一個「單行代碼」來關閉它。 –