2013-04-18 62 views
4

我有一個應用程序,我希望能夠移動滑塊。但是,程序會每30秒自動更新滑塊。當我嘗試用鼠標更改滑塊位置時,程序仍在更新滑塊位置,因此我無法用鼠標手動移動它。在WPF中,如何判斷鼠標左鍵是否正在關閉而不使用任何事件?

不知何故,我希望應用程序不更新滑塊,如果用戶正在改變其位置的過程。如何在不使用左鍵按下事件的情況下判斷鼠標左鍵是否關閉?我只想要能夠訪問鼠標,並檢查鼠標左鍵的按鈕狀態。如何在不進入鼠標事件的情況下訪問它?

+1

爲什麼你不想使用該事件?您可以簡單地在那裏設置一個標誌並在更新之前查詢該標誌。 –

+0

我嘗試了MouseLeftButtonDown和MouseLeftButtonUp事件,並且他們從未被解僱。隨着進一步的研究,我發現滑塊控件會吞噬這些事件並永遠不會觸發它們。因此,經過一些實驗和搜索後,我發現我可以使用PreviewMouseLeftButtonDown和Up方法。他們完成我所需要的。我已經發布了以下代碼作爲本文的答案。感謝您指點我正確的方向。我給了你一點。 – Curtis

回答

3

好吧,

我想通了。 WPF中的Slider控件不會觸發MouseDown,LeftMouseDown或LeftMouseUp事件。這是因爲它在內部使用它們來調整值,因爲用戶正在操縱滑塊。但是,WPF中的Slider控件會觸發PreviewLeftMouseDown和PreviewLeftMouseUp事件。另外,當您單擊鼠標左鍵時,滑塊控件會自動捕捉鼠標並保持不動,直到釋放鼠標左鍵。

我能解決我的問題有以下3個事件:

private void _sliderVideoPosition_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
    { 
     _adjustingVideoPositionSlider = true; 
     _mediaElement.Pause(); 
    } 

    private void _sliderVideoPosition_PreviewMouseLeftButtonUp(object sender, MouseButtonEventArgs e) 
    { 
     _adjustingVideoPositionSlider = false; 
     _mediaElement.Play(); 
    } 

    private void _sliderVideoPosition_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e) 
    { 
     if (_adjustingVideoPositionSlider) 
     { 
      _mediaElement.Position = TimeSpan.FromMilliseconds((int)e.NewValue); 
     } 
    } 
+0

請務必將其標記爲答案。 –

+1

@JasonMassey是的,他必須等待2天才能接受他自己的回答。 –

+1

只是一個側面說明,我從不喜歡使用TimeSpan構造函數。我討厭要統計有多少參數才能知道它的含義。 'TimeSpan.FromMilliseconds((int)的例如NewValue)'更明顯一些。 –

1

您可能會考慮使用Mouse Class

如果我沒有記錯它不跟蹤按鈕的狀態,當鼠標 超出應用程序的用戶界面,所以要確保你有總是正確的信息, 您可能需要捕獲老鼠。

重複,你需要自己檢查一下。

1

據我所知,你想保留一個MVVM模式來完成這項任務。

所以首先我會通過設計什麼,我想在我的ViewModel

public class ViewModel 
{ 
    public ICommand EditingSliderCommand { get; set; } // actually set the command 
    public ICommand DoneEditingCommand { get; set; } // actually set the command 
    public bool IsEditing { get; set; } 

    ... 

    private void AutomaticUpdate 
    { 
     if (IsEditing) 
      return; 
     Update(); 
    } 
} 

,那麼你可以使用Blend Interactivity庫做UI端在XAML開始。

以下是一個例子。我不知道事件名稱是否正確。你也可以用鼠標和編輯完成相同的操作。

<i:Interaction.Triggers> 
    <i:EventTrigger EventName="MouseDown"> 
     <cmd:EventToCommand Command="{Binding Mode=OneWay, 
          Path=EditingSliderCommand}"/> 
    </i:EventTrigger> 
</i:Interaction.Triggers> 
14

布爾mouseIsDown = System.Windows.Input.Mouse.LeftButton == MouseButtonState.Pressed;

+0

正是我在找的東西。簡單,輕鬆,無需聆聽任何事件。 – christoph

+0

這應該是公認的解決方案 – victorvartan

相關問題