2014-10-31 171 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。