Search code examples
c#buttontimerwpf-controlswindows-forms-designer

Button cannot be clicked when timer is running C#


I have made an application to have a marquee text with an exit button. The button works fine when the timer is disabled but it cannot be clicked once the timer is enabled. Can anyone please help me? I tried researching online but no answer seems to be available, thank you! :)

this is the code that I have

    public FORM_ENTRY()
    {
        InitializeComponent();
        LabelWelcome.Text = "Welcome! Welkom! Selamat Datang! Wilkommen!";
        timer1.Enabled = true;
        LabelCheckedIn.Visible = false;
        LabelEnjoy.Visible = false;
    }

    private void StartScroll()
    {
        System.Text.StringBuilder sb = new System.Text.StringBuilder(LabelWelcome.Text + " ");

        while (true)
        {
            char ch = sb[sb.Length - 1];
            sb.Remove(sb.Length - 1, 1);
            sb.Insert(0, ch);
            LabelWelcome.Text = sb.ToString();
            LabelWelcome.Refresh();
            System.Threading.Thread.Sleep(500);
        }
    }

    private void timer1_Tick(object sender, EventArgs e)
    {
        StartScroll();
    }

    private void ButtonExit_Click(object sender, EventArgs e)
    {
        this.Close();
    }

Solution

  • Use a DispatchTimer, it will run on a separate thread, and the event will be triggered on the UI thread, so you will be able to modify your UI

    private DispatcherTimer dispatcherTimer;
    
    
    public FORM_ENTRY()
    {
        InitializeComponent();
        LabelWelcome.Text = "Welcome! Welkom! Selamat Datang! Wilkommen!";
        LabelCheckedIn.Visible = false;
        LabelEnjoy.Visible = false;
    
        // Initialize Dispatcher
        dispatcherTimer = new System.Windows.Threading.DispatcherTimer();
        dispatcherTimer.Tick += new EventHandler(dispatcherTimer_Tick);
        // Five seconds delay
        dispatcherTimer.Interval = new TimeSpan(0, 0, 5);
        dispatcherTimer.Start();
    }
    
    private void dispatcherTimer_Tick(object sender, EventArgs e)
    {
        System.Text.StringBuilder sb = new System.Text.StringBuilder(LabelWelcome.Text);        
        char ch = sb[sb.Length - 1];
        sb.Remove(sb.Length - 1, 1);
        sb.Insert(0, ch);
        LabelWelcome.Text = sb.ToString();
    }
    
    private void ButtonExit_Click(object sender, EventArgs e)
    {
        this.Close();
    }