Pergunta

Eu quero cliques do mouse captura em um 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>

Agora eu só receber um evento clique do mouse quando o usuário entra pela primeira vez o TextBox. Após este TextBox tem o foco do teclado, eu não receber mais clique do mouse evento. Alguma idéia de como começar este trabalho?

Foi útil?

Solução

TextBox Classe

TextBox foi construído com a manipulação para o borbulhamento SoltarOBotãoDoRato e PremirOBotãoDoRato eventos. Consequentemente, evento personalizado manipuladores que escutam para MouseUp ou eventos MouseDown de uma vontade TextBox não ser chamado . Se você precisa responder a esses eventos, ouça o tunneling PreviewMouseUp e eventos PreviewMouseDown vez, ou registrar os manipuladores com o argumento handledEventsToo (este último opção só está disponível através código). Não marque o evento manipulado a menos que queira deliberadamente para desativar manipulação nativa de TextBox esses eventos, e estar ciente de que este tem efeitos notáveis ??sobre o controle UI.

Em que você código que você está disparando apenas MouseLeftButtonUp

Outras dicas

Você pode usar o evento PreviewMouseDown, e capturar todos os cliques que forma antes das partes internas do processo de controle do clique:

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

Aqui está um exemplo de código para aqueles que estão usando MVVM

Ele funciona muito bem para os eventos que são herdando de controle.

Em 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;
    }

In View (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>

Hope isso poupa-lhe algum tempo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top