Что необычного происходит, когда я вступаю в назначение Control.Visible = true? - PullRequest
0 голосов
/ 28 марта 2019

У меня есть UserControl, который сделан видимым.Одно из его пользовательских свойств установлено на true где-то я не знаю.Все, что я знаю, это то, что после установки его свойства Visible в другое значение (true), пользовательское свойство равно true.Неправильно, что его значение установлено на true, оно должно оставаться false, как это было раньше.

Я использую .NET Framework 4.6.1.Я искал на StackOverflow, и я не нашел что-то полезное.Я попытался использовать отладчик и окно Watches, вот как я нашел представленную информацию.

Я отладил программу, и значение менялось точно, когда я вхожу в атрибут Visible = true, прежде чем появится другой код,Другой код - это обработчик OnPaint моего UserControl, и там, в первой строке кода, пользовательское свойство уже имеет это неправильное значение.Невозможно найти то, что происходит внутри, после входа в назначение Visible и до того, как пользовательское свойство принимает значение 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 была опция, чтобы я мог отлаживать подобные ситуации.

1 Ответ

0 голосов
/ 29 марта 2019

Я нашел проблему, поставив точку останова в установщике пользовательского свойства. Отладчик входит в установщик до того, как свойство Visible в Control начинает устанавливаться. В установщике это свойство уже было установлено на 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();
        }
    }
}
...