Как я могу поймать события с одним щелчком мыши и двойным щелчком мыши в WPF FrameworkElement?
Я могу поймать один клик в TextBlock следующим образом:
private void TextBlock_MouseDown(object sender, MouseButtonEventArgs e)
{
MessageBox.Show("you single-clicked");
}
Я могу поймать двойной щелчок в TextBlock следующим образом:
private void TextBlock_MouseDown(object sender, MouseButtonEventArgs e)
{
if (e.LeftButton == MouseButtonState.Pressed)
{
if (e.ClickCount == 2)
{
MessageBox.Show("you double-clicked");
}
}
}
Но как я их поймаю на одном TextBlock и различаю между ними?
Ответы
Ответ 1
Вам нужно запустить событие после завершения последовательности кликов... когда это? Я предлагаю использовать таймер. Событие MouseDown будет reset и увеличит количество кликов. Когда интервал таймера истекает, он заставляет вызов оценивать количество кликов.
private System.Timers.Timer ClickTimer;
private int ClickCounter;
public MyView()
{
ClickTimer = new Timer(300);
ClickTimer.Elapsed += new ElapsedEventHandler(EvaluateClicks);
InitializeComponent();
}
private void TextBlock_MouseDown(object sender, MouseButtonEventArgs e)
{
ClickTimer.Stop();
ClickCounter++;
ClickTimer.Start();
}
private void EvaluateClicks(object source, ElapsedEventArgs e)
{
ClickTimer.Stop();
// Evaluate ClickCounter here
ClickCounter = 0;
}
Ура!
Ответ 2
Если вам нужно определить разницу, я предлагаю вам использовать такой элемент управления, как Label
, который выполняет вашу работу:
label.MouseDown += delegate(object sender, MouseEventArgs e)
{
if (e.ClickCount == 1)
{
// single click
}
};
label.MouseDoubleClick += delegate
{
// double click
};
ИЗМЕНИТЬ: Мой совет был приведен в документации по MSDN:
Класс Control определяет PreviewMouseDoubleClick и События MouseDoubleClick, но не соответствующие события с одним щелчком мыши. к см., если пользователь нажал один раз, обрабатывать MouseDown событие (или один из его аналогов) и проверьте, является ли свойство ClickCount значение равно 1.
Однако при этом вы получите уведомление по одному клику, даже если пользователь будет одним кликом.
Ответ 3
Вы должны использовать таймер для разграничения между ними. Добавьте таймер в свою форму в графическом интерфейсе (проще всего - он автоматически обработает распоряжение и т.д.). В моем примере таймер называется clickTimer
.
private bool mSingleClick;
private void TextBlock_MouseUp(object sender, MouseButtonEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
if (e.ClickCount < 2)
{
mSingleClick = true;
clickTimer.Interval = System.Windows.Forms.SystemInformation.DoubleClickTime;
clickTimer.Start();
}
else if (e.ClickCount == 2)
{
clickTimer.Stop();
mSingleClick = false;
MessageBox.Show("you double-clicked");
}
}
}
private void clickTimer_Tick(object sender, EventArgs e)
{
if (mSingleClick)
{
clickTimer.Stop();
mSingleClick = false;
MessageBox.Show("you single-clicked");
}
}
Ответ 4
Вы просто можете использовать MouseDown
событие и количество кликов, например:
if (e.ChangedButton == MouseButton.Left && e.ClickCount == 2)
{
// your code here
}
Ответ 5
Вы можете сделать это на MouseUp вместо MouseDown. Таким образом вы можете задать свойство ClickCount
для общего количества кликов и решить, что делать с этой точки.
Ответ 6
Я сделал это так, и он отлично работает
If e.Clicks = 2 Then
doubleClickTimer.Stop()
ElseIf e.Clicks = 1 Then
doubleClickTimer.Enabled = True
doubleClickTimer.Interval = 1000
doubleClickTimer.Start()
End If
Private Sub doubleClickTimer_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles doubleClickTimer.Tick
OpenWebPage("abc")
doubleClickTimer.Stop()
End Sub
Ответ 7
Это мое рабочее решение:)
#region message label click --------------------------------------------------------------------------
private Timer messageLabelClickTimer = null;
private void messageLabel_MouseUp(object sender, MouseButtonEventArgs e)
{
Debug.Print(e.ChangedButton.ToString() + " / Left:" + e.LeftButton.ToString() + " Right:" + e.RightButton.ToString() + " click: " + e.ClickCount.ToString());
// in MouseUp (e.ClickCount == 2) don't work!! Always 1 comes.
// in MouseDown is set e.ClickCount succesfully (but I don't know should I fire one clicked event or wait second click)
if (e.ChangedButton == MouseButton.Left)
{
if (messageLabelClickTimer == null)
{
messageLabelClickTimer = new Timer();
messageLabelClickTimer.Interval = 300;
messageLabelClickTimer.Elapsed += new ElapsedEventHandler(messageLabelClickTimer_Tick);
}
if (! messageLabelClickTimer.Enabled)
{ // Equal: (e.ClickCount == 1)
messageLabelClickTimer.Start();
}
else
{ // Equal: (e.ClickCount == 2)
messageLabelClickTimer.Stop();
var player = new SoundPlayer(ExtraResource.bip_3short); // Double clicked signal
player.Play();
}
}
}
private void messageLabelClickTimer_Tick(object sender, EventArgs e)
{ // single-clicked
messageLabelClickTimer.Stop();
var player = new SoundPlayer(ExtraResource.bip_1short); // Single clicked signal
player.Play();
}
#endregion