我有一个可见的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中的某个地方有一些选项,所以我可以调试这样的情况。
我通过在自定义属性的setter中放置一个断点来找到问题。调试器在Visible
的Control
属性开始设置之前进入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();
}
}
}