Как изменить текст метки через несколько секунд? - PullRequest
0 голосов
/ 24 сентября 2018

Я искал и пробовал много подходов к этой проблеме.

В приложении Visual Studio 2015 WinForma я хочу, чтобы текст Label изменялся после некоторой задержки.

Из многих моих подходов я могу подтвердить, что строковое значение метки изменилось с помощью MessageBox, но экранный интерфейс не изменился.

Пока я пробовал:

1: Thread.Sleep(number) внутри Public Form1() до изменения значения.
Результат: кажется, что пользовательский интерфейс не обновляется до конца функции.

2: nameoflabel.refresh(); ВЕЗДЕ.
Результат: нигде ничего не делает.

3: используйте System.Timers и измените значение моего Label в истекшем таймерефункция.
Результат: изменяет значение Label, но не отображается на экране.

4: поскольку все, что включает нажатие кнопки, отлично работает для изменения текста моей метки, я рассказал, как имитироватьнажал кнопку с buttonName.preformClick() и сделал для этого поддельную кнопку.
Результат: значение меняется, но все ещена экране ничего не меняется.

Я начинаю верить, что это должно быть ошибкой.Да?Нет?В любом случае, вот что мне нужно для работы:

public partial class Form1 : Form
{
    public System.Timers.Timer holder;
    Label say;

    public Form1()
    {
        InitializeComponent();

        say = new Label();
        say.Text="start text";
        this.Controls.Add(say);
        holder = new System.Timers.Timer(5000);
        holder.Elapsed += new ElapsedEventHandler(holdone); 
        holder.Enabled = true;
    }

    public void holdone(Object source, ElapsedEventArgs e)
    {
        //messagebox is correct but onscreen gui is not
        say.Text = "new after seconds";
        MessageBox.Show(say.Text);
    }
}

Ответы [ 2 ]

0 голосов
/ 24 сентября 2018

Вместо этого вы можете использовать System.Windows.Forms.Timer, который обновит пользовательский интерфейс по вашему желанию:

public partial class Form1 : Form
{
    private System.Windows.Forms.Timer holder;
    private System.Windows.Forms.Label say;

    public Form1()
    {
        InitializeComponent();

        say = new Label {AutoSize = true, Text = "start text"};
        Controls.Add(say);

        holder = new Timer {Interval = 5000};
        holder.Tick += HolderTick;
        holder.Enabled = true;
    }

    private void HolderTick(object sender, EventArgs e)
    {
        say.Text = $"new after {holder.Interval / 1000} seconds";
        holder.Enabled = false;
    }
}
0 голосов
/ 24 сентября 2018
public void holdone(Object source, ElapsedEventArgs e)
{
     say.Invoke((MethodInvoker)delegate
    {
        say.Text = "new after seconds"; //predicated upon a declared var say = new Label()
    }); 
} 

Это пример обработчика событий System.Timers.Timer Elapsed, который должен (относительно) немедленно повлиять на ваш пользовательский интерфейс.

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