在WPF中,如何在不使用任何事件的情况下判断鼠标左键当前是否按下



我有一个应用程序,我希望能够移动滑块。然而,滑块是由程序自动更新每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");
}

相关内容

最新更新