我正在使用WPF和MVVM模拟手持设备(viewmodel是状态机,视图是带按钮的模拟塑料外壳)。
打开和关闭设备的手势是按钮中的“长按”。例如,在使用过程中,如果我按下“确定”按钮,它会显示一些屏幕,但如果我按住它点击超过三秒钟,它应该(以模拟的方式)关闭设备。
我查看了RepeatButton
及其Delay
和Interval
属性,但这些似乎触发了相同的Click
事件。我需要的是,如果我按住按钮的时间少于三秒,则触发常规Click
,如果我按住它,则触发另一个,不同LongClick
(可能一次)超过三秒钟。
我怎么能这样做,使用RepeatButton甚至是常规按钮?
答案 0 :(得分: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基本上只是一个按钮,在每个间隔触发Click。因此,如果我们在PreviewMouseDown上为按钮启动秒表,我们可以在每次Click事件触发时检查秒表上的经过时间,并根据结果修改我们的操作。
答案 1 :(得分:0)
经过一个周末的冥想,我设计了以下工作解决方案:
ClickedShort
和ClickedLong
; Command
属性绑定到ViewModel上的OK
方法; OK命令如下:
public void OK()
{
if (!ClickedShort)
{
HandleShortClick();
ClickedShort = true;
}
else if (!ClickedLong)
{
HandleLongClick();
ClickedLong = true;
}
}
在XAML中有两个CheckBox,其中IsChecked
属性绑定到布尔标志。这些只是中继,因此我可以通过绑定将信息从View发送到ViewModel:
<CheckBox x:Name="ClickedShort" IsChecked="{Binding ClickedShort, Mode=OneWayToSource}" Visibility="Collapsed"/>
<CheckBox x:Name="ClickedLong" IsChecked="{Binding ClickedLong, Mode=OneWayToSource}" Visibility="Collapsed"/>
在我发布按钮时,在OK按钮中有一个MouseUp
事件将这些标志重置为false。