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 没有触发的原因。我想标签正在触发。所以简而言之,我只是将标签移开一些像素,然后就成功了!!