C# 使用方法更改label.visibility-为什么赢得';它不隐藏吗?

C# 使用方法更改label.visibility-为什么赢得';它不隐藏吗?,c#,winforms,methods,C#,Winforms,Methods,我希望能够使用方法将任何标签的可见性设置为true或false。我有以下代码: private void Change_Visible(Label toBeChanged) { if (toBeChanged.Visible == false) { toBeChanged.Visible = true; } else { toBeChanged.Visible = false; } toBeChanged.R

我希望能够使用方法将任何标签的可见性设置为true或false。我有以下代码:

private void Change_Visible(Label toBeChanged)
{
    if (toBeChanged.Visible == false)
    {
        toBeChanged.Visible = true;
    }
    else
    {
        toBeChanged.Visible = false;
    }
    toBeChanged.Refresh();
}
我通过以下方式调用此代码:

    Change_Visible(myLabel);
    //
    // Do other things
    //
    Change_Visible(myLabel);
在我的特定示例中,myLabel设置为在加载表单时不可见。在第一次调用Change\u Visible之后,它变为可见,但在第二次调用Change\u Visible之后,什么也没有发生。你能帮我让它消失吗

我已经尝试了其他一些逻辑来寻找解决方案,例如:

private void Change_Visible(Label toBeChanged)
{
    if (toBeChanged.Visible == false)
    {
        toBeChanged.Visible = true;
        toBeChanged.Refresh();
        return;
    }
    if (toBeChanged.Visible == true)
    {
        toBeChanged.Visible = false;
        toBeChanged.Refresh();
        return;
    }
}

我还没有得出任何结论。我正在自学C#,几周前才开始学习,所以我可能错过了一些明显的东西。谢谢你的帮助

是否可以尝试通过引用将标签传递到您的方法中

Change_Visible(ref myLabel);
//
// Do other things
//
Change_Visible(ref myLabel);

我认为这段代码唯一的问题是,由于标签正在UI线程中刷新,它将再次等待绘制事件

有关答案,请查看此链接

直到其父控件重新绘制其背景,并在先前由label控件绘制的像素上绘制,标签才真正对用户不可见。这不会发生在代码中,只有当主线程空闲并重新进入消息循环时,才会进行绘制。它不是空闲的,它是在执行那些“其他事情”

解决方法是要求家长尽早绘制自己:

myLabel.Visible = false;
this.Update();
//
// Do other things
//
myLabel.Visible = true;

运行时间长到需要这样反馈的代码应该在工作线程中运行。使用BackgroundWorker或Task。

在您的可见/启用更改完成后,只需执行以下几行即可

//Explicit call for render
this.Update(); 

确保在第二次调用更改后没有阻塞UI线程\u visible一切看起来都很好-您可以介绍更多的上下文吗?。当设置了
Label.Visible
属性时,标签实际上将无效,这意味着调用
Label.Refresh
在这里实际上是多余的。实际上,您可以将整个方法体替换为
returntobechanged.Visible=!可见的。直到我添加了label.Refresh()行,它才第一次显示标签,这就是它出现的原因。是的,我想添加这个.Update()应该是预期的行为;工作得很好。我还调查了BackgroundWorker,认为这会对我的工作有很大帮助。谢谢你的回答!