Что особенного в захвате мыши и средней кнопке мыши в WPF? - PullRequest
2 голосов
/ 15 июня 2010

Когда я вызываю CaptureMouse () в ответ на MouseDown от средней кнопки мыши, он захватывает и затем отпускает мышь.

А?

Я пытался использовать предварительный просмотр событий, установив Handled = true, ничего не изменилось. Я не понимаю захват мыши в WPF?

Вот небольшой пример кода, который воспроизводит проблему.

// TestListBox.cs

using System.Diagnostics;
using System.Windows.Controls;

namespace Local
{
    public class TestListBox : ListBox
    {
        public TestListBox()
        {
            MouseDown += (_, e) =>
            {
                Debug.WriteLine("+MouseDown");
                Debug.WriteLine(" Capture: " + CaptureMouse());
                Debug.WriteLine("-MouseDown");
            };

            GotMouseCapture += (_, e) => Debug.WriteLine("GotMouseCapture");
            LostMouseCapture += (_, e) => Debug.WriteLine("LostMouseCapture");
        }
    }
}

При создании приложения WPF по умолчанию, которое имеет это для своего главного окна, будет использоваться тестовый класс:

<Window x:Class="Local.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:Local"
        Title="MainWindow" Height="350" Width="525">
    <local:TestListBox>
        <ListBoxItem>1</ListBoxItem>
        <ListBoxItem>2</ListBoxItem>
        <ListBoxItem>3</ListBoxItem>
        <ListBoxItem>4</ListBoxItem>
    </local:TestListBox>
</Window>

После нажатия средней кнопки вниз я получаю следующий вывод:

+MouseDown
GotMouseCapture
LostMouseCapture
 Capture: True
-MouseDown

Поэтому я вызываю CaptureMouse, которая, в свою очередь, захватывает, а затем освобождает захват, но возвращает true, что захват был успешно получен.

Что здесь происходит? Возможно ли, что мой драйвер мыши Logitech делает что-то глупое, пытается запустить 'ultrascroll' или что-то в этом роде?

Ответы [ 2 ]

1 голос
/ 15 июня 2010

Это можно диагностировать, установив в отладчике разрыв метода UIElement.ReleaseMouseCapture () и просмотрев стек вызовов.Если вы сделаете это, вы обнаружите, что именно OnMouseMove в ListBox вызывает проблему.

Поэтому все, что вам нужно сделать, это переопределить OnMouseMove и не вызывать базовый класс, если средняя кнопка нажата:

public class TestListBox : ListBox 
{ 
  protected override void OnMouseMove(MouseEventArgs e)
  {
    if(Mouse.MiddleButton!=MouseButtonState.Pressed)
      base.OnMouseMove(e);
  }
}
0 голосов
/ 15 июня 2010

Я обнаружил, что кто-то еще столкнулся с той же проблемой и сузил ее до конкретной проблемы с ListBox.

http://social.msdn.microsoft.com/Forums/en/wpf/thread/5487c21a-1527-4a4f-bdf5-62de921d2ae0?prof=required

Если я переключаюсь на Canvas, он работает как яожидать.Итак, ListBox что-то делает с захватом.Обработка вещей с помощью Previews с Handled = true и даже переопределение OnGotMouseCapture и т. Д. Без вызова базы не решает проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...