我有一个应用程序,我希望能够在其中移动滑块。但是,滑块每 30 秒由程序自动更新一次。当我尝试使用鼠标更改滑块位置时,程序仍在更新滑块位置,因此我无法使用鼠标手动移动它。
不知何故,如果用户正在更改其位置,我希望应用程序不要更新滑块。如何在不使用左键按下事件的情况下判断鼠标左键是否按下?我只想能够访问鼠标,并检查鼠标左键的按钮状态。如何在不进入鼠标事件的情况下访问它?
我有一个应用程序,我希望能够在其中移动滑块。但是,滑块每 30 秒由程序自动更新一次。当我尝试使用鼠标更改滑块位置时,程序仍在更新滑块位置,因此我无法使用鼠标手动移动它。
不知何故,如果用户正在更改其位置,我希望应用程序不要更新滑块。如何在不使用左键按下事件的情况下判断鼠标左键是否按下?我只想能够访问鼠标,并检查鼠标左键的按钮状态。如何在不进入鼠标事件的情况下访问它?
bool mouseIsDown = System.Windows.Input.Mouse.LeftButton == MouseButtonState.Pressed;
好的,
我想到了。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);
}
}
在您的情况下,您可以考虑使用Mouse Class。
如果我没记错的话,当鼠标离开应用程序的 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");
}
有一些罕见的情况,其中System.Windows.Input.Mouse.LeftButton
不起作用。例如在调整大小期间。
然后你可以使用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;