Подтвердить что ты не робот

Захват кликов мыши на 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 имеет фокус клавиатуры, я больше не получаю событие щелчка мыши. Любая идея, как это сделать?

4b9b3361

Ответ 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>

Надеюсь, это сэкономит вам некоторое время.