代码之家  ›  专栏  ›  技术社区  ›  Gratzy

WPF左键单击并拖动

  •  0
  • Gratzy  · 技术社区  · 4 年前

    所以这个代码:

        private void NewButton_MouseDown(object sender, MouseButtonEventArgs e)
        {
            var test = e.LeftButton;
            var test2 = e.RightButton;
            if (!bButtonIsDown)
            {
                bButtonIsDown = true;
                Button mover = (Button)sender;
                pntEnterPoint = e.GetPosition(this.cnvsLinkScreen);
    
                cnvsLinkScreen.MouseMove += CnvsLinkScreen_MouseMove;
                cnvsLinkScreen.MouseUp += CnvsLinkScreen_MouseUp;
                
                spMover = (StackPanel)((Button)sender).Parent;
                pntPreviousPoint.X = Canvas.GetLeft(spMover);
                pntPreviousPoint.Y = Canvas.GetTop(spMover);
    
            }
        }
    
        private void NewButton_MouseMove(object sender, MouseEventArgs e)
        {
            Button mover = (Button)sender;
            StackPanel spMover = (StackPanel)((Button)sender).Parent; 
            base.OnMouseMove(e);
            if (e.LeftButton == MouseButtonState.Pressed)
            {
    
                // Inititate the drag-and-drop operation.
                FindChild<StackPanel>(cnvsLinkScreen, "CSVImport");
                pntEnterPoint = e.GetPosition(this.cnvsLinkScreen);
                Canvas.SetLeft(spMover, pntEnterPoint.X + 1);
                Canvas.SetTop(spMover, pntEnterPoint.Y + 1);
            }
        }
    

    工作,但只有右键。启用事件处理程序时:

    newButton.MouseDown += NewButton_MouseDown;
    

    我已经做了大量的阅读,人们会引用previewMouseLeftButtonDown事件处理程序,但是当我在适当的地方使用它(相同的代码)时cnvsLinkScreen.MouseMove+=CnvsLinkScreen_MouseMove在我松开鼠标左键(向上键)之前不会启动,然后StackPanel拖动,直到我单击并放下它。

    为什么MouseDown事件处理程序在鼠标左键按下时不触发,而只在鼠标右键按下时触发?

    0 回复  |  直到 4 年前
        1
  •  1
  •   Keith Stein maty jimenez    4 年前

    这与 Routed Events . 与普通事件不同,路由事件可以 marked as handled

    MouseDown MouseMove bubbling routed events ,这意味着他们从最深层的元素(按钮内的元素)开始,然后通过父母向上“冒泡” Window

    这就是这里发生的事。 Button 具有的处理程序 内部 按钮 Click 事件和 事件 已处理 似乎也能应付 鼠标移动 ,但仅在单击正在进行时。这就是为什么您的事件处理程序在左键单击期间不会被调用,因为左键单击会触发一个“单击”,在这些事件从 .

    PreviewMouseDown PreviewMouseMove tunneling routed events 窗口 )然后朝着光标的确切位置向内移动。隧道事件发生 冒泡事件;鼠标输入首先向光标移动,然后向上冒泡。

    如果将事件处理程序附加到 预览鼠标向下 预览鼠标移动 而不是 鼠标移动 ,您将看到您期望的所有鼠标输入。

    有趣的旁注:你实际上可以玩同样的把戏 按钮 那个 预览鼠标向下 在它进入内部之前 按钮 点击