WPF : 버튼 싱글 클릭 + 더블 클릭 문제
-
13-09-2019 - |
문제
다른 반응을 가진 WPF 응용 프로그램에서 단일 클릭과 버튼의 두 번 클릭을 모두 처리해야합니다. 불행히도, DoubleClick에서 WPF는 2 번의 클릭 이벤트와 더블 클릭 이벤트를 발사 하므로이 상황을 처리하기가 어렵습니다.
그것은 타이머를 사용하여 그것을 해결하려고 노력했지만 성공하지 못했습니다 ... 당신이 나를 도울 수 있기를 바랍니다.
코드를 보자 :
private void delayedBtnClick(object statInfo)
{
if (doubleClickTimer != null)
doubleClickTimer.Dispose();
doubleClickTimer = null;
this.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Normal, new VoidDelegate(delegate()
{
// ... DO THE SINGLE CLICK ACTION
}));
}
private void btn_Click(object sender, RoutedEventArgs e)
{
if (doubleClickTimer == null)
doubleClickTimer = new Timer(delayedBtnClick, null, System.Windows.Forms.SystemInformation.DoubleClickTime, Timeout.Infinite);
}
}
}
private void btnNext_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
if (doubleClickTimer != null)
doubleClickTimer.Change(Timeout.Infinite, Timeout.Infinite); // disable it - I've tried it with and without this line
doubleClickTimer.Dispose();
doubleClickTimer = null;
//.... DO THE DOUBLE CLICK ACTION
}
문제는 DoubleClick에서 'Double Click Action'이후에 호출 된 '단일 클릭 액션'이라는 것입니다. 내가 설정 한 것은 이상하다doubleClickTimer
두 번 클릭하지만 delayedBtnClick
사실입니다 : o
나는 이미 더 긴 시간, 부울 깃발과 잠금을 사용하려고 노력했습니다 ...
아이디어가 있습니까?
최고!
해결책
당신이 설정하면 RoutedEvent
'에스 e.Handled
에게 true
처리 후 MouseDoubleClick
이벤트 그러면 전화하지 않습니다 Click
이후 두 번째로 이벤트 MouseDoubleClick
.
거기에 최근 게시물 다른 행동을 취하는 것에 대해 언급합니다 SingleClick
그리고 DoubleClick
유용 할 수 있습니다.
그러나, 당신이 분리 된 행동을 원하고 첫 번째를 차단 해야하는/필요하다고 확신한다면 Click
두 번째뿐만 아니라 Click
, 당신은 그것을 사용할 수 있습니다 DispatcherTimer
당신처럼.
private static DispatcherTimer myClickWaitTimer =
new DispatcherTimer(
new TimeSpan(0, 0, 0, 1),
DispatcherPriority.Background,
mouseWaitTimer_Tick,
Dispatcher.CurrentDispatcher);
private void Button_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
// Stop the timer from ticking.
myClickWaitTimer.Stop();
Trace.WriteLine("Double Click");
e.Handled = true;
}
private void Button_Click(object sender, RoutedEventArgs e)
{
myClickWaitTimer.Start();
}
private static void mouseWaitTimer_Tick(object sender, EventArgs e)
{
myClickWaitTimer.Stop();
// Handle Single Click Actions
Trace.WriteLine("Single Click");
}
다른 팁
당신은 이것을 시도 할 수 있습니다 :
Button.MouseLeftButtonDown += Button_MouseLeftButtonDown;
private void Button_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
e.Handled = true;
if (e.ClickCount > 1)
{
// Do double-click code
}
else
{
// Do single-click code
}
}
Neccessary 인 경우 마우스를 클릭하고 마우스까지 대기하여 작업을 수행 할 수 있습니다.