Текст ярлыка не обновлен - PullRequest
       11

Текст ярлыка не обновлен

2 голосов
/ 17 декабря 2009

У меня есть форма Windows с строкой состояния, которая показывает текущее состояние приложения. У меня есть класс с именем AppState с обновлением метки в строке состояния, и он удаляет состояние обратно на «Готово».

В коде, когда я выполняю такую ​​операцию, как:

using (AppState state = new AppState("Processing..."))
{
     //Do some work that take some seconds
}

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

santosc, ты прав, это единственное, что я делаю. Вот код AppState

public class AppState : IDisposable
{
    static string Default = "Ready";

    public AppState(string status)
    {
        Form.StatusLabel.Text = status;
    }

    public void Dispose()
    {
        Form.StatusLabel.Text = Default;
    }
}

Ответы [ 6 ]

5 голосов
/ 17 декабря 2009

Это всегда одно и то же ...

Если вы хотите запустить что-то, что занимает некоторое время, не делайте этого в вашем потоке GUI, иначе ваш GUI зависнет (без обновлений метки, без изменения размера, без перемещения, без каких-либо действий).

Заполнение вашего кода на тысячи мест с помощью Application.DoEvents () также является плохой практикой.

Если у вас есть какое-то долго выполняемое задание (long означает> 1 сек), вам, вероятно, следует использовать BackgroundWorker . Может быть, это немного сложнее в начале, но вам понравится, если ваша программа станет более сложной. В связи с тем, что это уже обсуждалось несколько раз, здесь есть ссылка с некоторым примером кода .

Теперь, когда вы знаете правильный инструмент (BackgroundWorker) для решения вашей проблемы, вы должны заставить его работать (или задать другой вопрос о вашей новой конкретной проблеме).

4 голосов
/ 17 декабря 2009

Похоже, вы хотите поставить Application.DoEvents() после установки значения текстового поля StatusLabel. Это заставляет Windows Forms обрабатывать очередь событий Windows для вашей формы, вызывая перерисовку изменений.

2 голосов
/ 17 декабря 2009

Я новичок в C #, но почему бы вам не сделать что-то вроде:

private void updateStatusBar(string status)
{
    if (StatusLabel.InvokeRequired)
    {
        StatusLabel.Invoke((MethodInvoker)(() =>
                   {
                       StatusLabel.Text = status;
                   }));
    }
    else
    {
         StatusLabel.Text = status;
    }
}

Когда вы хотите обновить статус?

2 голосов
/ 17 декабря 2009

для обеспечения безопасности потоков используйте Invoke и тестируйте с InvokeRequired в форме, подобной:

    // code outside the myForm:-----------------------
    if (myForm.InvokeRequired)
        myForm.Invoke(new ChangeLabelEventHandler(ChangeLabel), "teeeest");
    else
        myForm.ChangeLabel("teeeest");


    // code in the myForm:-----------------------------
    public delegate void ChangeLabelEventHandler(string newText);

    private void ChangeLabel(string newLabelText)
    {
        this.label1.Text = newLabelText;
    }
0 голосов
/ 08 октября 2014

use Label.Refresh (); это экономит много времени. Это должно работать для вас

0 голосов
/ 17 декабря 2009

Возможно, несколько проблем могут решить вашу проблему.

Самый простой способ - использовать BackgroundWorker.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...