winforms VisibleChanged在不可见时不引发

toe95027  于 2023-05-18  发布在  其他
关注(0)|答案(2)|浏览(195)

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 ?

wqsoz72f

wqsoz72f1#

这是Visible工作方式的一个怪癖,explained here。他的解决方案是使用他完全控制的属性,但您可以使用一种方法,允许tab开关告诉他们的孩子在额外的时间引发他们的VisibleChanged事件。
this question的前两个答案可能也很有用。

zujrkrfu

zujrkrfu2#

Control.Visible属性是一个奇怪的属性,因为它的set-accessor设置了一个您无权访问的控件的本地值,但是get-accessor返回这个隐藏值在这个控件及其所有父控件中的净效果。
此外,OnVisibleChangedOnParentVisibleChanged虚拟方法(或它们对应的事件)在它们的名称提示时都不会触发。特别是,如果父项可见性的更改使您不可见,则不会触发它们。
有一个OnParentBecameInvisible虚拟方法(没有相应的事件),它的作用正如它的名字所暗示的那样,因此填补了其他两个方法留下差距,但它是System.Windows.Forms程序集的内部,因此不能被普通人使用。
(all以上基于阅读的.NET 4.8参考源代码)
如果您将VisibleChanged事件挂在控件及其所有父控件上,您可能会得到适当的通知,但是如果您进行了大量的控件层次结构重新排列,正确维护这些挂钩可能会很棘手。

相关问题