Захват щелчков мыши на текстовом поле 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>

Теперь я получаю событие щелчка мыши только тогда, когда пользователь впервые входит в TextBox. После того, как этот TextBox имеет фокус клавиатуры, я больше не получаю событие щелчка мыши. Любая идея, как заставить это работать?


person Robbert Dam    schedule 09.12.2009    source источник
comment
Способность концентрироваться критична для вас? Может быть, вы могли бы отключить его?   -  person levanovd    schedule 09.12.2009


Ответы (3)


Класс TextBox

TextBox имеет встроенную обработку всплывающих событий MouseUp и MouseDown. Следовательно, пользовательские обработчики событий, которые прослушивают события MouseUp или MouseDown из TextBox, не будут вызываться. Если вам нужно реагировать на эти события, прослушивайте туннелирующие события PreviewMouseUp и PreviewMouseDown вместо этого или зарегистрируйте обработчики с помощью аргумента HandledEventsToo (последний вариант доступен только через код). Не отмечайте событие как обработанное, если вы намеренно не хотите отключить собственную обработку TextBox для этих событий, и имейте в виду, что это оказывает заметное влияние на пользовательский интерфейс элемента управления.

В вашем коде вы запускаете только MouseLeftButtonUp

person Svetlozar Angelov    schedule 09.12.2009
comment
События MouseUp или MouseDown из TextBox не будут вызываться. Я думаю, что настоящий вопрос заключается в том, почему эти функции вообще выставляются на уровне API, если это действительно так. - person Krythic; 27.05.2021

Вы можете использовать событие PreviewMouseDown и таким образом фиксировать любые клики до того, как внутренние части элемента управления обработают клик:

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

Вот пример кода для тех, кто использует 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>

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

person Matas Vaitkevicius    schedule 09.05.2016