ToolStripStatusLabel не ведет себя как другие типоподобные элементы управления
У меня возникли проблемы с ToolStripStatusLabel в приложении Winforms. Чтобы лучше объяснить, у меня есть код здесь
bottomLbl.Text = "Adding file(s) to list...";
this.Text = "Adding file(s) to list...";
listAllFiles(carrier, type, chkListBox, withDestSystem, listBox, cmbBox);
bottomLbl.Text = "Done!";
this.Text = "Done";
То, что я не понимаю, это то, что this.Text
изменится на "Добавление файлов..", но не bottomLbl, хотя я установил это, прежде чем this.text
, Оба элемента управления получают "Готово!" текст после запуска функции listAllFiles.
Но есть ли что-то особенное, что я должен сделать на ToolStripStatusLabel?
2 ответа
Вам необходимо обновить форму перед вызовом функции
bottomLbl.Text = "Adding file(s) to list...";
this.Text = "Adding file(s) to list...";
this.Refresh();
listAllFiles(carrier, type, chkListBox, withDestSystem, listBox, cmbBox);
bottomLbl.Text = "Done!";
this.Text = "Done";
Мне кажется, что вы устанавливаете условие, при котором мы не можем достоверно предсказать, какое из обновлений пользовательского интерфейса будет отображаться на экране до того, как будут отображены окончательные обновления пользовательского интерфейса.
Вы выполняете некоторые обновления пользовательского интерфейса (например, label1.Text = ...) перед выполнением трудоемкого процесса (listAllFiles()). После этого вы делаете еще несколько (последних) обновлений пользовательского интерфейса.
Одно или несколько «ранних» обновлений пользовательского интерфейса помещаются в очередь для отображения, как только у основного потока (потока пользовательского интерфейса) есть время для обновления окна.
Чего мы не обязательно знаем, так это того, какие типы элементов управления (например, ToolStripStatusLabel или Label) внутренне рассматривают настройку своего свойства Text как нечто, что не может дождаться отображения.
Похоже, что один из этих типов позволит обновить свойство Text, не дожидаясь его отображения (это неблокирующий вызов), в то время как другой тип обеспечит отображение изменения перед продолжением (это блокирующий вызов).
Даже если вы определите их поведение с помощью тестирования, оно может измениться в будущем или в других средах.
При желании вы можете настроить один или несколько из этих типов, чтобы указать, следует ли блокировать или нет. Вы можете сделать это, вызвав Refresh() или Invalidate(). Но я рекомендую альтернативный подход:
Сведите нагрузку задач, выполняемых в потоке пользовательского интерфейса, к минимуму. Таким образом, пользовательский интерфейс лучше реагирует на действия пользователя, и вы можете быть более уверены в том, что обновления вашего пользовательского интерфейса будут отображаться быстро.
Как правило, это означает, что мы должны выполнять всю трудоемкую работу в другом потоке, асинхронно, и мы можем обновлять пользовательский интерфейс с состоянием этой работы так часто, как нам нравится. Для этого я рекомендую изучить тип BackgroundWorker. Его цель — выполнять трудоемкую работу асинхронно, сохраняя отзывчивый пользовательский интерфейс.