clics del ratón sobre la captura de WPF cuadro de texto
-
18-09-2019 - |
Pregunta
Quiero capturar clics del ratón en un 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>
Ahora sólo recibo un evento de clic del ratón cuando el usuario entra por primera vez el TextBox
. Después de este TextBox
tiene el foco del teclado, no lo recibirá evento de clic del ratón más. Cualquier idea de cómo conseguir este trabajo?
Solución
Cuadro de texto se ha incorporado en el manejo de la burbujeante MouseUp y MouseDown eventos. En consecuencia, evento personalizado manipuladores, que escuchan o MouseUp eventos MouseDown de un campo será No se llamará . Si tiene que responder a estos eventos, detecte el túnel y PreviewMouseUp eventos PreviewMouseDown su lugar, o registrar los manejadores con el argumento handledEventsToo (este último opción sólo está disponible a través de código). No marque el evento controlado a menos que desee deliberadamente Cuadro de texto desactivar controlador nativo de estos eventos, y tenga en cuenta que esta tiene efectos notables sobre el control de La interfaz de usuario.
En ti código que está disparando solo MouseLeftButtonUp
Otros consejos
Puede utilizar el evento PreviewMouseDown, y capturar los clics de esa manera antes de que las partes internas del proceso de control del clic:
<TextBox x:Name="t" PreviewMouseDown="TextBox_MouseDown" Height="32" Width="274" />
Esto es ejemplo de código para aquellos que están usando MVVM
Funciona bien para los eventos que están heredando de control.
En 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;
}
En Vista (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>
Espero que esto le ahorra tiempo.