WPF: come gestire gli eventi del mouse al di fuori del componente che ha generato quell'evento?

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

Domanda

Contesto:

C'è un'applicazione in cui disegni cose su tela.Ad esempio, dove l'utente fa clic c'è un punto nero.Ma gestire gli eventi generati da Canvas nei gestori di eventi nel codice della finestra principale è semplicemente brutto per me.Quindi ho scritto una classe i cui metodi rispecchiano gli eventi del mouse su tela e chiamo quei metodi all'interno del gestore eventi.

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

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

Bello, ma voglio di più...

Domanda:

È possibile gestire direttamente gli eventi generati da canvas nella mia classe DrawingTool senza aver definito gestori di eventi canvas.Vorrei mantenere il mio codice Window1 pulito e concentrato sulle cose relative alle finestre e spostare la gestione degli eventi completamente nelle mie classi.

Ho pensato di derivare DrawingTool da FrameworkElement, sovrascrivere OnRender e disegnarlo in modo trasparente sulla tela in modo che il clic dell'utente sembrasse essere effettuato sulla tela ma in realtà sarebbe stato generato in DrawingTool e gestito internamente.Questo approccio funziona con la funzionalità di disegno (una volta terminato il disegno, l'oggetto disegnato viene aggiunto ai figli di Canvas e rimosso dai figli di DrawingTool) ma quando si tratta della modalità di selezione o di altri ci sono problemi con l'hit testing degli elementi, ad esempio.

Quindi, sarò grato per qualsiasi suggerimento su come risolvere il mio problema o spiegazione del perché questa è un'idea stupida :)

È stato utile?

Soluzione

Basta esporre i campi di controllo privati ​​come proprietà pubbliche e quando hai un'istanza di Window1 puoi semplicemente farlo

Window1.DrawingCanvas.MouseLeftButtonDown += YourHandlerMethod;

Altri suggerimenti

Non sono sicuro se ho ottenuto il vostro problema a destra, e ho giocato solo con WPF un po ', ma come circa la creazione di un controllo utente che contiene la tela e la manipolazione del mouse e disegnare lì? Questo potrebbe essere chiamato DrawingControl o simili.

In questo modo si sarebbe in grado di avere il codice di disegno contenuta nella classe che rappresenta il controllo. Si potrebbe voler dare al nuovo controllo utente una proprietà che consente l'accesso alla tela "interno".

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top