Как мне добавить фигуру в InkCanvas в положении мыши, используя событие MouseDown WPF

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

Вопрос

Я использую следующий код, который позволяет мне установить размер и добавляет квадрат к inkcanvas, когда я нажимаю кнопку.Это добавляет форму в верхний левый угол холста.Я хотел бы иметь возможность добавить фигуру на холст в том месте, где я щелкаю мышью по холсту.

В настоящее время я получаю положение мыши:

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;
}

Когда выбран инструмент shape tool (инструмент == 3), нарисуйте квадрат в том месте, где я нажал на inkcanvas.Однако это не работает и просто рисует стандартный росчерк пера.Также, когда я нажимаю где-нибудь на inkcanvas, содержимое меток не обновляется до текущих координат положения.

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 выбран ли инструмент, записанный в байтах как 1, 2 или 3 для пера, цвета фона и формы.shapeChosen это строка, там будет опция квадрат, звезда, круг, треугольник.

Есть ли что-то, чего мне не хватает в обработчике событий inkcanvas mouse down, чтобы это произошло?Как мне остановить рисование пером, когда я хочу поместить фигуру?

Это было полезно?

Решение

В этом случае MouseDown событие не работает, потому что обрабатывается InkCanvas и оно не всплывает, поэтому попробуйте эти решения:

Я.Используйте AddHandler:

Укажите handledEventsToo как true, чтобы предоставленный обработчик вызывался для маршрутизируемого события, которое уже было помечено как обработанное другим элементом на маршруте события.

Пример:

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.Попробуйте использовать PreviewMouseDown вместо MouseDown, потому что PreviewMouseDown - это туннелируемое событие, и оно запускается первым, перед пузырьковыми событиями.

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