我编写了一个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正常工作?
我希望我已经正确地描述了问题我试图提供所有相关信息。
提前完成
帕特里克
答案 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;设置标记。您正在使用的操作,即ShapeDragInProgress
和LabelDragInProgress
的bool变量。这样,您就可以根据ButtonUp事件有条件地执行正确的发布捕获过程。
答案 1 :(得分:0)
Toadflakz thanx无论如何我不确定我的解决方案是否与你的建议有关。万一我会给你旗帜。 我注意到这个问题与以下事实有关:当移动形状+文本块时,鼠标点完全位于形状的中心(我故意这样做),因此在文本块上是完全正确的。因此,当我点击时,我不要点击画布上的标签。这就是画布没有射击的原因。我想这个标签正在开火。所以简而言之,我只是将标签移动了一些像素,这就是诀窍!!