当我进入 Control.Visible = true 赋值时会发生什么不寻常的事情?
What unusual thing takes place when I step into a Control.Visible = true assignment?
我有一个可见的用户控件。它的自定义属性之一设置为 true
我不知道的地方。我所知道的是,将其 Visible
属性 设置为另一个值(true
)后,自定义 属性 为 true
。它的值设置为 true
是错误的,它应该保持 false
和以前一样。
我正在使用 .NET Framework 4.6.1。我在 Whosebug 上搜索过,但没有找到有用的东西。我尝试使用调试器和 Watches window,这就是我找到信息的方式。
我调试了程序,当我进入 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 中放置断点找到了问题。在开始设置 Control
的 Visible
属性 之前,调试器进入 setter。在 setter 中 属性 已经设置为 false
,所以没有执行更改,所以我出去看看 属性 在哪里从 true 更改为 false上次.
自定义 属性 是重定向到子控件的自定义 属性,其代码如下:
internal bool ShowCheckBox
{
get
{
return cb.Visible;
}
set
{
if (cb.Visible != value)
{
cb.Visible = value;
OnShowCheckBoxChanged();
}
}
}
问题是我正在设置 cb.Visible
属性,并且在使它 in/visible 完成的线程之前,我正在设置 ShowCheckBox
属性 并且 cb.Visible
仍然具有旧值。解决办法是把上面的代码改成下面这样:
internal bool _ShowCheckBox = true;
internal bool ShowCheckBox
{
get
{
return _ShowCheckBox;
}
set
{
if (_ShowCheckBox != value)
{
_ShowCheckBox = value;
OnShowCheckBoxChanged();
}
}
}
我有一个可见的用户控件。它的自定义属性之一设置为 true
我不知道的地方。我所知道的是,将其 Visible
属性 设置为另一个值(true
)后,自定义 属性 为 true
。它的值设置为 true
是错误的,它应该保持 false
和以前一样。
我正在使用 .NET Framework 4.6.1。我在 Whosebug 上搜索过,但没有找到有用的东西。我尝试使用调试器和 Watches window,这就是我找到信息的方式。
我调试了程序,当我进入 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 中放置断点找到了问题。在开始设置 Control
的 Visible
属性 之前,调试器进入 setter。在 setter 中 属性 已经设置为 false
,所以没有执行更改,所以我出去看看 属性 在哪里从 true 更改为 false上次.
自定义 属性 是重定向到子控件的自定义 属性,其代码如下:
internal bool ShowCheckBox
{
get
{
return cb.Visible;
}
set
{
if (cb.Visible != value)
{
cb.Visible = value;
OnShowCheckBoxChanged();
}
}
}
问题是我正在设置 cb.Visible
属性,并且在使它 in/visible 完成的线程之前,我正在设置 ShowCheckBox
属性 并且 cb.Visible
仍然具有旧值。解决办法是把上面的代码改成下面这样:
internal bool _ShowCheckBox = true;
internal bool ShowCheckBox
{
get
{
return _ShowCheckBox;
}
set
{
if (_ShowCheckBox != value)
{
_ShowCheckBox = value;
OnShowCheckBoxChanged();
}
}
}