Como faço para adicionar a forma para InkCanvas na posição do mouse usando o evento MouseDown do WPF
-
21-12-2019 - |
Pergunta
Eu uso o seguinte código, que me permite definir o tamanho e adiciona o quadrado inkcanvas quando eu clicar em um botão.Ele adiciona a forma para a parte superior esquerda da tela.Eu gostaria de ser capaz de adicionar a forma para a lona no local onde eu clique com o mouse na tela.
Atualmente recebo a posição do 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;
}
Quando a forma de ferramenta (tool == 3) desenhar um quadrado na posição onde eu cliquei no inkcanvas.Isso não funciona, no entanto e apenas desenha uma caneta padrão avc.Também quando eu clicar em algum lugar no inkcanvas não atualização de um etiquetas de conteúdo, para a posição de coordenadas.
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
é a ferramenta selecionada, armazenado em um byte como 1, 2 ou 3 para caneta, cor de fundo e de forma.shapeChosen
é uma seqüência de caracteres, haverá a opção de quadrado, estrela, círculo, triângulo.
Existe algo que eu estou em falta no inkcanvas mouse para baixo manipulador de eventos para fazer a acima acontecer?Como faço para parar a caneta de desenho quando eu quiser colocar uma forma?
Solução
Neste caso, MouseDown
evento não funcionam, como é tratado pelo InkCanvas e ele não está sendo acusado, portanto, tente estas soluções:
I.Use o AddHandler
:
Especificar handledEventsToo como true para que o fornecido manipulador de ser chamado para o evento roteado, que já tinha sido marcado como tratado pelo outro elemento ao longo do evento da rota.
Exemplo:
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.Tente usar PreviewMouseDown
em vez de MouseDown
, porque PreviewMouseDown é encapsulado evento, e sua rodava em primeiro lugar, antes da bolha de eventos.