ParentForm的属性更改检测问题

时间:2018-04-18 06:31:43

标签: vb.net user-controls visual-studio-2017

我正在处理自定义TitleBarUserControl)。我想要做的是检测ParentForm的{​​{1}}属性由开发人员在设计时中更改,然后更新< / strong> Text的{​​{1}}属性。

在我开始在网上查找此内容之前,我已在TitleBar添加了Text来执行此操作“工作”。像这样......

Timer

然后我意识到这不是最合适的方法。所以我找到了这样的东西......

UserControl

部分有效但每次我重建删除重新添加我的Private Sub Timer_Tick(sender As Object, e As EventArgs) Handles Timer.Tick FormTitle_Label.Text = Me.ParentForm.Text End Sub 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 ,当我尝试更改UserControl的{​​{1}}属性时,收到错误Form。如果我关闭重新打开我的项目,那么它会再次运行,但直到我重建删除重新添加我的Text。知道为什么会这样吗?

1 个答案:

答案 0 :(得分:1)

在访问它的属性之前,你必须测试Me.FindForm的值为Nothing。创建控制并不能保证它已经存在于表单中。

尝试使用 OnBindingContextChanged OnParentChanged 来跟踪将控件添加/删除到父容器。 但我不确定它是否也适用于设计时间。

编辑添加了完整的控制代码

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