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?
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
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" />
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.