wpf vb.net自定义控件AddHandler未触发

时间:2013-04-15 17:33:16

标签: .net wpf vb.net visual-studio custom-controls

我正在尝试创建基于文本框控件的自定义控件。此文本框控件还包含按钮,列表框和弹出窗口。我尝试在类的OnApplyTemplate函数中为按钮的鼠标按下事件添加一个事件处理程序。当我逐步调试时,调用OnApplyTemplate并添加事件处理程序代码。

我的问题是当我点击按钮时,不会调用事件处理程序子DropDownButton_MouseDown。

这是我的班级:

Imports System.Windows.Controls.Primitives

<TemplatePart(Name:="PART_ControlBorder", Type:=GetType(Border))> _
<TemplatePart(Name:="PART_DropDownButton", Type:=GetType(Button))> _
<TemplatePart(Name:="PART_Popup", Type:=GetType(Popup))> _
<TemplatePart(Name:="PART_ListBox", Type:=GetType(ListBox))> _

Public Class AutoCompleteTextBox
    Inherits TextBox

#Region "DECLARATIONS"
    Private Mainborder As Border
    Private popup As Popup
    Private listBox As ListBox
    Private dropDownButton As Button

#End Region

#Region "METHODS"
    Private Sub PopupOpen()
        If popup IsNot Nothing And popup.IsOpen = False Then
            popup.IsOpen = True
        Else
            Return
        End If
    End Sub

    Private Sub DropDownButton_MouseDown(sender As Object, e As System.EventArgs)
        PopupOpen()
    End Sub
#End Region

#Region "APPLY TEMPLATE"
    Public Overrides Sub OnApplyTemplate()
        MyBase.OnApplyTemplate()

        If Me.Template IsNot Nothing Then
            Dim button__1 As Button = TryCast(Me.Template.FindName("PART_DropDownButton", Me), Button)
            If button__1 IsNot dropDownButton Then
                'First unhook existing handler
                If dropDownButton IsNot Nothing Then
                    RemoveHandler dropDownButton.MouseDown, AddressOf DropDownButton_MouseDown
                End If
                dropDownButton = button__1
                If dropDownButton IsNot Nothing Then
                    AddHandler dropDownButton.MouseDown, AddressOf DropDownButton_MouseDown
                End If
            End If
        End If
    End Sub
#End Region

#Region "CONSTRUCTOR"
    Sub New()
        DefaultStyleKeyProperty.OverrideMetadata(GetType(AutoCompleteTextBox), New FrameworkPropertyMetadata(GetType(AutoCompleteTextBox)))
    End Sub

#End Region

End Class

我在visual studio 2012中使用wpf .net 4.5。这是我的自定义控件的xaml,称为AutoCompleteTextBox,控件在解决方案中的另一个项目中定义:

<Window x:Class="MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:krisis="clr-namespace:Krisis.Controls;assembly=Krisis.Controls"
    Title="MainWindow" Height="350" Width="525">
    <Grid>
        <krisis:AutoCompleteTextBox SearchText="Bob" Width="200" MinHeight="35" FontSize="18" HorizontalAlignment="Center" VerticalAlignment="Center"/>
    </Grid>
</Window>

有人可以帮我连接这个事件处理程序,这样当我点击按钮时,会调用子DropDownButton_MouseDown。

提前致谢

1 个答案:

答案 0 :(得分:0)

所以我将OnApplyTemplate归功于以下内容,它现在可以运行:

Public Overrides Sub OnApplyTemplate()
    MyBase.OnApplyTemplate()

    '' if template is not nothing then initialize controls and wire up the event handlers
    If Me.Template IsNot Nothing Then

        InitializePopup()
        InitializeBorder()

        ''reset the handler for DropDownButton
        If DropDownButton IsNot Nothing Then
            RemoveHandler DropDownButton.Click, AddressOf DropDownButton_Click
        End If
        InitializeButton()
        If DropDownButton IsNot Nothing Then
            AddHandler DropDownButton.Click, AddressOf DropDownButton_Click
        End If

        ''reset handlers for listbox
        If ResultsListBox IsNot Nothing Then
            RemoveHandler ResultsListBox.PreviewMouseDown, AddressOf ResultListBox_PreviewMouseDown
            RemoveHandler ResultsListBox.KeyDown, AddressOf ResultListBox_KeyDown
        End If
        InitializeListbox()
        If ResultsListBox IsNot Nothing Then
            AddHandler ResultsListBox.PreviewMouseDown, AddressOf ResultListBox_PreviewMouseDown
            AddHandler ResultsListBox.KeyDown, AddressOf ResultListBox_KeyDown
        End If
    End If
End Sub

这是我在上面使用的INitializeControl子的一个例子:

Private Sub InitializeButton()
    If dropDownButton Is Nothing Then
        dropDownButton = TryCast(Me.Template.FindName("PART_DropDownButton", Me), Button)
    End If
End Sub