I'm working on c# WinForm.
I have an custom UserControl : MyControl : UserControl, INotifyPropertyChanged
. I attached a method on event on event VisibleChanged : this.VisibleChanged += new System.EventHandler(this.MyControl_VisibleChanged);
My application have some pages, each page is a control like MyControl
. Top of MainWindows contains Button, used to switch tab.
My problem is that my function MyControl_VisibleChanged
is called only when Visible is changing to true. I added a test in a tab to check MyControl.Visible
, when I select the other tab, MyControl.Visible
is false
but no event is raised.
I've try to define a new property Visible for this control but value is never set, only the base
value is modify.
Can you help me to find a solution ?
2条答案
按热度按时间wqsoz72f1#
这是
Visible
工作方式的一个怪癖,explained here。他的解决方案是使用他完全控制的属性,但您可以使用一种方法,允许tab开关告诉他们的孩子在额外的时间引发他们的VisibleChanged
事件。this question的前两个答案可能也很有用。
zujrkrfu2#
Control.Visible
属性是一个奇怪的属性,因为它的set-accessor设置了一个您无权访问的控件的本地值,但是get-accessor返回这个隐藏值在这个控件及其所有父控件中的净效果。此外,
OnVisibleChanged
和OnParentVisibleChanged
虚拟方法(或它们对应的事件)在它们的名称提示时都不会触发。特别是,如果父项可见性的更改使您不可见,则不会触发它们。有一个
OnParentBecameInvisible
虚拟方法(没有相应的事件),它的作用正如它的名字所暗示的那样,因此填补了其他两个方法留下差距,但它是System.Windows.Forms
程序集的内部,因此不能被普通人使用。(all以上基于阅读的.NET 4.8参考源代码)
如果您将
VisibleChanged
事件挂在控件及其所有父控件上,您可能会得到适当的通知,但是如果您进行了大量的控件层次结构重新排列,正确维护这些挂钩可能会很棘手。