Текстовое поле считывания Monogame XAML внутри игрового цикла

Эй,

В настоящее время я работаю над своей второй игрой XNA/Monogame для Windows 8/Metro, но столкнулся с проблемой. Теперь мы подошли к моменту, когда нам нужно сохранить рекорд с прикрепленным к нему именем, поэтому мне нужно обрабатывать экранную клавиатуру, чтобы получить информацию.

Я просмотрел форум и нашел несколько тем, связанных с этим, но не нашел сообщения с примером кода или описанием, которое помогло мне полностью решить мою проблему. Я изменил свой проект на шаблон XAML, и у меня есть TextBox, работающий на моей GamePage, но теперь мне нужно получить TextBox внутри моего игрового цикла, чтобы прочитать его, чтобы я мог сохранить имя, кроме моего счета, и в настоящее время я понятия не имею, как сделай это.

Мой текущий код моего GamePage.cs

    public GamePage(string launchArguments)
    {
        this.InitializeComponent();

        // Create the game.
        _game = XamlGame<Main>.Create(launchArguments, Window.Current.CoreWindow, this);

        txtTest.TextChanged += txtTest_TextChanged;
    }

    void txtTest_TextChanged(object sender, TextChangedEventArgs e)
    {
        Debug.WriteLine(txtTest.Text); //Write content to public string in Main.cs
    }

Я узнал, как я могу записать содержимое TextBox в строку внутри моего игрового цикла, но теперь я застрял, как я могу управлять его свойствами TextBox из моего игрового цикла, чтобы я мог установить видимость и фокус. Нужно ли мне создавать свой собственный EventHandler, который будет следить, если я установлю логическое значение или что-то в этом роде?

Заранее спасибо.

Привет,

ДляT3X


person MrME    schedule 01.09.2013    source источник
comment
Я думаю, что у меня очень приблизительное представление о том, о чем вы говорите, но на этот вопрос сложно ответить без кода. Опубликуйте некоторые соответствующие фрагменты кода и объясните структуру вашего проекта.   -  person craftworkgames    schedule 02.09.2013
comment
Я обновляю свой вопрос, добавляя некоторую информацию, полученную в результате поиска в Интернете, и уточняю оставшуюся проблему.   -  person MrME    schedule 02.09.2013


Ответы (3)


Отказ от ответственности: позвольте мне просто сказать, что я никогда раньше не работал с проектами Windows 8 XAML или классом GamePage, но после небольшого поиска в Google я думаю, что понял достаточно, чтобы помочь.

Кажется, ваша проблема сводится к круговой зависимости. Вам нужна двусторонняя связь между вашей GamePage и вашим игровым классом.

Связь между GamePage и классом Game проста, потому что GamePage уже отвечает за создание класса Game и его сохранение в переменной-члене _game. Следовательно, чтобы отправлять сообщения с GamePage в Game, вам просто нужно добавить метод в класс Game, например:

void txtTest_TextChanged(object sender, TextChangedEventArgs e)
{
    _game.SetHighscoreName(txtTest.Text);

    Debug.WriteLine(txtTest.Text); //Write content to public string in Main.cs
}

Обратная связь (от Game к GamePage) немного сложнее, но ее можно решить с помощью интерфейса и внедрения свойств.

Сначала создайте интерфейс, принадлежащий вашему классу Game. Что я подразумеваю под этим; он находится в том же проекте и/или пространстве имен, что и класс Game. Это может выглядеть примерно так:

public interface IGamePageController
{
   void ShowHighscoreTextBox();
}

Затем добавьте свойство в свой класс Game следующим образом:

public IGamePageController GamePageController { get; set; }

Затем сделайте так, чтобы класс GamePage реализовал такой интерфейс:

public partial class GamePage : PhoneApplicationPage, IGamePageController
{
    //...

    public void ShowHighscoreTextBox()
    {
        txtTest.Visibility = Visibility.Visible;
    }
}

И, наконец, в конструкторе GamePage нужно установить свойство GamePageController.

// Create the game.
_game = XamlGame<Main>.Create(launchArguments, Window.Current.CoreWindow, this);
_game.GamePageController = this;

Когда у вас есть этот шаблон, вы можете легко добавлять новые способы взаимодействия между классами Game и GamePage, добавляя дополнительные методы к интерфейсу или классу Game.

person craftworkgames    schedule 02.09.2013
comment
Большое спасибо, это полностью решило мою проблему, и теперь я могу взаимодействовать в двух направлениях: D - person MrME; 05.09.2013

Вы можете совместно использовать модель представления между страницей XAML и вашей игрой.

Страница XAML GamePage создает экземпляр вашего игрового класса. Когда это произойдет, вы также можете сообщить игровому классу о вашей модели представления.

_game = XamlGame<Game1>.Create(launchArguments, Window.Current.CoreWindow, this);
_game.XamlGameDataViewModel = new GameDataViewModel();
DataContext = _game.XamlGameDataViewModel;

Более подробная информация содержится в моем сообщении разделение вашего просмотреть модель между Monogame и Xaml

person Richard Garside    schedule 11.10.2013

Если вам нужно сохранить некоторые значения, попробуйте использовать IsolatedStorage.
Как сообщает MSDN:
«Изолированное хранилище недоступно для приложений Магазина Windows. Вместо этого используйте классы данных приложения в Windows.Storage пространствах имен, включенных в среду выполнения Windows. API для хранения локальных данных и файлов».

Дополнительную информацию можно найти здесь.

Используя Windows.Storage, вы должны сделать что-то вроде этого:

Windows.Storage.ApplicationDataContainer localSettings = Windows.Storage.ApplicationData.Current.LocalSettings;
if (string.IsNullOrEmpty((string)Windows.Storage.ApplicationData.Current.LocalSettings.Values["highscore"]))
{  
    localSettings.Values["highscore"] = highscore;
}
person pinckerman    schedule 01.09.2013
comment
Мне действительно нужно сохранить некоторые значения, но я собираюсь перенести их на другие платформы, поэтому теперь я использую SQLite из-за того, что он более переносим. Поэтому я ценю совет, но мой вопрос о том, как прочитать текстовое поле, поэтому ваш ответ не имеет отношения к моему вопросу. - person MrME; 02.09.2013
comment
Вы не умеете читать текстовое поле или не умеете читать его в определенный момент? - person pinckerman; 02.09.2013
comment
Я знаю, как использовать TextBox.Text, проблема в том, как я могу получить к нему доступ из моей GamePage внутри моего игрового цикла и, таким образом, прочитать текст и установить некоторые переменные. - person MrME; 02.09.2013
comment
У вас должен быть файл GamePage.xaml, содержащий код XAML, и файл GamePage.xaml.cs, содержащий код C#. В этом вы можете получить доступ к своему TextBox по его параметру Name, который вы установили в другом файле. - person pinckerman; 02.09.2013
comment
Я знал, как получить к нему доступ в коде позади, и знал, что понял, как написать его просто в общедоступную строку внутри моего игрового цикла, теперь осталась проблема в том, что мне нужно получить доступ к свойствам этого текстового поля (Видимость и т. д.) внутри моего игрового цикла ( Я также обновил свой вопрос с этим) - person MrME; 02.09.2013