2014-10-31 161 views
1

我模拟WPF和MVVM的手持设备(viewmodel是一个状态机,视图是一个带按钮的模拟塑料外壳)。点击一个按钮时的事件

打开和关闭设备的手势是按钮中的“长按”。例如,在使用过程中,如果我按下“确定”按钮,它会显示一些屏幕,但如果我保持点击超过三秒钟,它应该(以模拟方式)关闭设备。

我接过来一看在RepeatButton,其DelayInterval性质,但这些似乎火一样Click事件。我需要的是,如果我按住按钮不到三秒钟,就会触发一个常规的Click,并且如果持续时间超过三秒,则会触发另一个,不同的LongClick(可能是一次)。

我该怎么做,使用RepeatButton或甚至一个常规的按钮?

回答

3

您可以这样做的一种方法是绑定到MouseDown和MouseUp事件。使用类似于在MouseDown上开始的秒表,并检查在MouseUp上过去的时间量。如果它少于3秒,请执行Click()操作。如果超过3秒,请执行LongClick()操作。

private void Button_PreviewMouseDown(object sender, MouseButtonEventArgs e) 
{ 
    stopwatch = new Stopwatch(); 
    stopwatch.Start(); 
} 

private void Button_PreviewMouseUp(object sender, MouseButtonEventArgs e) 
{ 
    stopwatch.Stop(); 

    if (stopwatch.ElapsedMilliseconds >= 3000) 
    { 
     // do Click() 
    } 
    else 
    { 
     // do LongClick 
    } 
} 

下面是对的RepeatButton一个解决方案:

private bool isLongClick; 
private bool hasAlreadyLongClicked; 
private void RepeatButton_PreviewMouseDown(object sender, MouseButtonEventArgs e) 
{ 
    isLongClick = false; 
    hasAlreadyLongClicked = false; 
    stopwatch = new Stopwatch(); 
    stopwatch.Start(); 
} 

private void RepeatButton_Click(object sender, RoutedEventArgs e) 
{ 
    if (!hasAlreadyLongClicked && stopwatch.ElapsedMilliseconds >= 3000) 
    { 
     hasAlreadyLongClicked = true; 
     isLongClick = true; 
     // do your LongClick action 
    } 
} 

private void RepeatButton_PreviewMouseUp(object sender, MouseButtonEventArgs e) 
{ 
    if (!isLongClick) 
    { 
     // do short click action 
    } 
} 

这里的技巧是一个的RepeatButton基本上只是一个按钮,点击触发在每一个时间间隔。因此,如果我们在按钮的PreviewMouseDown上启动Stopwatch,则每次Click事件触发时,我们都可以检查秒表上已经过的时间,并根据结果修改我们的操作。

+0

LongClick事件不应该等到我释放鼠标,但实际上是三秒钟过后。但这将是一个有趣的(简单而有效的)解决方案。要试一试。 – heltonbiker 2014-10-31 20:20:58

+0

@heltonbiker嗯。这比RepeatButton的功能更接近按钮。我会看看我能否拿出这样的东西。 – furkle 2014-10-31 20:22:36

+0

是的,我当前的小工具是repeatbuttons,因为这是他们模拟的硬件行为。我的问题的核心是“如何区分第一次点击和后续点击?” – heltonbiker 2014-10-31 20:23:56

0

一个周末的沉思后,我设计了以下的,工作液:

  1. 在视图模型创建两个布尔标志:ClickedShortClickedLong;
  2. 通过命令在按钮上绑定Command属性,在ViewModel上绑定OK方法;
  3. 确定命令是这样的:

    public void OK() 
    { 
        if (!ClickedShort) 
        { 
         HandleShortClick(); 
         ClickedShort = true; 
        } 
        else if (!ClickedLong) 
        { 
         HandleLongClick(); 
         ClickedLong = true; 
        } 
    }  
    
  4. 有两个复选框中的XAML,与IsChecked属性绑定到布尔标志。这些只是继电器,这样我可以从查看通过结合信息发送到视图模型:在确定按钮

    <CheckBox x:Name="ClickedShort" IsChecked="{Binding ClickedShort, Mode=OneWayToSource}" Visibility="Collapsed"/> 
        <CheckBox x:Name="ClickedLong" IsChecked="{Binding ClickedLong, Mode=OneWayToSource}" Visibility="Collapsed"/> 
    
  5. 有一个MouseUp事件,当我松开按钮的标志重置为false。

相关问题