13

我有一个应用程序,我希望能够在其中移动滑块。但是,滑块每 30 秒由程序自动更新一次。当我尝试使用鼠标更改滑块位置时,程序仍在更新滑块位置,因此我无法使用鼠标手动移动它。

不知何故,如果用户正在更改其位置,我希望应用程序不要更新滑块。如何在不使用左键按下事件的情况下判断鼠标左键是否按下?我只想能够访问鼠标,并检查鼠标左键的按钮状态。如何在不进入鼠标事件的情况下访问它?

4

6 回答 6

41
bool mouseIsDown = System.Windows.Input.Mouse.LeftButton == MouseButtonState.Pressed;
于 2015-02-09T16:59:43.897 回答
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);
        }
    }
于 2013-04-18T15:11:16.217 回答
1

在您的情况下,您可以考虑使用Mouse Class

如果我没记错的话,当鼠标离开应用程序的 UI 时,它不会跟踪按钮的状态,所以为了确保您始终拥有正确的信息,您可能需要捕获鼠标。

重复一遍,您需要自己检查。

于 2013-04-18T14:17:47.587 回答
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库在 xaml 中执行 UI 端。

下面是一个例子。我不知道事件名称是否正确。您也可以使用鼠标向上并完成编辑来执行相同的操作。

<i:Interaction.Triggers>
    <i:EventTrigger EventName="MouseDown">
        <cmd:EventToCommand Command="{Binding Mode=OneWay, 
                            Path=EditingSliderCommand}"/>
    </i:EventTrigger>
</i:Interaction.Triggers>
于 2013-04-18T14:23:19.647 回答
1

接受的答案对我不起作用,但这确实:

if ((System.Windows.Forms.Control.MouseButtons & System.Windows.Forms.MouseButtons.Left) == System.Windows.Forms.MouseButtons.Left)
{
    System.Diagnostics.Debug.WriteLine("Left mouse down");
}
于 2021-04-21T19:07:39.830 回答
1

有一些罕见的情况,其中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;
于 2021-06-21T06:42:50.427 回答