Я пытаюсь разместить игру XNA в окне WPF с помощью хост-элемента управления Windows Forms. У меня странная проблема с тем, что при запуске игры создается окно «Призрак». Он создается точно при первом вызове выхода из игры Update
.
Вот код обновления, код по умолчанию из нового проекта 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 Forms, как я уже сказал, с кодом ниже:
Соответствующий XAML находится здесь (у меня, очевидно, настроено пространство имен Forms и т. Д., Поэтому нет необходимости вставлять здесь):
<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();
}
где Viewer - это мой класс Game (из 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: Как определить происхождение фантомного окна?
Так что я пошел и попробовал Снуп. Но Snoop, вероятно, также полагается на итерацию Windows
и не видит там дополнительного окна. Я использую функцию перетаскивания (вы перетаскиваете курсор по экрану, а Snoop сообщает, какому процессу и окну он принадлежит), а Snoop сообщает, что Phantom Window на самом деле является моим MainWindow. Но мое MainWindow ТАКЖЕ то же самое окно, согласно Snoop. Так что этот фантом несколько тесно связан (или, может быть, «ребенок»?) Моего экземпляра MainWindow, но мне нужен способ закрыть его (или, по крайней мере, скрыть).
Есть идеи?