web-dev-qa-db-fra.com

Capturer les clics de souris sur WPF TextBox

Je veux capturer des clics de souris sur une 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 la TextBox. Une fois que cette TextBox a le focus du clavier, je ne reçois plus d’événement de clic de souris. Une idée de comment faire fonctionner ça?

28
Robbert Dam

Classe TextBox

TextBox a la gestion intégrée pour le bouillonnement MouseUp et MouseDown événements. Par conséquent, custom event les gestionnaires qui écoutent MouseUp ou Les événements MouseDown d'une TextBox seront ne pas s'appeler. Si vous avez besoin de répondre à ces événements, écoutez le tunneling PreviewMouseUp et PreviewMouseDown à la place, ou enregistrer les gestionnaires avec le HandledEventsToo argument (cette dernière option N'est disponible que via le code ). Ne marquez pas l'événement géré à moins que vous ne le vouliez délibérément désactiver la gestion native de TextBox de ces événements, et sachez que cela a des effets notables sur le contrôle UI.

Dans votre code, vous tirez juste MouseLeftButtonUp

43
Svetlozar Angelov

Vous pouvez utiliser l'événement PreviewMouseDown et capturer tous les clics de cette manière avant que les parties internes du contrôle ne traitent le clic:

<TextBox x:Name="t" PreviewMouseDown="TextBox_MouseDown" Height="32" Width="274" />
26
Nathan Wheeler

Voici un exemple de code pour ceux qui utilisent MVVM

Cela fonctionne bien pour les événements qui sont héritant de Control.

Dans 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;
    }

Dans la 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 fait gagner du temps.

0