在WPF TextBox上捕获鼠标单击

时间:2009-12-09 14:50:34

标签: c# wpf xaml textbox mouseevent

我希望捕获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具有键盘焦点之后,我不再接收鼠标单击事件。知道如何让这个工作吗?

3 个答案:

答案 0 :(得分:45)

TextBox Class

  

TextBox内置了处理功能   冒泡MouseUp和MouseDown   事件。因此,自定义事件   听取MouseUp或者的处理程序   来自TextBox的MouseDown事件将   不被称为如果您需要回复   对这些事件,听听   隧道PreviewMouseUp和   相反,也就是PreviewMouseDown事件   注册处理程序   HandledEventsToo参数(后者   选项仅适用于   码)。不要标记处理的事件   除非你故意想要   禁用TextBox本机处理   这些事件,请注意这一点   对控制有显着影响   UI。

在您的代码中,您只是MouseLeftButtonUp

答案 1 :(得分:27)

您可以使用PreviewMouseDown事件,并在控件的内部部分处理点击之前捕获任何方式的点击:

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

答案 2 :(得分:1)

以下是使用MVVM的代码示例

适用于inheriting from 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>

希望这可以节省你一些时间。