2017-02-10 22 views
2

Извините, если вопрос плохо сформулирован, новый для C#. Я пытаюсь сделать текстовое приключение. Я уже написал всю основную логику и решил попробовать использовать WPF для базовой графики. Поэтому я инициализирую окно всеми необходимыми элементами управления, а затем прохожу через мой основной цикл до тех пор, пока вы не активируете выход. Сначала я попытался поставить цикл сразу после инициализации окна.В проекте WPF, как мне инициализировать мое окно и элементы управления, а затем перейти в основной цикл?

public MainWindow() 
{ 
    InitializeComponent(); 
    Game.Logic(); 
} 

Это не очень хорошо работает, так как Window прекратил инициализацию вообще. Итак, я немного искал язык и пытался использовать загруженное событие. Как только я это сделал, окно появляется, когда я запускаю код, но ни один из элементов управления не появляется, и окно заморожено. Та же проблема сохранялась, когда я пытался использовать Loaded Event для самих элементов управления. Хотя в моей игровой петле может быть какая-то ошибка, я думаю, что Window должен по крайней мере иметь возможность инициализировать все свои элементы управления, если я правильно перехожу в Loop. Правильно ли было бы войти в файл приложения и использовать там загруженное событие? Или я просто совершенно не в порядке?

ответ

3

Вы довольно далеко от линии.

Выполняя плотную петлю в потоке пользовательского интерфейса, вы производите обновление UI , даже если вы прошли мимо ваших текущих блокпостов. Что касается Windows, вы «заморожены».

Вам нужно запустить логический цикл в другом потоке и использовать Dispatcher.BeginInvoke, чтобы получить какое-либо обновление пользовательского интерфейса (и только UI обновления) обратно на поток пользовательского интерфейса. Хотя они обычно не так полезны в игровых контекстах, также рассмотрите возможность использования шаблона MVVM с Binding s, поскольку его сложнее попасть в эту ловушку.

Для текстового приключения, я бы сильно рекомендую шаблон MVVM, так как все ваши элементы легко представлены в виде связанных предметов/коллекций. Кроме того, вы получаете хорошие современные методы разработки :)

+0

Спасибо, имеет смысл. Поэтому мне нужно запустить другой поток где-то, содержащий логический цикл. Это звучит в Google. Я знаю, что должен использовать шаблон MVVM ... Я его реализую, когда у меня все получится. – PPFY

+0

Вы также можете попытаться запустить свою логику цикла в обработчике события Tick DispatcherTimer, который уже работает в потоке пользовательского интерфейса. – Clemens

+0

@Clemens true, но если он проводит интенсивную обработку, поток пользовательского интерфейса будет заблокирован. Я бы, вероятно, избегал этого маршрута. – BradleyDotNET

1

Я бы рекомендовал использовать фоновый рабочий стол, который позволит вам выполнять обновления пользовательского интерфейса с использованием многопоточности, чтобы ваш основной поток оставался отзывчивым.

+0

Пока это работает; помните, что прямое манипулирование пользовательским интерфейсом ** должно происходить ** в потоке пользовательского интерфейса. – BradleyDotNET