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