Pregunta

Contexto:

Hay una aplicación donde dibujas cosas sobre un lienzo.Donde el usuario hace clic hay un punto negro, por ejemplo.Pero manejar los eventos generados por el lienzo en los controladores de eventos en el código de la ventana principal es simplemente feo para mí.Entonces escribí una clase cuyos métodos reflejan los eventos del mouse del lienzo y llamo a esos métodos dentro del controlador de eventos.

public partial class Window1 : Window
{
    DrawingTool drawTool = new DrawingTool();
    public Window1()
    {
        InitializeComponent();            
    }

    private void drawingCanvas_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
        drawTool.OnMouseLeftButtonDown(e);
    }
}

Bien, pero quiero más...

Pregunta:

¿Es posible manejar eventos generados por lienzo en mi clase DrawingTool directamente sin haber definido controladores de eventos de lienzo?Me gustaría mantener mi código de Window1 limpio y enfocado en las cosas de la ventana y mover el manejo de eventos completamente a mis clases.

Pensé en derivar DrawingTool de FrameworkElement, anular OnRender y dibujarlo de forma transparente sobre el lienzo para que el clic del usuario pareciera realizarse en el lienzo, pero en realidad se generaría en DrawingTool y se manejaría internamente.Este enfoque funciona con la funcionalidad de dibujo (una vez finalizado el dibujo, el objeto dibujado se agrega a los elementos secundarios del lienzo y se elimina de los elementos secundarios de DrawingTool), pero cuando se trata del modo de selección u otros, hay problemas con las pruebas de acierto de elementos, por ejemplo.

Por lo tanto, estaré agradecido por cualquier sugerencia sobre cómo resolver mi problema o explicación de por qué esta es una idea estúpida :)

¿Fue útil?

Solución

Sólo exponer los campos de control privados como bienes de dominio público y cuando se tiene una instancia de Window1 que sólo puede hacer

Window1.DrawingCanvas.MouseLeftButtonDown += YourHandlerMethod;

Otros consejos

No estoy seguro de haber solucionado bien el problema y solo he jugado un poco con WPF, pero ¿qué tal si creamos un control de usuario que contenga nuestro lienzo y manejemos el mouse y dibujemos allí?Esto podría llamarse DrawingControl o similar.

De esa manera podrás tener el código de dibujo contenido en la clase que representa el control.Es posible que desee darle al nuevo control de usuario una propiedad que permita el acceso al lienzo "interno".

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top