Как получить пользовательский ввод из всплывающего элемента управления

У меня есть UserControl, который использует всплывающее окно в wp7. Пользовательский элемент управления имеет текстовое поле для ввода и кнопку отправки. Моя проблема в том, что код не останавливается, когда отображается всплывающее окно. Он продолжается по коду и не ждет, пока пользователь нажмет "отправить".

Что является хорошей практикой для того, чтобы код останавливался подобно окну сообщения с кнопкой "ОК"?

//my custom popup control
InputBox.Show("New Highscore!", "Enter your name!", "Submit");
string name = InputBox.GetInput();
//it does not wait for the user to input any data at this point, and continues to the next piece of code

if (name != "")
{
     //some code
}

1 ответ

Решение

Вы можете сделать это с помощью события или асинхронного метода. Для этого события вы бы подписались на закрытое событие вашего всплывающего окна.

    InputBox.Closed += OnInputClosed;
    InputBox.Show("New Highscore!", "Enter your name!", "Submit");

...

private void OnInputClosed(object sender, EventArgs e)
{
    string name = InputBox.Name;
}

Вы бы запустили событие, когда пользователь нажимает кнопку ОК

private void OnOkayButtonClick(object sender, RoutedEventArgs routedEventArgs)
{
    Closed(this, EventArgs.Empty);
}

Другой вариант - использовать асинхронный метод. Для этого вам понадобится пакет Async Nuget. Чтобы сделать метод асинхронным, вы используете два основных объекта: Task и TaskCompletionSource.

private Task<string> Show(string one, string two, string three)
{
    var completion = new TaskCompletionSource<string>();

    OkButton.Click += (s, e) =>
        {
            completion.SetResult(NameTextBox.Text);
        };


    return completion.Task;
}

Затем вы бы ожидали вызова метода show.

string user = await InputBox.Show("New Highscore!", "Enter your name!", "Submit");

Я считаю, что инструментарий Coding4Fun также имеет несколько хороших полей ввода

Другие вопросы по тегам