2014-10-18 16 views
0

我创建了一堆自定义控件,其中一个特性是当它们处于活动状态时突出显示。例如,文本框的边框将在用户点击该对话框时突出显示一种颜色(或者它有其他输入焦点),然后当用户在控件之外点击时默认回到灰色(包括其他控件)VB.NET使用AddHandler检测鼠标在控件外部的点击时间是不好的做法吗?

目前我扫描父窗体,并使用每个包含在(包括儿童)控件的AddHandler发现,当用户点击了控制之外

Private Sub GatherChildren(Optional ByVal CTRL As Control = Nothing) 
    For Each Child As Object In CTRL.Controls 
     If TypeOf Child Is MetroControl Then 
      If DirectCast(Child, MetroControl).Controls.Count > 0 Then 
       GatherChildren(Child) 
      End If 
      AddHandler Child.Click, ["LOSE FOCUS FUNCTION"] 
     End If 
    Next 
End Sub 

我读的地方在很久以前添加处理程序会严重降低性能,并且可能会在表单上有很多控件的环境中。这可能会严重影响性能。所以我的问题是,AddHandler对性能有负面影响吗?如果是这样,是否有更有效的方法可以解决我的问题?

谢谢

+0

'.Click' ='[“LOCO FOCUS FUNCTION”]?按道理??? – OneFineDay 2014-10-18 23:07:19

+0

[“失去对焦功能”]只是实际功能的替代品。我认为这样说更具解释性。包含函数的名字并不重要,但MyMouseDown()实际上被称为 – Solo116 2014-10-19 00:23:50

+0

我知道,我只是没有想到用失败事件丢失焦点。 – OneFineDay 2014-10-19 01:06:12

回答

0

如果您不注销事件处理程序,这只是一个坏习惯。在您的子控件上,提供注册/取消注册事件处理程序的功能。很多奇怪的行为(几乎总是很难调试)会发生:就像在同一个控件上多次注册一个事件处理程序一样。更不用说内存泄漏了。

下面是我在生产代码中看到的一个示例。过度简化了演示过程。

Public Class Form1 

    Private Sub btnAddHandler_Click(sender As Object, e As EventArgs) Handles btnAddHandler.Click 
     AddHandler btnClickMe.Click, Sub() 
             txtLog.Text &= "Clicked!" & vbCrLf 
            End Sub 
     txtLog.Text &= "Added event handler." & vbCrLf 
    End Sub 

End Class 

对于每次单击btnAddHandlerbtnClickMe将追加"Clicked!" & vbCrLf很多次txtLog被点击时它。这是一个非常简单的例子,但是如果你不小心,并且事件做了更重要的事情,它可以为调试带来乐趣。 ;)

不,我不会说这是不好的做法,做你在做什么。发件人是可区分的,只要你不做像上面例子那样的野蛮事情,你应该没问题。

Public Class Form1 

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 
     For Each ctrl As Control In Me.Controls 
      If TypeOf ctrl Is TextBox Then 
       With DirectCast(ctrl, TextBox) 
        AddHandler .GotFocus, AddressOf TextBox_GotFocus 
        AddHandler .LostFocus, AddressOf TextBox_LostFocus 
       End With 
      End If 
     Next 
    End Sub 

    Private Sub TextBox_GotFocus(sender As Object, e As EventArgs) 
     DirectCast(sender, TextBox).BackColor = Color.Azure 
    End Sub 

    Private Sub TextBox_LostFocus(sender As Object, e As EventArgs) 
     DirectCast(sender, TextBox).BackColor = Color.DimGray 
    End Sub 

    Private Sub Form1_FormClosing(sender As Object, e As FormClosingEventArgs) Handles MyBase.FormClosing 
     For Each ctrl As Control In Me.Controls 
      If TypeOf ctrl Is TextBox Then 
       With DirectCast(ctrl, TextBox) 
        RemoveHandler .GotFocus, AddressOf TextBox_GotFocus 
        RemoveHandler .LostFocus, AddressOf TextBox_LostFocus 
       End With 
      End If 
     Next 
    End Sub 

End Class 

此代码非常好。