Операторы выполняются, но не добавляют текст в TextBox - PullRequest
0 голосов
/ 20 октября 2019

Я создал приложение C # WPF. Он берет ввод URL из текстового поля и показывает загруженный HTML-файл в другом текстовом поле одним нажатием кнопки. Чтобы сообщить пользователю, пока он не загрузит веб-страницу, я добавляю текст в самом начале.

public void urlAnalyzer()
{
    // Append text to Result box
    Result.AppendText("Please wait, inspecting the URL.\n");

    // Initiating WebClient to download webpage
    WebClient inspecter = new WebClient();

    // try-catch to avoid exception in a generic way
    try
    {
        // stroring downloaded page in savedData
        savedData = inspecter.DownloadString(webpage);

        // appending downloaded html in Result box
        Result.AppendText(savedData);
    }
    catch
    {
        Result.AppendText("You did not enter any valid URL.");
    }
}

Когда вызывается urlAnalyzer(), Result.AppendText() переходит к методу-обработчику событий текстового поля Result,

private void Result_TextChanged(object sender, TextChangedEventArgs e)
{

}

Этот метод события посещается каждый раз, когда вызывается Result.AppendText(), но он не добавляет строку в поле Result. Когда функция urlAnalyzer() полностью посещена, тексты появляются в окне результатов.

Как сделать, чтобы добавленный текст появлялся в текстовом поле при выполнении оператора добавления? Как обновить текстовое поле при каждом вызове добавления текста?

1 Ответ

2 голосов
/ 20 октября 2019

WebClient.DownloadString() выполняется в потоке пользовательского интерфейса и блокирует обновления пользовательского интерфейса. Используйте асинхронную версию метода загрузки:

public async void urlAnalyzer()
{
    // Append text to Result box
    Result.AppendText("Please wait, inspecting the URL.\n");

    // Initiating WebClient to download webpage
    WebClient inspecter = new WebClient();

    // try-catch to avoid exception in a generic way
    try
    {
        // stroring downloaded page in savedData
        savedData = await inspecter.DownloadStringTaskAsync(webpage);

        // appending downloaded html in Result box
        Result.AppendText(savedData);
    }
    catch
    {
        Result.AppendText("You did not enter any valid URL.");
    }
}
...