【问题标题】:Mouse up event doesn't get triggered鼠标向上事件不会被触发
【发布时间】:2016-06-07 19:10:40
【问题描述】:

我有以下问题:我有一个具有特定颜色的面板,比如红色。 当用户按下鼠标时,这个面板的颜色被存储在一个变量中。然后用户移动,他的鼠标仍然按下,移到另一个面板。当他在那里释放鼠标时,该面板应该获得已存储在变量中的第一个背景颜色。我的代码如下所示:

    public Color currentColor;
    private void ColorPickMouseDown(object sender, MouseEventArgs e)
    {
        Panel pnlSender = (Panel)sender;                   
        currentColor = pnlSender.BackColor;
    }

    private void AttempsColorChanger(object sender, MouseEventArgs e)
    {
        Panel pnl = (Panel)sender;
        pnl.BackColor = currentColor;
    }

我需要先确定发送者,因为有很多可能的面板可以触发此事件。第一个 MouseDown 方法工作得很好,颜色很好地存储在变量中。然而,当用户执行我上面描述的操作时,第二个甚至不会被触发。当服务器点击第二个面板时,它会起作用(我猜点击中也有一个 MouseUp 部分)。

这里有什么问题?为什么之前用户按住鼠标键没有触发事件?

【问题讨论】:

  • 如果您将鼠标停留在第一个面板上(向下点击然后向上点击而不移动),是否会触发鼠标向上事件?我怀疑是这样。
  • 是的,它确实如此。似乎程序在 MouseDown 事件之后不再跟踪鼠标的位置...
  • 它实际上是由您的原始面板捕获的,即触发的 MouseUp 事件。

标签: c# panel mouseup


【解决方案1】:

(此答案假设您使用的是 Windows 窗体。)

可能是你需要通过在源代码管理的 MouseDown 中设置this.Capture = true 来捕获鼠标。 (See Control.Capture)

如果你这样做了,source 窗口将获得MouseUp 事件,而 source 窗口必须确定鼠标下的目标窗口坐标。您可以使用 Control.GetChildAtPoint() 来做到这一点(请参阅 Stack Overflow 上的 this answer)。

Use Windows Forms Drag and Drop Support Instead!

我建议您咬紧牙关,使用 .Net 拖放方法来执行此操作。它需要一些阅读,但使用它会好多更好。

您可以通过调用Control.DoDragDrop() 来响应MouseDown 事件开始拖动。

那么你需要在放置目标控件中处理Control.DragDrop事件。

您可能需要做更多的事情来设置它;有关示例,请参阅 Control.DoDragDrop() 文档。

(For WPF drag and drop support, see here.)

【讨论】:

    【解决方案2】:

    当您的鼠标进入目标控件时,鼠标按下触发并获取目标背景颜色!您需要在代码中添加一个布尔标志:

     public Color currentColor;       
     bool flag=false;
        private void ColorPickMouseDown(object sender, MouseEventArgs e)
        {
            if(flag==false)
            {
            flag=true
            Panel pnlSender = (Panel)sender;                   
            currentColor = pnlSender.BackColor;
           }
        }
        //assume mouse up for panles
        private void AttempsColorChanger(object sender, MouseEventArgs e)
        {
           if(flag==true)
           {  
            Panel pnl = (Panel)sender;
            pnl.BackColor = currentColor;
            flag=flase;
           }
        }
    

    你还需要在 mouseMove(if) 中改变你的标志

    【讨论】:

      【解决方案3】:

      正如我在评论中提到的鼠标事件由原始控件捕获,您最好使用 Windows 窗体中内置的 DragDrop 功能。像这样的东西应该适合你。我分配了通用事件处理程序,因此可以将它们分配给您的所有面板并正常工作。

      public partial class Form1 : Form
      {
          public Form1()
          {
              InitializeComponent();
          }
      
          private void panel_MouseDown(object sender, MouseEventArgs e)
          {
             ((Control)sender).DoDragDrop(((Control)sender).BackColor,DragDropEffects.All);
          }
      
          private void panel_DragDrop(object sender, DragEventArgs e)
          {
              ((Control)sender).BackColor = (Color)e.Data.GetData(BackColor.GetType());
          }
          private void panel_DragEnter(object sender, DragEventArgs e)
          {
              e.Effect = DragDropEffects.Copy;
          }
      
      }
      

      【讨论】:

        【解决方案4】:

        我知道这是一个老问题,但我遇到了同样的问题,以上答案都没有对我有用。在我的情况下,我必须处理目标控件中的 MouseMove 事件并检查鼠标是否被释放。我确实在目标面板上设置了“BringToFront”,以防万一。

        public Color currentColor;
        private void ColorPickMouseDown(object sender, MouseEventArgs e)
        {
            Panel pnlSender = (Panel)sender;                   
            currentColor = pnlSender.BackColor;
        }
        
        private void panelTarget_MouseMove(object sender, MouseEventArgs e)
        {
            //the mouse button is released
            if (SortMouseLocation == Point.Empty)
            {
                Panel pnl = (Panel)sender;
                pnl.BackColor = currentColor;
            }
        }
        

        【讨论】:

          猜你喜欢
          • 2012-08-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-07-23
          • 1970-01-01
          • 1970-01-01
          • 2018-04-09
          相关资源
          最近更新 更多