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

问题描述 投票:0回答:1

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

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

我调试了程序,当我进入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中的某个地方有一些选项,所以我可以调试这样的情况。

c# winforms debugging visibility step-into
1个回答
0
投票

我通过在自定义属性的setter中放置一个断点来找到问题。调试器在VisibleControl属性开始设置之前进入setter。在setter中,属性已经设置为false,因此没有执行任何更改,因此我走出去查看上次将属性从true更改为false的位置。

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

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

问题是我正在设置cb.Visible属性,并且在该线程之前使其成为/ visible完成后,我再次设置ShowCheckBox属性并且cb.Visible仍然具有旧值。解决方案是将上面的代码更改为以下代码:

internal bool _ShowCheckBox = true;
internal bool ShowCheckBox
{
    get
    {
        return _ShowCheckBox;
    }
    set
    {
        if (_ShowCheckBox != value)
        {
            _ShowCheckBox = value;
            OnShowCheckBoxChanged();
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.