我正在尝试创建基于文本框控件的自定义控件。此文本框控件还包含按钮,列表框和弹出窗口。我尝试在类的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。
提前致谢
答案 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