为什么WPF中的MouseLeftButtonUp事件没有被触发?

3
为什么我的WPF应用程序中Canvas上的MouseLeftButtonUp事件没有触发? 以下是XAML代码:

<Grid Height="300" Width="400">
    <Canvas Name="canvas" MouseMove="canvas_MouseMove" MouseLeftButtonUp="canvas_MouseLeftButtonUp" Background="LightGray"/>
</Grid>

以下是代码:

    private bool hasClicked = false;

    public Window1()
    {
        InitializeComponent();
    }

    private void canvas_MouseMove(object sender, MouseEventArgs e)
    {
        if (!this.hasClicked)
        {
            this.Cursor = Cursors.None;
            this.canvas.Children.Clear();
            this.insertRectangle(false);
        }
    }

    private void insertRectangle(bool filled)
    {
        Rectangle rect = createRect(filled);
        Point pos = Mouse.GetPosition(this.canvas);
        Canvas.SetLeft(rect, pos.X);
        Canvas.SetTop(rect, pos.Y);
        this.canvas.Children.Add(rect);
    }

    private Rectangle createRect(bool fill)
    {
        Rectangle rect = new Rectangle();
        rect.Height = 50;
        rect.Width = 120;
        if (fill)
        {
            rect.Fill = new SolidColorBrush(Colors.Green);
        }
        else
        {
            rect.Stroke = new SolidColorBrush(Colors.Green);
        }
        return rect;
    }

    private void canvas_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
    {
        this.hasClicked = true;
        this.insertRectangle(true);
        this.Cursor = Cursors.Arrow;
    }

编辑:我尝试给画布添加背景颜色,但事件仍未触发。似乎MouseMove在某种程度上覆盖了MouseLeftButtonUp。

编辑2:如果我删除MouseMove事件,mouseLeftButtonUp将会触发。

编辑3:更大的代码示例。在insertRectangle方法中,如果我使用

 Canvas.SetTop(rect, 50);
 instead of 
 Canvas.SetTop(rect, pos.Y);

事件触发得很好。


你的代码对我来说不是问题。两个事件都被触发了。 - Jin-Wook Chung
2个回答

3
如果你没有在画布上设置Background,它似乎不会注意到你的鼠标事件。
尝试这样做:
<Grid>
    <Canvas Name="canvas"
            MouseMove="canvas_MouseMove"
            MouseLeftButtonUp="canvas_MouseLeftButtonUp"
            Background="White" />
</Grid>

它并没有修复它。看起来mouseMove事件与该事件产生了某种干扰。 - eflles
@eflles:你的网格有尺寸大小吗? - H.B.
@eflles:你是如何确定事件没有触发的?如果你在两个方法中都设置了断点,那么鼠标移动断点将在你甚至还没按下鼠标时就已经触发了,而且你必须将鼠标移开画布才能响应断点触发,因此你永远不会得到一个鼠标弹起事件。如果你有原始问题中的代码,那么你将得到两个事件。尝试写入日志文件以验证这一点,或者删除鼠标移动的断点。 - Merlyn Morgan-Graham
在MouseMove事件中,我绘制一个跟随鼠标光标移动的矩形。我在MouseLeftButtonUp事件上设置了断点。 - eflles

0
通过在mouseMove方法中移动预览矩形而不是清除画布来解决了这个问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接