WPF – как обрабатывать события мыши вне компонента, вызвавшего это событие?
-
21-08-2019 - |
Вопрос
Контекст:
Есть приложение, в котором можно рисовать на холсте.Например, там, где пользователь нажимает, появляется черная точка.Но обработка событий, вызванных холстом, в обработчиках событий в коде главного окна для меня просто уродлива.Поэтому я написал класс, методы которого отражают события мыши холста, и вызываю эти методы внутри обработчика событий.
public partial class Window1 : Window
{
DrawingTool drawTool = new DrawingTool();
public Window1()
{
InitializeComponent();
}
private void drawingCanvas_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
drawTool.OnMouseLeftButtonDown(e);
}
}
Красиво, но я хочу большего...
Вопрос:
Можно ли обрабатывать события, создаваемые холстом, в моем классе DrawingTool напрямую, не определяя обработчики событий холста.Я хотел бы, чтобы мой код Window1 был чистым и ориентирован на работу с окнами, а обработку событий полностью перенес в свои классы.
Я подумал о том, чтобы получить DrawingTool из FrameworkElement, переопределить OnRender и нарисовать его прозрачно на холсте, чтобы казалось, что щелчок пользователя происходит на холсте, но на самом деле он будет вызываться в DrawingTool и обрабатываться внутри.Этот подход работает с функциональностью рисования (после завершения рисования нарисованный объект добавляется к дочерним элементам холста и удаляется из дочерних элементов DrawingTool), но когда дело доходит до режима выбора или других, например, возникают проблемы с проверкой попадания элементов.
Так что буду благодарен за любое предложение, как решить мою проблему или объяснение, почему это вообще глупая идея :)
Решение
Просто выставьте частные поля управления как общедоступные свойства, и когда у вас есть экземпляр Window1, вы можете просто сделать
Window1.DrawingCanvas.MouseLeftButtonDown += YourHandlerMethod;
Другие советы
Я не уверен, правильно ли я понял вашу проблему, и я лишь немного поигрался с WPF, но как насчет создания пользовательского элемента управления, содержащего ваш холст, и управления мышью и рисования там?Это можно было бы назвать DrawingControl
или т.п.
Таким образом, вы сможете хранить код рисования в классе, представляющем элемент управления.Возможно, вы захотите предоставить новому пользовательскому элементу управления свойство, позволяющее получить доступ к «внутреннему» холсту.