WPF – как обрабатывать события мыши вне компонента, вызвавшего это событие?

StackOverflow https://stackoverflow.com/questions/1077938

Вопрос

Контекст:

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

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 или т.п.

Таким образом, вы сможете хранить код рисования в классе, представляющем элемент управления.Возможно, вы захотите предоставить новому пользовательскому элементу управления свойство, позволяющее получить доступ к «внутреннему» холсту.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top