В WPF как узнать, нажата ли левая кнопка мыши без каких-либо событий?

У меня есть приложение, в котором я хочу перемещать слайдер. Тем не менее, ползунок автоматически обновляется программой каждые 30 секунд. Когда я пытаюсь изменить положение ползунка с помощью мыши, программа все еще обновляет положение ползунка, поэтому я не могу переместить его вручную с помощью мыши.

Почему-то я хочу, чтобы приложение НЕ обновляло ползунок, если пользователь находится в процессе изменения своей позиции. Как узнать, нажата ли левая кнопка мыши, не используя событие нажатия левой кнопки? Я просто хочу иметь возможность получить доступ к мыши и проверить состояние кнопки левой кнопки мыши. Как я могу получить к нему доступ, не будучи внутри события мыши?

6 ответов

Решение

В порядке,

Я понял. Элемент управления Slider в WPF НЕ запускает события MouseDown, LeftMouseDown или LeftMouseUp. Это связано с тем, что он использует их для настройки значения, когда пользователь манипулирует ползунком. Однако элемент управления Slider в WPF запускает события 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);
        }
    }

bool mouseIsDown = System.Windows.Input.Mouse.LeftButton == MouseButtonState.Pressed;

Бывают редкие случаи, когда 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;

Вы можете рассмотреть, в вашем случае, использование Mouse Class.

Если я не ошибаюсь, он не отслеживает состояние кнопки, когда мышь выходит из пользовательского интерфейса приложения, поэтому, чтобы быть уверенным, что вы всегда располагаете правильной информацией, вам может потребоваться захватить мышь.

Повторите, вы должны проверить это самостоятельно.

Насколько я понимаю, вы хотите сохранить шаблон 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.

Ниже приведен пример. Я не знаю, правильно ли указано название события. Вы также можете сделать то же самое с помощью мыши и закончить редактирование.

<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");
}
Другие вопросы по тегам