我有一個應用程序,我希望能夠移動滑塊。但是,程序會每30秒自動更新滑塊。當我嘗試用鼠標更改滑塊位置時,程序仍在更新滑塊位置,因此我無法用鼠標手動移動它。在WPF中,如何判斷鼠標左鍵是否正在關閉而不使用任何事件?
不知何故,我希望應用程序不更新滑塊,如果用戶正在改變其位置的過程。如何在不使用左鍵按下事件的情況下判斷鼠標左鍵是否關閉?我只想要能夠訪問鼠標,並檢查鼠標左鍵的按鈕狀態。如何在不進入鼠標事件的情況下訪問它?
我有一個應用程序,我希望能夠移動滑塊。但是,程序會每30秒自動更新滑塊。當我嘗試用鼠標更改滑塊位置時,程序仍在更新滑塊位置,因此我無法用鼠標手動移動它。在WPF中,如何判斷鼠標左鍵是否正在關閉而不使用任何事件?
不知何故,我希望應用程序不更新滑塊,如果用戶正在改變其位置的過程。如何在不使用左鍵按下事件的情況下判斷鼠標左鍵是否關閉?我只想要能夠訪問鼠標,並檢查鼠標左鍵的按鈕狀態。如何在不進入鼠標事件的情況下訪問它?
好吧,
我想通了。 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);
}
}
請務必將其標記爲答案。 –
@JasonMassey是的,他必須等待2天才能接受他自己的回答。 –
只是一個側面說明,我從不喜歡使用TimeSpan構造函數。我討厭要統計有多少參數才能知道它的含義。 'TimeSpan.FromMilliseconds((int)的例如NewValue)'更明顯一些。 –
據我所知,你想保留一個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>
布爾mouseIsDown = System.Windows.Input.Mouse.LeftButton == MouseButtonState.Pressed;
正是我在找的東西。簡單,輕鬆,無需聆聽任何事件。 – christoph
這應該是公認的解決方案 – victorvartan
爲什麼你不想使用該事件?您可以簡單地在那裏設置一個標誌並在更新之前查詢該標誌。 –
我嘗試了MouseLeftButtonDown和MouseLeftButtonUp事件,並且他們從未被解僱。隨着進一步的研究,我發現滑塊控件會吞噬這些事件並永遠不會觸發它們。因此,經過一些實驗和搜索後,我發現我可以使用PreviewMouseLeftButtonDown和Up方法。他們完成我所需要的。我已經發布了以下代碼作爲本文的答案。感謝您指點我正確的方向。我給了你一點。 – Curtis