4

我希望能够使用一种方法将任何标签的可见性设置为 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_Visible 后,它变得可见,但在第二次调用 Change_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#,几周前才开始学习,所以也许我遗漏了一些明显的东西。谢谢你的帮助!

4

4 回答 4

8

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

一种解决方法是要求父母尽早绘制自己:

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

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

于 2013-10-19T22:02:57.103 回答
0

也许尝试通过引用将标签传递给您的方法?

Change_Visible(ref myLabel);
//
// Do other things
//
Change_Visible(ref myLabel);
于 2013-10-19T19:29:36.220 回答
0

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

答案看这个链接 为什么不能控制更新/刷新中间过程

于 2013-10-19T19:35:24.030 回答
0

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

//Explicit call for render
this.Update(); 
于 2015-05-28T09:36:47.240 回答