我有一个应用程序,我希望能够移动滑块。然而,滑块是由程序自动更新每30秒。当我尝试用鼠标更改滑块位置时,程序仍在更新滑块位置,因此我无法用鼠标手动移动它。
不知何故,我希望应用程序不更新滑动条,如果用户在改变其位置的过程中。如何在不使用左键按下事件的情况下判断鼠标左键是否按下?我只想能够访问鼠标,并检查鼠标左键的按钮状态。我如何在没有鼠标事件的情况下访问它?
bool mouseIsDown = System.Windows.Input.Mouse.LeftButton == MouseButtonState.Pressed;
有一些罕见的情况,其中System.Windows.Input.Mouse.LeftButton
不工作。例如在Resize.
你可以使用GetKeyState:
public enum VirtualKeyCodes : short
{
LeftButton = 0x01
}
[DllImport("user32.dll")]
private static extern short GetKeyState(VirtualKeyCodes code);
public static bool CheckKey(VirtualKeyCodes code) => (GetKeyState(code) & 0xFF00) == 0xFF00;
Ok,
我明白了。WPF中的Slider控件不会触发MouseDown, LeftMouseDown或LeftMouseUp事件。这是因为它在内部使用它们来在用户操作滑动条时调整值。然而,WPF中的Slider控件确实会触发PreviewLeftMouseDown和PreviewLeftMouseUp事件。此外,当您单击鼠标左键时,滑块控件会自动捕获鼠标并保持它,直到您释放鼠标左键。
我通过以下三个事件解决了我的问题:
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);
}
}
在这种情况下,您可以考虑使用鼠标类。
如果我没弄错的话,它不会跟踪鼠标时按钮的状态在应用程序的UI之外,所以要确保你总是有正确的信息,您可能需要捕获鼠标。
重复,你需要自己检查
根据我的理解,您需要保持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
库在xaml中做UI端。
示例如下:我不知道事件名称是否正确。你也可以用鼠标向上并完成编辑。
<i:Interaction.Triggers>
<i:EventTrigger EventName="MouseDown">
<cmd:EventToCommand Command="{Binding Mode=OneWay,
Path=EditingSliderCommand}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
接受的答案对我不起作用,但这个对我起作用了:
if ((System.Windows.Forms.Control.MouseButtons & System.Windows.Forms.MouseButtons.Left) == System.Windows.Forms.MouseButtons.Left)
{
System.Diagnostics.Debug.WriteLine("Left mouse down");
}