0

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

我正在使用 .NET Framework 4.6.1。我在 StackOverflow 上进行了搜索,但没有找到有用的东西。我尝试使用调试器和 Watches 窗口,这就是我找到所显示信息的方式。

我调试了程序,当我进入Visible = true属性时,值会发生精确变化,然后才会显示其他代码。另一个代码是OnPaint我的 UserControl 的处理程序,在第一行代码中,自定义属性已经有这个错误的值。在进入 Visible 分配之后和自定义属性获取 value 之前,无法找到内部发生的情况true。我想这就像一个Application.DoEvents()电话或另一个线程。我如何调试它以便获得更改自定义属性值的代码?

我已经阅读了官方文档,但没有发现有用的东西。

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 的某个地方有一些选择,这样我就可以调试这样的情况。

4

1 回答 1

0

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

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

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

问题是我正在设置cb.Visible属性,并且在使它变为/可见的线程完成之前,我ShowCheckBox再次设置了属性并且cb.Visible仍然具有旧值。解决方案是将上述代码更改为以下内容:

internal bool _ShowCheckBox = true;
internal bool ShowCheckBox
{
    get
    {
        return _ShowCheckBox;
    }
    set
    {
        if (_ShowCheckBox != value)
        {
            _ShowCheckBox = value;
            OnShowCheckBoxChanged();
        }
    }
}
于 2019-03-29T10:21:29.233 回答