2013-04-15 4 views
0

Я пытаюсь создать настраиваемый элемент управления, основанный на элементе управления текстовым полем. Этот элемент управления текстовыми полями содержит кнопку, список и всплывающее окно. Я пытаюсь добавить обработчик события к событию мыши мыши в функции OnApplyTemplate этого класса. Когда я перехожу к отладке, вызывается OnApplyTemplate и добавляется код обработчика события.wpf vb.net Пользовательский контроль AddHandler не работает

Моя проблема заключается в том, что, когда я нажимаю кнопку, обработчик события Sub 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 

Я использую WPF .net 4.5 В Visual Studio 2012. Вот мой 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

Так что я изменил 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 
Смежные вопросы