OnLeftButtonDown 在使用 canvas.set 放置文本块后难以触发
OnLeftButtonDown firing with difficulty after putting textblock with canvas.set
我编写了一个 C# wpf 程序来处理 canvas 上的曲线。
所以我加载了一条曲线(折线段中的一系列点),然后对其进行各种操作。每条曲线都通过鼠标交互放在屏幕上,效果很好。然后每条曲线的中心都有一个文本块,它给出了一些信息。
所以当我想用鼠标移动形状时,问题就来了。
我首先 select 使用鼠标绘制形状(有效),然后通过 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 只是一个 class 存储一些信息,其中还有坐标
具体来说,只是 Canvas.SetLeft 和 Canvas.SetTop 导致 OnMouseLeftButtonDown 无法正常触发。我把它们从标签上取下来,然后进入 0,0 事件
但是这些指令有什么问题呢?我怎样才能使 OnLeftButtonDownEvent 正常工作?
我希望我已经正确描述了问题我已经尝试提供所有相关信息。
提前致谢
帕特里克
通常最好使用 MouseButtonUp
事件来释放鼠标捕获,因为此时鼠标按钮肯定已被释放并且移动已停止(这就是您正在捕获的)。
您对 Canvas.SetLeft
的问题是因为它只能在 Canvas
对象的子对象上调用,并且您只是在之后将 text
添加到 Children
集合调用 Canvas.SetLeft
.
编辑:
在回答您的评论时,Canvas.SetLeft
只能在 Canvas
的现有子项上调用,因此请在调用 Canvas.SetLeft
之前先调用 Add
。
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;
}
关于您评论的第二部分,我建议您将处理程序附加到不同的可拖动项,并为您正在处理的适当 "mode" 操作设置标志,即 [=21 的 bool 变量=] 和 LabelDragInProgress
。这样您就可以根据 ButtonUp 事件有条件地执行正确的释放捕获过程。
无论如何,Toadflakz thanx 我不确定我的解决方案是否与您的建议有关。万一我给你旗帜。
我注意到问题与以下事实有关:当移动 shape+textblock 时,鼠标点正好位于形状的中心(我是故意这样做的),因此正好位于文本块上。因此,当我单击时,我不会单击 canvas 而是单击标签。这就是 canvas 没有触发的原因。我想标签正在触发。所以简而言之,我只是将标签移开一些像素,然后就成功了!!
我编写了一个 C# wpf 程序来处理 canvas 上的曲线。 所以我加载了一条曲线(折线段中的一系列点),然后对其进行各种操作。每条曲线都通过鼠标交互放在屏幕上,效果很好。然后每条曲线的中心都有一个文本块,它给出了一些信息。 所以当我想用鼠标移动形状时,问题就来了。 我首先 select 使用鼠标绘制形状(有效),然后通过 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 只是一个 class 存储一些信息,其中还有坐标 具体来说,只是 Canvas.SetLeft 和 Canvas.SetTop 导致 OnMouseLeftButtonDown 无法正常触发。我把它们从标签上取下来,然后进入 0,0 事件 但是这些指令有什么问题呢?我怎样才能使 OnLeftButtonDownEvent 正常工作?
我希望我已经正确描述了问题我已经尝试提供所有相关信息。
提前致谢
帕特里克
通常最好使用 MouseButtonUp
事件来释放鼠标捕获,因为此时鼠标按钮肯定已被释放并且移动已停止(这就是您正在捕获的)。
您对 Canvas.SetLeft
的问题是因为它只能在 Canvas
对象的子对象上调用,并且您只是在之后将 text
添加到 Children
集合调用 Canvas.SetLeft
.
编辑:
在回答您的评论时,Canvas.SetLeft
只能在 Canvas
的现有子项上调用,因此请在调用 Canvas.SetLeft
之前先调用 Add
。
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;
}
关于您评论的第二部分,我建议您将处理程序附加到不同的可拖动项,并为您正在处理的适当 "mode" 操作设置标志,即 [=21 的 bool 变量=] 和 LabelDragInProgress
。这样您就可以根据 ButtonUp 事件有条件地执行正确的释放捕获过程。
无论如何,Toadflakz thanx 我不确定我的解决方案是否与您的建议有关。万一我给你旗帜。 我注意到问题与以下事实有关:当移动 shape+textblock 时,鼠标点正好位于形状的中心(我是故意这样做的),因此正好位于文本块上。因此,当我单击时,我不会单击 canvas 而是单击标签。这就是 canvas 没有触发的原因。我想标签正在触发。所以简而言之,我只是将标签移开一些像素,然后就成功了!!