user10001110101
user10001110101

Reputation: 321

TextBox MouseDown Event within UserControl

I have a user control that contains a TextBox and I would like to capture the mousedown event however, I cannot seem to get things to work! My existing, non working code is below, any assistance would be greatly appreciated.

UserControl xaml:

<UserControl x:Class="LeftLabel"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             mc:Ignorable="d" Width="auto" Height="auto" >
    <StackPanel DataContext="{Binding RelativeSource={RelativeSource AncestorType={x:Type UserControl}}}">
        <StackPanel Orientation="Horizontal">
            <TextBlock Text="{Binding Path=TextBlockText}"
                       Name="UcTextBlock"
                       Width="{Binding Path=TextBlockWidth}"
                       FontSize="{Binding Path=TextBlockFontSize}"
                       HorizontalAlignment="Right"
                       TextAlignment="Right"
                       VerticalAlignment="Center"
                       Margin="5,0,0,0" />
            <TextBox Text="{Binding Path=TextBoxText}"
                     Name="UcTextBox"
                     MouseDown="UcTextBox_MouseDown" 
                     Width="{Binding Path=TextBoxWidth}"
                     Height="{Binding Path=TextBoxHeight}"
                     FontSize="{Binding Path=TextBoxFontSize}"
                     Padding="{Binding Path=TextBoxPadding}"
                     Margin="5,0,0,0" 
                     BorderThickness="0" />
        </StackPanel>
    </StackPanel>
</UserControl>

UserControl.vb:

Public Event TextBoxMouseDown As EventHandler
Private Sub UcTextBox_MouseDown(sender As Object, e As MouseButtonEventArgs) Handles UcTextBox.MouseDown
    RaiseEvent TextBoxMouseDown(sender, e)
End Sub

For testing purposes I am adding the UserControls to my MainWindow programmatically:

Dim count As Integer = 1
While count < 10
    Dim ucl As New LeftLabel
    With ucl
        .Margin = New Thickness(4)
        .TextBlockText = "Label " & count.ToString
        .TextBlockWidth = 100
        .TextBlockFontSize = 12
        .TextBoxFontSize = 12
        .TextBoxHeight = 20
        .TextBoxText = "Initial Text " & count.ToString
        .TextBoxPadding = New Thickness(2)
        .TextBoxWidth = 150
        AddHandler .TextBoxMouseDown, AddressOf LabelLeftTextBoxMouseDown
    End With
    TextBoxStackPanel.Children.Add(ucl)
    count += 1
End While

Private Sub LabelLeftTextBoxMouseDown(sender As Object, e As EventArgs)
    Dim txt As TextBox = DirectCast(sender, TextBox)
    MsgBox(txt.Text)
End Sub

Upvotes: 0

Views: 2326

Answers (1)

makim
makim

Reputation: 3284

This is a somewhat common problem.

It occurs with some controls due to the fact that these controls handle these events internally. The button, for instance, "swallows" the click and rather exposes its own event - the Click-event. If you want to declare your textbox-event-handlers in XAML, I suggest you checkout the Preview*-events (i.e. PreviewMouseDown), these always occur, maybe that can solve your problem if you need to react to clicks.

<TextBox Text="{Binding Path=TextBoxText}"
                     Name="UcTextBox"
                     PreviewMouseDown="UcTextBox_PreviewMouseDown"
                     Width="{Binding Path=TextBoxWidth}"
                     Height="{Binding Path=TextBoxHeight}"
                     FontSize="{Binding Path=TextBoxFontSize}"
                     Padding="{Binding Path=TextBoxPadding}"
                     Margin="5,0,0,0" 
                     BorderThickness="0" />

Upvotes: 3

Related Questions