RoutedEvent (MouseUp) пузыри не работает для детей (Shapes) из Canvas - PullRequest
0 голосов
/ 01 ноября 2018

Я делаю простое приложение в стиле рисования, используя WPF. У меня есть холст с фигурами. Я хочу реализовать выбор feautre. Я щелкаю и перетаскиваю область прямоугольника, которая ДОЛЖНА исчезнуть при событии Canvas MouseUp. Однако, если курсор включен на прямоугольник (или одну из фигур), событие MouseUp в Canvas по какой-то причине не сработает.

Я прочитал эту эту статью, которая описывает, как работают перенаправленные события. MouseUp - это перенаправленное событие с RoutedStrategy, равным Bubble. Как я прочитал, это означает, что потомки Canvas будут запускать обработчик событий Canvas MouseUp, если они сами не обработали событие (e.Handled не установлен в true).

Я прочитал тонну всего в Интернете и не нашел решения \ объяснения моей проблемы. Canvas MouseUp просто не срабатывает.

Фон установлен. IsHitTestVisible - это правда. Я пытался canvas.AddHandler(Shape.MouseUpEvent, new MouseButtonEventHandler(OnCanvasMouseUp), true);. Я попытался использовать PreviewMouseUp вместо всех обработчиков для определенного MouseButton. Есть два обходных пути:

  • Установить IsHistTestVisible фигур в значение false. Но мне нужно, чтобы у них было IsHitTestVisible == true.
  • Обнаружение выпуска MouseButton в событии Canvas MouseMove.

Есть ли способ заставить все работать так, как ДОЛЖНО (согласно статье MS о RoutedEvents)? Почему это не работает, как ожидалось? Есть ли способ программно передать событие родителю?

Canvas:

<Canvas x:Name="MainCanvas" Grid.Column="1" Background="White"
                HorizontalAlignment="Stretch" VerticalAlignment="Stretch" ClipToBounds="True" IsHitTestVisible="True" >

        </Canvas>

Добавить несколько обработчиков событий:

canvas.MouseUp += OnCanvasMouseUp;
canvas.PreviewMouseUp += OnCanvasMouseUp;
canvas.AddHandler(Shape.MouseUpEvent, new MouseButtonEventHandler(OnCanvasMouseUp), true);
canvas.AddHandler(Shape.MouseLeftButtonUpEvent, new MouseButtonEventHandler(OnCanvasMouseUp), true);
canvas.AddHandler(Shape.PreviewMouseUpEvent, new MouseButtonEventHandler(OnCanvasMouseUp), false);
canvas.MouseLeftButtonUp += OnCanvasMouseUp;

Фигуры добавляются в Canvas следующим образом:

Canvas.Children.Add(figure);

EDIT

Вот пример. Когда я отпускаю кнопку мыши внутри круга или на его границе, Canvas.MouseUp не поднимается.

Edit2

После того, как Canvas.Children.Add(shape) форма все еще имеет Родителя, равного нулю .. И нет никакого способа установить ее родителя.

enter image description here

Редактировать 3

MouseDown правильно всплывает.

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