Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使控件仅在c中的特定时间内可见#_C#_Controls - Fatal编程技术网

C# 使控件仅在c中的特定时间内可见#

C# 使控件仅在c中的特定时间内可见#,c#,controls,C#,Controls,我正在开发一个需要满足以下要求的应用程序: 假设我的表单中有一个按钮和一个标签(最初可见性设置为false),并且用户单击该按钮,那么标签应该显示一些文本,我在按钮单击中指定给标签。但是这个标签应该只显示一段时间,比如说3秒钟,然后它就会自动消失。为此,如果我给出: private void button1_Click(object sender, EventArgs e) { label1.Visible=true; label1.Text= "Magic";

我正在开发一个需要满足以下要求的应用程序:

假设我的表单中有一个按钮和一个标签(最初可见性设置为false),并且用户单击该按钮,那么标签应该显示一些文本,我在按钮单击中指定给标签。但是这个标签应该只显示一段时间,比如说3秒钟,然后它就会自动消失。为此,如果我给出:

private void button1_Click(object sender, EventArgs e)
    {
     label1.Visible=true;
     label1.Text= "Magic";
     Thread.Sleep(3000);
     label1.Visible=false;
    }
此代码无助于实现此目的。这是什么方法

创建一个时间间隔为3s的
a
Interval
,启动它,并在计时器计时事件中将
Visible
设置为
false
。也不要忘记停止计时器


决不在UI线程中调用
线程。睡眠
:应用程序将被阻止,因为UI线程在睡眠时不接受消息(用户单击…)。

使用计时器,可能是Windows.Forms.Timer。您可能需要在需要和不需要时启用和禁用它。您当前的方式没有帮助,因为您使主UI线程处于休眠状态。没有用。

尝试用以下内容替换方法的最后两行:

// create a global _timer object
static Timer _timer; // From System.Timers

private void button1_Click(object sender, EventArgs e)
{

    label1.Text = "Magic";
    // Thread.Sleep(3000); // don't do Thread.Sleep()!
    label1.Visible = false;

    Start();
}


static void Start()
{
    label1.Visible = true;


    _timer = new Timer(3000); // Set up the timer for 3 seconds

    _timer.Elapsed += new ElapsedEventHandler(_timer_Elapsed);
    _timer.Enabled = true; // Enable it

}
static void _timer_Elapsed(object sender, ElapsedEventArgs e)
{
    label1.Visible = false;
    _timer.Stop();
}
System.Windows.Forms.Timer timer = new System.Windows.Forms.Timer();
timer.Interval = 3000;
timer.Tick += (source, e) => {label1.Visible = false; timer.Stop();};
timer.Start();

在WinForms中使用Thread.Sleep()从来都不是一个好主意;改用计时器。

你不需要显式停止计时器,只要确保它的
AutoReset
属性设置为
false
@paul System.Windows.Forms.timer类没有这样的属性(它只存在于System.timers.timer中)。@Daniel:那就行了。简单又漂亮。谢谢你能给我解释一下代码中的第三行吗?第三行代码使用a来避免编写完整的方法(即带有签名的方法,与任何其他方法分开)。理想情况下,它适用于只需使用该方法一次的地方—如果需要多次使用,则应实现单独的方法并使用EventHandler调用它。@Daniel您应指定使用的计时器。我可以理解它是System.Windows.Forms.Timer one,因为Tick事件,但请注意框架中有多个可用计时器(System.Threading.Timer,System.Timer.Timer…)嘿,伙计们,谢谢。。成功了:)@Daniel:也谢谢你提供的信息