使用canvas.set

时间:2015-10-13 08:30:57

标签: c# wpf events mouse textblock

我编写了一个C#wpf程序来处理画布上的曲线。 所以我加载了一条曲线(多段中的一系列点),然后我对它进行了各种操作。通过鼠标交互将每条曲线放在屏幕上,效果很好。然后每条曲线在其中心附带一个文本块,提供一些信息。 所以当我想要鼠标移动形状时问题就出现了。 我首先用鼠标选择形状(有效),然后通过OnMouseMove事件将其粘贴到光标上。最后我把它放在OnMouseLeftButtonDown事件上。

因此,简而言之,OnMouseLeftButtonDown总是正常工作,除非我必须移动形状和标签。在这种情况下,我必须按几次(随机)来发射事件。

然后我搜索导致问题的那部分,那就是我移动标签的时候。

    private void UpdateLabel(int index, PathInfo piToBeAdded)
    {
        plotCanvas.Children.Remove(names[index]);

        TextBlock text = new TextBlock();
        text.TextAlignment = TextAlignment.Left;
        text.FontSize = 12;
        text.Inlines.Add(new Run("(" + (GetPathsIndexFromId(piToBeAdded.ID) + 1) + ")ID:" + piToBeAdded.ID + " " + piToBeAdded.Name) { FontWeight = FontWeights.Bold });
        Canvas.SetLeft(text, piToBeAdded.Center.X);<-----those cause the problem
        Canvas.SetTop(text, piToBeAdded.Center.Y);<------those cause the problem
        text.ReleaseMouseCapture();
        names[index] = text;            
        plotCanvas.Children.Add(text);
    }

注意:pathinfo只是一个存储一些信息的类,其中也包括坐标 具体来说,它只是Canvas.SetLeft和Canvas.SetTop导致OnMouseLeftButtonDown无法正常触发。我把它们从标签上取下来进入0,0和事件 但这些指示有什么问题?如何使OnLeftButtonDownEvent正常工作?

我希望我已经正确地描述了问题我试图提供所有相关信息。

提前完成

帕特里克

2 个答案:

答案 0 :(得分:1)

通常情况下,最好使用MouseButtonUp事件来释放鼠标捕获,因为此时鼠标按钮已被释放并且移动已停止(这是您正在捕获的内容)。

Canvas.SetLeft的问题是因为它只能在Canvas对象的子项上调用,而您只是在调用{text集合后才将Children添加到Canvas.SetLeft集合中{1}}。

修改

在回复您的评论时,Canvas.SetLeft只能在Canvas的现有小孩上调用,因此请在致电Add之前致电Canvas.SetLeft

private void UpdateLabel(int index, PathInfo piToBeAdded)
{
    plotCanvas.Children.Remove(names[index]);

    TextBlock text = new TextBlock();
    text.TextAlignment = TextAlignment.Left;
    text.FontSize = 12;
    text.Inlines.Add(new Run("(" + (GetPathsIndexFromId(piToBeAdded.ID) + 1) + ")ID:" + piToBeAdded.ID + " " + piToBeAdded.Name) { FontWeight = FontWeights.Bold });
    plotCanvas.Children.Add(text); // <---- moved this up
    Canvas.SetLeft(text, piToBeAdded.Center.X);
    Canvas.SetTop(text, piToBeAdded.Center.Y);
    names[index] = text;
}

在评论的第二部分,我建议您将处理程序附加到不同的可拖动项目,并为相应的&#34;模式&#34;设置标记。您正在使用的操作,即ShapeDragInProgressLabelDragInProgress的bool变量。这样,您就可以根据ButtonUp事件有条件地执行正确的发布捕获过程。

答案 1 :(得分:0)

Toadflakz thanx无论如何我不确定我的解决方案是否与你的建议有关。万一我会给你旗帜。 我注意到这个问题与以下事实有关:当移动形状+文本块时,鼠标点完全位于形状的中心(我故意这样做),因此在文本块上是完全正确的。因此,当我点击时,我不要点击画布上的标签。这就是画布没有射击的原因。我想这个标签正在开火。所以简而言之,我只是将标签移动了一些像素,这就是诀窍!!