Capture des clics de souris sur la zone de texte WPF
Je veux capturer des clics de souris sur 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>
Maintenant, je ne reçois un événement de clic de souris que lorsque l'utilisateur entre pour la première fois dans TextBox
. Après que TextBox
ait le focus du clavier, je ne reçois plus d'événement de clic de souris. Une idée de comment faire fonctionner cela?
3 réponses
TextBox a une gestion intégrée pour le bubbling MouseUp et MouseDown événement. Par conséquent, événement personnalisé les gestionnaires qui écoutent MouseUp ou Les événements MouseDown d'une zone de texte ne pas être appelé. Si vous avez besoin de répondre à ces événements, écoutez le tunneling PreviewMouseUp et PreviewMouseDown événements à la place, ou enregistrez les gestionnaires avec le HandledEventsToo argument (ce dernier l'option est seulement disponible par le biais de code). Ne marquez pas l'événement géré sauf si vous voulez délibérément désactiver la gestion native de la zone de texte ces événements, et être conscient que cette a des effets notables sur le contrôle INTERFACE.
Dans votre code, vous tirez juste MouseLeftButtonUp
Vous pouvez utiliser L'événement PreviewMouseDown et capturer les clics de cette façon avant que les parties internes du contrôle ne traitent le clic:
<TextBox x:Name="t" PreviewMouseDown="TextBox_MouseDown" Height="32" Width="274" />
Voici un exemple de code pour ceux qui utilisent MVVM
Cela fonctionne bien pour les événements héritant du contrôle.
Dans Le 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 vue (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>
J'espère que cela vous fera gagner du temps.