BladeLogan Ответов: 1

Как изменить текст метки при каждом тиковом событии C# .NET


Я думаю, что делаю это сложнее, чем должно быть..

Теперь мой код пытается изменить myLabel1 на firstBlinkName; и secondBlinkName; одновременно.. Я хотел бы немного времени между ними, я действительно не знаю, как это сделать.

Мне нужно создать что-то подобное..

            var firstBlinkName = nameBlinkFirstName.Text;
            var secondBlinkName = nameBlinkSecond.Text;

Label.Text = firstBlinkName;
//Pause of 1 second
Label.Text = secondBlinkName;




Но вот как все закончилось

private void nameBlinkInterval_Tick(object sender, EventArgs e)
{
    var firstBlinkName = nameBlinkFirstName.Text;
    var secondBlinkName = nameBlinkSecond.Text;
    myLabel1.text = firstBlinkName;
    myLabel1.text = secondBlinkName;
}


Что я уже пробовал:

Все что я пробовал это int он вопрос

1 Ответов

Рейтинг:
2

Sergey Alexandrovich Kryukov

Я бы сделал это через отдельный поток, что является более надежным способом. Хотя это зависит от цели. Некоторая неточность во времени может быть компенсирована чтением в реальном времени на каждой итерации цикла. Хорошо, например, производить впечатление плавного движения; в других случаях это нехорошо. Вы даже можете создать реалистичные часы, но вам понадобится задержка (Thread.Sleep) несколько меньше, чем период времени для обновления вида часов.

С таймером нужно быть осторожнее. Первая идея такова: вам, вероятно, нужно какое-то почти периодическое поведение. Если это так, убедитесь, что вы никогда не используете тип таймера System.Windows.Timer: это просто и гарантирует, что обработчик событий вызывается в потоке пользовательского интерфейса, но его точность синхронизации непомерно плоха. Его можно использовать, скажем, для реализации таймаутов, когда точность вообще не критична.

Давайте вернемся к другим таймерам, которые могут дать вам разумную точность. Они не могут гарантировать вызов метода обработчика в потоке пользовательского интерфейса. Вы должны принять это во внимание. Вы не можете вызвать что-либо, связанное с пользовательским интерфейсом, из потока, не являющегося пользовательским интерфейсом. Вместо этого вам нужно использовать метод Invoke или BeginInvoke от System.Windows.Threading.Dispatcher (для обеих форм или WPF) или System.Windows.Forms.Control (Только формы).

Вы найдете подробное объяснение того, как это работает, и примеры кода в моих прошлых ответах:
Контроль.Invoke () против Control.BeginInvoke(),
Проблема со сканером Treeview и MD5.

См. также дополнительные ссылки на резьбу:
.Чистая события в главном потоке,
Как получить событие keydown для того чтобы работать в другом потоке, в vb.net,
Контроль событий, не срабатывающих после включения отключения + многопоточности.

—СА


BladeLogan

Очень информативный ответ, но я пошел со своим собственным методом.. Может быть, это и не самое лучшее, но оно работает, и у меня нет с ним никаких проблем.. Вот что я сделал..

Я создаю это вне своей функции, в пространстве классов.

а потом это в моем тиковом событии..

если (мигание == 1){
мигание = 2;
метка1.текст = элемент textbox1.Текст;
} еще {
мигание = 1;
метка1.текст = поле textbox2.Текст;
}

Sergey Alexandrovich Kryukov

Это не "ваш собственный метод", это то же самое. Вы должны поместить его под Invoke или BeginInvoke. Какой у вас тип таймера?
Мы никогда не обсуждали содержание этикетки. Это просто не имеет значения.
—СА