Vb.net 与ParentForm的问题';s特性变化检测
我正在处理一个自定义的Vb.net 与ParentForm的问题';s特性变化检测,vb.net,user-controls,visual-studio-2017,Vb.net,User Controls,Visual Studio 2017,我正在处理一个自定义的标题栏(UserControl)。我想做的是检测父窗体的文本属性在设计时被开发人员更改时的,然后更新标题栏文本属性 在我开始在网上寻找这个之前,我已经在我的UserControl中添加了一个Timer来完成这个“工作”。像这样的。。。 然后我意识到这不是最合适的方法。所以我找到了这样的东西。。。 它部分起作用,但每次我重建或删除并重新添加我的用户控件到表单,当我尝试更改我的父表单的文本属性时,我都会得到错误,属性值无效。详细信息:对象引用未设置为对象的实例。。如果我关闭
标题栏
(UserControl
)。我想做的是检测父窗体的文本属性在设计时被开发人员更改时的,然后更新标题栏文本属性
在我开始在网上寻找这个之前,我已经在我的UserControl
中添加了一个Timer
来完成这个“工作”。像这样的。。。
然后我意识到这不是最合适的方法。所以我找到了这样的东西。。。
它部分起作用,但每次我重建或删除并重新添加我的用户控件
到表单
,当我尝试更改我的父表单
的文本
属性时,我都会得到错误,属性值无效。详细信息:对象引用未设置为对象的实例。
。如果我关闭并重新打开我的项目,那么它会再次工作,但直到我重建它或删除并重新添加我的用户控制
。知道为什么会这样吗 在访问Me.FindForm的属性之前,必须将其值测试为Nothing。创建控件并不保证它已经出现在窗体上
尝试使用OnBindingContextChangedOnParentChanged跟踪向父容器添加/删除控件的情况。但我不确定它在设计时是否也能工作
编辑添加了完整的控制代码
Public Class SimonetosTitleBar
Inherits Control
Private fText As String = "Default title"
Private WithEvents fOwnerForm As Form
Protected Overrides Sub OnParentChanged(e As EventArgs)
MyBase.OnParentChanged(e)
fOwnerForm = FindForm()
fOwnerForm_TextChanged()
End Sub
Protected Overrides Sub OnPaint(e As PaintEventArgs)
MyBase.OnPaint(e)
e.Graphics.DrawString(fText, Font, SystemBrushes.ControlText, Point.Empty)
End Sub
Private Sub fOwnerForm_TextChanged() Handles fOwnerForm.TextChanged
If fOwnerForm Is Nothing Then
fText = "Default title"
Else
fText = fOwnerForm.Text
End If
Invalidate()
End Sub
End Class
我尝试了一些东西,但什么都没有。。。你能给我举个例子说明你的确切意思吗?也许我的知识水平是问题所在…看看编辑后的答案。WithEvents做了一些魔术,而不是AddHandler/RemoveHandler。还有OnPaint,而不是您的标签,以避免用于演示目的的设计器文件。
Protected Overrides Sub OnCreateControl()
MyBase.OnCreateControl()
AddHandler Me.FindForm.TextChanged, AddressOf ParentForm_TextChanged
FormTitle_Label.Text = Me.FindForm.Text
End Sub
Private Sub ParentForm_TextChanged(sender As Object, e As EventArgs)
FormTitle_Label.Text = Me.FindForm.Text
End Sub
Public Class SimonetosTitleBar
Inherits Control
Private fText As String = "Default title"
Private WithEvents fOwnerForm As Form
Protected Overrides Sub OnParentChanged(e As EventArgs)
MyBase.OnParentChanged(e)
fOwnerForm = FindForm()
fOwnerForm_TextChanged()
End Sub
Protected Overrides Sub OnPaint(e As PaintEventArgs)
MyBase.OnPaint(e)
e.Graphics.DrawString(fText, Font, SystemBrushes.ControlText, Point.Empty)
End Sub
Private Sub fOwnerForm_TextChanged() Handles fOwnerForm.TextChanged
If fOwnerForm Is Nothing Then
fText = "Default title"
Else
fText = fOwnerForm.Text
End If
Invalidate()
End Sub
End Class