2009-12-09 7 views
22

Je veux capturer les clics de souris sur un TextBox:capture les clics de souris sur WPF 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 reçois seulement un événement de clic de souris lorsque l'utilisateur entre d'abord le TextBox. Après cela, TextBox a le focus du clavier, je ne reçois plus d'événement de clic de souris. Une idée comment faire fonctionner cela?

+0

La capacité à se concentrer est-elle critique pour vous? Peut-être que vous pourriez le désactiver? – levanovd

Répondre

39

TextBox Class

TextBox a intégré dans le traitement de la bouillonnante MouseUp et MouseDown événements. Par conséquent, événements personnalisés gestionnaires qui écoutent pour MouseUp ou événements MouseDown à partir d'un TextBox seront ne pas être appelé. Si vous avez besoin de répondre à ces événements, écoutez le PreviewMouseUp de tunnel et événements PreviewMouseDown à la place, ou enregistrer les gestionnaires avec l'argument de handledEventsToo (cette dernière option est uniquement disponible via le code ). Ne marquez pas l'événement traité sauf si vous souhaitez délibérément désactiver la gestion native TextBox de ces événements, et soyez conscient que ce a des effets notables sur l'interface utilisateur du contrôle.

clic En vous codez vous tiriez juste MouseLeftButtonUp

21

Vous pouvez utiliser l'événement PreviewMouseDown et de capturer tous les clics de cette façon avant que les parties internes du processus de commande:

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

Voici exemple de code pour ceux qui utilisent MVVM

Fonctionne correctement pour les événements inheriting from Control.

En ViewModel:

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> 

Espérons que cela vous permet d'économiser un certain temps.