Казалось, что-то связано с захватом мыши!?
Обычная последовательность событий во время перетаскивания выглядит примерно так ...
-
PreviewMouseLeftButtonDown
обработчик вызывается и
ListBox.IsMouseCaptureWithin
есть
ложь.
- Обработчик
PreviewMouseMove
вызывается. К этому времени
ListBox.IsMouseCaptureWithin
верно.
- Во время обработки
PreviewMouseMove
DragDrop.DoDragDrop
вызывается и
когда-нибудь во время этой мыши
захват освобождается из ListBox.
Но то, что, по-видимому, происходит для перетаскивания, запускаемого при открытом контекстном меню, ...
- The
PreviewMouseLeftButtonDown
обработчик вызывается и
ListBox.IsMouseCaptureWithin
есть
ложь.
- Обработчик
PreviewMouseMove
получает
называется. Но в это время
ListBox.IsMouseCaptureWithin
есть
все еще ложь.
- Через некоторое время после окончания
PreviewMouseMove
обработчик
Затем ListBox получает захват мыши
(ListBox.IsMouseCaptureWithin
становится правдой)
Результатом этого является то, что после перетаскивания ListBox все еще имеет захват мыши, поэтому любые щелчки по кнопке для открытия контекстного меню фактически переходят в список, а не к кнопке.
Добавление следующего кода в начало обработчика PreviewMouseLeftButtonDown
, по-видимому, помогает, проглотив щелчок, закрывающий это контекстное меню, а не пытаясь начать перетаскивание из него ...
if (!contextMenuCloseComplete)
{
sourceElement.CaptureMouse();
return;
}
... с установкой contextMenuCloseComplete
bool в обработчики контекстных меню для событий Closed
и Opened
.
Это имеет смысл? Кто-нибудь понимает, откуда происходит это поведение при захвате мыши?