【问题标题】:Changing label.visibility with a method - Why won't it hide?使用方法更改 label.visibility - 为什么它不会隐藏?
【发布时间】:2013-10-28 12:05:28
【问题描述】:

我希望能够使用一种方法将任何标签的可见性设置为真或假。我有这个代码:

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#,几周前才开始学习,所以也许我遗漏了一些明显的东西。感谢您的帮助!

【问题讨论】:

  • 确保在第二次调用 change_visible 后没有阻塞 UI 线程
  • 一切似乎都很好——你能介绍更多的上下文吗?当Label.Visible 属性为 set 时,标签实际上会失效,这意味着调用Label.Refresh 实际上是多余的。您实际上可以用return toBeChanged.Visible = !toBeChanged.Visible; 替换整个方法体。
  • 第一次没有显示标签,直到我添加了 Label.Refresh() 行,这就是它存在的原因。

标签: c# winforms methods


【解决方案1】:

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

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

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

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

【讨论】:

  • 添加 this.Update();完美地工作。我还研究了 BackgroundWorker 并认为这对我正在做的事情有很大帮助。感谢您的回答!
【解决方案2】:

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

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

【讨论】:

  • 是的,我想这应该是预期的行为
【解决方案3】:

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

答案看这个链接 Why won't control update/refresh mid-process

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

      猜你喜欢
      • 2013-07-27
      • 2016-02-13
      • 1970-01-01
      • 1970-01-01
      • 2010-09-21
      • 1970-01-01
      • 2011-11-03
      • 2018-04-19
      • 2014-08-28
      相关资源
      最近更新 更多