Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Capture mouse clicks on WPF TextBox

I want to capture mouse clicks on a TextBox:

<Window x:Class="WpfApplication2.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Window1" Height="300" Width="300">
    <Grid>
        <TextBox x:Name="t" MouseDown="TextBox_MouseDown"
                 MouseLeftButtonDown="TextBox_MouseLeftButtonDown"
                 MouseLeftButtonUp="TextBox_MouseLeftButtonUp"
                 Height="50" />
    </Grid>
</Window>

Now I only receive a mouse click event when the user first enters the TextBox. After this TextBox has keyboard focus, I do not receive mouse click event anymore. Any idea how to get this working?

like image 826
Robbert Dam Avatar asked Dec 09 '09 14:12

Robbert Dam


3 Answers

TextBox Class

TextBox has built-in handling for the bubbling MouseUp and MouseDown events. Consequently, custom event handlers that listen for MouseUp or MouseDown events from a TextBox will not be called. If you need to respond to these events, listen for the tunneling PreviewMouseUp and PreviewMouseDown events instead, or register the handlers with the HandledEventsToo argument (this latter option is only available through code). Do not mark the event handled unless you deliberately want to disable TextBox native handling of these events, and be aware that this has notable effects on the control's UI.

In you code you are firing just MouseLeftButtonUp

like image 161
Svetlozar Angelov Avatar answered Oct 23 '22 10:10

Svetlozar Angelov


You can use the PreviewMouseDown event, and capture any clicks that way before the internal parts of the control process the click:

<TextBox x:Name="t" PreviewMouseDown="TextBox_MouseDown" Height="32" Width="274" />
like image 26
Nathan Wheeler Avatar answered Oct 23 '22 09:10

Nathan Wheeler


Here's code example for those who are using MVVM

It works fine for events that are inheriting from Control.

In ViewModel:

private ICommand _merchantRefereneceCommand;

public ICommand MerchantReferenceCopyToClipboard
    {
        get { return _merchantRefereneceCommand ?? (_merchantRefereneceCommand = new MerchantRefereneceCommand(this)); }
        set { _merchantRefereneceCommand = value; }
    }

public class MerchantRefereneceCommand : ICommand
    {
        private readonly PaymentViewModel _paymentViewModel;

        public MerchantRefereneceCommand(PaymentViewModel paymentViewModel)
        {
            _paymentViewModel = paymentViewModel;
        }

        public bool CanExecute(object parameter)
        {
            return true;
        }

        public void Execute(object parameter)
        {
            //Your code goes here.
        }

        public event EventHandler CanExecuteChanged;
    }

In View (xaml):

<TextBox Grid.Row="1" x:Name="MerchantReference" MaxLength="10" IsReadOnly="True"
                             Text="{Binding MerchantReference, Mode=OneWay}"  >
    <i:Interaction.Triggers>
        <i:EventTrigger EventName="MouseDoubleClick" >
            <i:InvokeCommandAction Command="{Binding MerchantReferenceCopyToClipboard}" />
        </i:EventTrigger>
    </i:Interaction.Triggers>
</TextBox>

Hope this saves you some time.

like image 2
Matas Vaitkevicius Avatar answered Oct 23 '22 08:10

Matas Vaitkevicius