Захват кликов мыши на WPF TextBox
Я хочу зафиксировать щелчки мыши на 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>
Теперь я получаю только событие щелчка мыши, когда пользователь сначала входит в TextBox
. После этого TextBox
имеет фокус клавиатуры, я больше не получаю событие щелчка мыши. Любая идея, как это сделать?
Ответы
Ответ 1
Класс TextBox
TextBox имеет встроенную обработку для пузырьковые MouseUp и MouseDown Мероприятия. Следовательно, пользовательское событие обработчиков, которые прослушивают MouseUp или События MouseDown из TextBox будут не называться. Если вам нужно ответить к этим событиям, послушайте туннелирование PreviewMouseUp и События PreviewMouseDown, или зарегистрируйте обработчики с помощью Аргумент HandledEventsToo (последний опция доступна только через код). Не отмечайте обработанное событие если вы не намерены отключить обработку текстовых полей TextBox эти события, и имейте в виду, что это оказывает заметное влияние на контроль Пользовательский интерфейс.
В вашем коде вы стреляете только MouseLeftButtonUp
Ответ 2
Вы можете использовать событие PreviewMouseDown и запечатлеть все клики таким образом перед внутренними частями процесса управления щелчком:
<TextBox x:Name="t" PreviewMouseDown="TextBox_MouseDown" Height="32" Width="274" />
Ответ 3
Здесь пример кода для тех, кто использует MVVM
Он отлично работает для событий, которые наследуют от Control.
В 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;
}
В представлении (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>
Надеюсь, это сэкономит вам некоторое время.