我正在处理自定义TitleBar
(UserControl
)。我想要做的是检测当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
。知道为什么会这样吗?
答案 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