3

Google Chrome では、左マウスの [戻る] ボタンを押したままにして完全な閲覧履歴を取得する機能が本当に気に入っています。

私のWPFアプリでは、コンテキストメニューのあるボタンの場合、左マウスを押したままにして(もちろん通常の右クリックでも)メニューを開くにはどうすればよいですか?

4

2 に答える 2

3

MouseDownそこでタイマーを開始してイベントを処理することをお勧めします。イベントが発生した場合MouseUpは、タイマーを停止する必要があります。そのためにa を使用できますDispatcherTimerTimer_Tickその後、実行したいアクションを実行できるイベントが発生する時間を設定できます。MouseDownバブリングとイベントの問題を回避するためにMouseUp、2 つのハンドラーを XAML に追加するのではなく、ウィンドウ コンストラクターに追加することをお勧めします (少なくとも、サンプル コードではイベントが発生しなかったので、変更しました)。

button1.AddHandler(FrameworkElement.MouseDownEvent, new MouseButtonEventHandler(button1_MouseDown), true);
button1.AddHandler(FrameworkElement.MouseUpEvent, new MouseButtonEventHandler(button1_MouseUp), true);

さらに、そこでタイマーを設定する必要があります。

ウィンドウ クラスにフィールドを追加します。

DispatcherTimer timer = new DispatcherTimer();

イベントが発生するまで待機する時間でタイマーを設定しますTimer_Tick(ウィンドウコンストラクターでも):

timer.Tick += new EventHandler(timer_Tick);
// time until Tick event is fired
timer.Interval = new TimeSpan(0, 0, 1);

その後、イベントを処理するだけで済みます。

private void button1_MouseDown(object sender, MouseButtonEventArgs e) {
    timer.Start();
}

private void button1_MouseUp(object sender, MouseButtonEventArgs e) {
    timer.Stop();
}

void timer_Tick(object sender, EventArgs e) {
    timer.Stop();
    // perform certain action
}

それが役立つことを願っています。

于 2011-02-25T12:16:10.467 に答える
0

あなたの唯一の方法は、ボタン上で MouseDown/Move/Up イベントを手動で処理し、MouseDown が発生してから一定時間が経過するのを待ち、この時間内に MouseMove または MouseUp イベントがない場合は、 ContextMenu を手動で表示します。コンテキスト メニューを表示する場合は、ボタンがその後 Click イベントを生成しないように注意し、デフォルトのクリック アクションを実行する必要があります。

于 2011-02-25T11:54:09.173 に答える