考虑使用VS2010创建的空WinForms应用程序。
它有一个自定义TextBox类,代码如下:
Public Class DummyTextBox : Inherits TextBox
Private Const FONT_SIZE As Single = 14.25!
Private Const FONT_FAMILY As String = "Microsoft Sans Serif"
Private Sub Me_ParentChanged(sender As Object,
e As System.EventArgs) Handles Me.ParentChanged
'this one does not work, it causes designer
'to lose its controls once in a while
Me.Font = New Font(Me.Parent.Font.FontFamily, FONT_SIZE)
'if I use a constant value instead, like below, it works fine
'Me.Font = New Font(FONT_FAMILY, FONT_SIZE)
End Sub
End Class
所以基本上是一个TextBox,字体大小增加,与父窗体相同。
发生的事情是,在放入表单然后构建之后,控件有时会从设计者视图中消失。如果您运行该项目,它通常显示正常。关闭/重新打开一个表格,它又在那里。
然而,有时控制将完全消失(我无法在100%的时间内重现),因此您必须再次添加它并设置属性。如果一次放置多个控件,通常只有一个控件会像那样消失。在窗体上移动后,控件更容易消失。
发生了什么事?
答案 0 :(得分:1)
根据我的研究,Me.Parent
有时可能在Nothing
内ParentChanged
,因此该行会抛出异常,该异常永远不会显示给用户(仅在设计时发生) 。在它周围放置Try/Catch
有助于验证这一事实。它看起来像 Windows窗体设计器喜欢分离控件并自行决定将它们附加回来。
要解决此问题,需要验证是否存在父级,然后才设置Font
。
所以改变这个:
Me.Font = New Font(Me.Parent.Font.FontFamily, FONT_SIZE)
对此:
Dim parent As Control = Me.Parent
If parent Is Nothing Then Return
Me.Font = New Font(parent.Font.FontFamily, FONT_SIZE)
使问题消失,不会以任何方式影响运行时。