Как мне добавить фигуру в InkCanvas в положении мыши, используя событие MouseDown WPF
-
21-12-2019 - |
Вопрос
Я использую следующий код, который позволяет мне установить размер и добавляет квадрат к 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 - это туннелируемое событие, и оно запускается первым, перед пузырьковыми событиями.