如何在不使用 C# 中的 DrawString() 方法或 MessageBox() 的情况下在 Form 或 PictureBox 上显示特定时间的字符串

How to display a string for a certain time on Form or PictureBox without using DrawString() method or MessageBox() in C#

我尝试在 onPaint() 方法中使用 DrawString() 方法根据另一个方法中的标志定期显示字符串... 我没能正确显示它,因为它出现后很快就消失了!!

有没有其他方法,即不使用 DrawString()MessageBox(),来显示或绘制这样的消息。

请注意,我使用了 Thread.Sleep()!.

里面 onPaint() :

 if(auvSend == true) {

                base.OnPaint(e);



                g.DrawString("Received Aggrigated Data from AUV # " + auv[auvSenderID].auvID, font,auvSendMsg, 500, 36); // Display that the sink receive data from the AUV

                MessageBox.Show("Received Aggrigated Data from AUV # " + auv[auvSenderID].auvID);

                player.Play();

                Thread.Sleep(3000);             

                g.DrawImage(new Bitmap("C:/temp/temp.png"), 500, 36, 196, 16);// clear

                player.Stop();

                auv[auvSenderID].queue1.Clear();

                auvSend = false;



            }

我检查数组列表是否包含特定数字以在后台工作方法中更改标志的值:

if (moveBtnIsClicked == false && movebtnGeneticIsClicked == false )
                    {

                        if (auv[0].queue1.Count == 10) 
                        {


                            foreach (Packet packet in auv[0].queue1)
                            {
                                auv[0].SendToSink(packet);
                            }


                            auvSenderID = 0;

                            auvSend = true;

                            topology.Invalidate();                         


                        }



                         if (auv[1].queue1.Count == 10) 
                        {


                            foreach (Packet packet in auv[1].queue1)
                            {
                                auv[1].SendToSink(packet);
                            }

                            auvSenderID = 1;


                            auvSend = true;

                            topology.Invalidate();


                        }


                         if (auv[2].queue1.Count == 10) 
                        {


                            foreach (Packet packet in auv[2].queue1)
                            {
                                auv[2].SendToSink(packet);
                            }


                            auvSenderID = 2;

                            auvSend = true;

                            topology.Invalidate(); 


                        }


                         if (auv[3].queue1.Count == 10) 
                        {


                            foreach (Packet packet in auv[3].queue1)
                            {
                                auv[3].SendToSink(packet);
                            }


                            auvSenderID = 3;

                            auvSend = true;

                            topology.Invalidate();




                        }


                    }

您的问题中没有足够的上下文来提供适合您的特定需求的答案。但是,我相信您使用的基本方法根本上是错误的。 IE。似乎没有理由将代码放在 OnPaint() 方法中,这样做会阻塞 UI 线程,并且在重新绘制的过程中(所以,双重错误) .

假设您有一个启动操作的按钮(例如,称为 button1),以及表单上要显示文本的标签(例如,称为 label1) 这样的事情会起作用:

private async void button1_Click(object sender, EventArgs e)
{
    label1.Text = "Received Aggregated Data from AUV # " + auv[auvSenderID].auvID
    label1.Visible = true;
    player.Play();
    await Task.Delay(3000);             
    label1.Visible = false;
    player.Stop();
    auv[auvSenderID].queue1.Clear();
    auvSend = false;
}

缺乏上下文,我不知道 player 是什么,也不知道 Play() and/or Stop() 方法是否快速完成。但假设那些是立即返回的方法,上面将设置文本,显示标签,调用 Play() 方法,然后等待三秒 而不会阻塞 UI 线程,然后隐藏标签,等待完成后调用Stop()方法等。

如果您做这一切是为了响应用户单击按钮以外的其他事情,您可以做同样的基本事情,但只是采用不同的方法(即不是 Click 事件处理程序)。当你想启动文本显示等时调用该方法