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
にキーボードフォーカスがあると、マウスクリックイベントを受け取れなくなります。これを機能させる方法はありますか?
TextBoxには、バブリングするMouseUpイベントとMouseDownイベントの処理が組み込まれています。したがって、TextBoxからのMouseUpまたはMouseDownイベントをリッスンするカスタムイベントハンドラーは呼び出されません。 これらのイベントに応答する必要がある場合は、代わりにトンネリングのPreviewMouseUpイベントとPreviewMouseDownイベントをリッスンするか、またはHandledEventsToo引数でハンドラーを登録します(この後者のオプションはコードでのみ利用可能です)。これらのイベントのTextBoxネイティブ処理を意図的に無効にしたくない場合を除いて、イベントを処理済みとしてマークしないでください。これにより、コントロールのUIに顕著な影響があることに注意してください。
あなたのコードではあなたはちょうどMouseLeftButtonUp
を発射しています
コントロールの内部部分がクリックを処理する前に、PreviewMouseDownイベントを使用してクリックをキャプチャできます。
<TextBox x:Name="t" PreviewMouseDown="TextBox_MouseDown" Height="32" Width="274" />
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>
これにより時間を節約できることを願っています。