¿Cómo agrego forma a InkCanvas en la posición del mouse usando el evento MouseDown WPF?
-
21-12-2019 - |
Pregunta
Utilizo el siguiente código que me permite establecer el tamaño y agrega el cuadrado al lienzo de tinta cuando hago clic en un botón.Agrega la forma en la parte superior izquierda del lienzo.Me gustaría poder agregar la forma al lienzo en el lugar donde hago clic con el mouse en el lienzo.
Actualmente obtengo la posición del mouse:
private void inkCanvas_MouseMove(object sender, MouseEventArgs e)
{
cursorCoords.Content = Mouse.GetPosition(Application.Current.MainWindow);
// Get the x and y coordinates of the mouse pointer.
System.Windows.Point position = e.GetPosition(this);
pX = position.X;
pY = position.Y;
}
Cuando se selecciona la herramienta de forma (herramienta == 3), dibuja un cuadrado en la posición donde hice clic en el lienzo de tinta.Sin embargo, esto no funciona y simplemente dibuja un trazo de lápiz estándar.Además, cuando hago clic en algún lugar del lienzo de tinta, no se actualiza el contenido de las etiquetas a las coordenadas de posición actual.
private void inkCanvas_MouseDown(object sender, MouseButtonEventArgs e)
{
if (tool == 3)
{
coordstest.Content = pX + '-' + pY;
switch (chosenShape)
{
case "square":
Stroke oS = NewRectangle(pY, pX, size * 4, size * 4);
DrawingAttributes attribs = new DrawingAttributes();
attribs.Color = shapeColour;//Colors.LimeGreen;
attribs.Height = 5.0;
attribs.Width = 5.0;
attribs.FitToCurve = false;
oS.DrawingAttributes = attribs;
inkCanvas.Strokes.Add(oS);
break;
}
}
}
tool
es la herramienta seleccionada, almacenada en un byte como 1, 2 o 3 para bolígrafo, color de fondo y forma.shapeChosen
es una cadena, habrá la opción de cuadrado, estrella, círculo, triángulo.
¿Hay algo que me falta en el controlador de eventos del mouse hacia abajo de inkcanvas para que suceda lo anterior?¿Cómo detengo el dibujo con lápiz cuando quiero colocar una forma?
Solución
En este caso MouseDown
El evento no funciona porque lo maneja InkCanvas y no se genera, así que pruebe estas soluciones:
I.Utilizar el AddHandler
:
Especifique handledEventsToo como verdadero para que se invoque el controlador proporcionado para el evento enrutado que ya había sido marcado como manejado por otro elemento a lo largo de la ruta del evento.
Ejemplo:
private void MainWindow_Loaded(object sender, RoutedEventArgs e)
{
MyInkCanvas.AddHandler(InkCanvas.MouseDownEvent, new MouseButtonEventHandler(InkCanvas_MouseDown), true);
}
private void InkCanvas_MouseDown(object sender, MouseButtonEventArgs e)
{
}
II.Intenta usar PreviewMouseDown
en lugar de MouseDown
, porque PreviewMouseDown es un evento tunelizado y se ejecuta primero, antes de los eventos de burbuja.