Я делаю простое приложение в стиле рисования, используя 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](https://i.stack.imgur.com/32wLn.png)
Редактировать 3
MouseDown правильно всплывает.