当我进入 Control.Visible = true 赋值时会发生什么不寻常的事情?

What unusual thing takes place when I step into a Control.Visible = true assignment?

我有一个可见的用户控件。它的自定义属性之一设置为 true 我不知道的地方。我所知道的是,将其 Visible 属性 设置为另一个值(true)后,自定义 属性 为 true。它的值设置为 true 是错误的,它应该保持 false 和以前一样。

我正在使用 .NET Framework 4.6.1。我在 Whosebug 上搜索过,但没有找到有用的东西。我尝试使用调试器和 Watches window,这就是我找到信息的方式。

我调试了程序,当我进入 Visible = true 属性时,值在其他代码显示之前准确地改变了。另一个代码是我的 UserControl 的 OnPaint 处理程序,在第一行代码中,自定义 属性 已经有这个错误值。无法找到进入 Visible 赋值后和自定义 属性 取值 true 之前内部发生的情况。我猜它类似于 Application.DoEvents() 调用或另一个线程。我该如何调试它,以便获得更改我的自定义值的代码 属性?

我已阅读 the official documentation 但没有找到有用的内容。

internal void SetChildVisible(ClockData td, bool v)
{
    foreach (IClockView tv in td.MyTimerViews)
    {
        if (tv is ClockControl tc &&
            tv.GetClocksView() == MyClockListView)
        {
            tc.Visible = v;
            break;
        }
    }
    MyClockListView.RefreshDisplay();
}

我想在 Visual Studio 的某个地方有一些选项,这样我就可以调试这样的情况。

我通过在自定义 属性 的 setter 中放置断点找到了问题。在开始设置 ControlVisible 属性 之前,调试器进入 setter。在 setter 中 属性 已经设置为 false,所以没有执行更改,所以我出去看看 属性 在哪里从 true 更改为 false上次.

自定义 属性 是重定向到子控件的自定义 属性,其代码如下:

internal bool ShowCheckBox
{
    get
    {
        return cb.Visible;
    }
    set
    {
        if (cb.Visible != value)
        {
            cb.Visible = value;
            OnShowCheckBoxChanged();
        }
    }
}

问题是我正在设置 cb.Visible 属性,并且在使它 in/visible 完成的线程之前,我正在设置 ShowCheckBox 属性 并且 cb.Visible 仍然具有旧值。解决办法是把上面的代码改成下面这样:

internal bool _ShowCheckBox = true;
internal bool ShowCheckBox
{
    get
    {
        return _ShowCheckBox;
    }
    set
    {
        if (_ShowCheckBox != value)
        {
            _ShowCheckBox = value;
            OnShowCheckBoxChanged();
        }
    }
}