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

时间:2019-03-28 14:10:26

标签: c# winforms debugging visibility step-into

我有一个可见的UserControl。我不知道的某个地方的自定义属性设置为true。我所知道的是,将其Visible属性设置为另一个值(true)之后,自定义属性为true。将其值设置为true是错误的,应该像以前一样保留false

我正在使用.NET Framework 4.6.1。我已经搜索了StackOverflow,但没有找到有用的东西。我尝试使用调试器和“监视”窗口,这是我找到的信息的方式。

我调试了程序,并且在显示其他代码之前,当我进入Visible = true属性时,该值会精确更改。另一个代码是我的UserControl的OnPaint处理程序,并且在代码的第一行中,自定义属性已经具有此错误值。在进入可见分配之后以及自定义属性采用值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的某处有一些选择,以便我可以调试这种情况。

1 个答案:

答案 0 :(得分:0)

我通过在自定义属性的设置器中放置一个断点发现了问题。在开始设置Visible的{​​{1}}属性之前,调试器将进入设置程序。在设置器中,该属性已经设置为Control,因此未执行任何更改,因此我走了一步,看看该属性上次从true更改为false的位置。

custom属性是指向以下代码的子控件的custom属性的重定向:

false

问题是我正在设置internal bool ShowCheckBox { get { return cb.Visible; } set { if (cb.Visible != value) { cb.Visible = value; OnShowCheckBoxChanged(); } } } 属性,并且在使它变为可见/可见的线程之前,我再次设置了cb.Visible属性,而ShowCheckBox仍然具有旧的价值。解决方案是将上面的代码更改为以下代码:

cb.Visible