web-dev-qa-db-ja.com

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にキーボードフォーカスがあると、マウスクリックイベントを受け取れなくなります。これを機能させる方法はありますか?

30
Robbert Dam

TextBoxクラス

TextBoxには、バブリングするMouseUpイベントとMouseDownイベントの処理が組み込まれています。したがって、TextBoxからのMouseUpまたはMouseDownイベントをリッスンするカスタムイベントハンドラーは呼び出されませんこれらのイベントに応答する必要がある場合は、代わりにトンネリングのPreviewMouseUpイベントとPreviewMouseDownイベントをリッスンするか、またはHandledEventsToo引数でハンドラーを登録します(この後者のオプションはコードでのみ利用可能です)。これらのイベントのTextBoxネイティブ処理を意図的に無効にしたくない場合を除いて、イベントを処理済みとしてマークしないでください。これにより、コントロールのUIに顕著な影響があることに注意してください。

あなたのコードではあなたはちょうどMouseLeftButtonUpを発射しています

47

コントロールの内部部分がクリックを処理する前に、PreviewMouseDownイベントを使用してクリックをキャプチャできます。

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

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>

これにより時間を節約できることを願っています。

1