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?

¿Fue útil?

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.

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