0

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

    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 部分)。

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

4

4 回答 4

3

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

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

如果你这样做了,窗口会得到MouseUp事件,窗口必须在鼠标坐标下确定目标窗口。您可以使用Control.GetChildAtPoint()(参见Stack Overflow 上的这个答案)来做到这一点。

改用 Windows 窗体拖放支持!<- 点击了解更多

我将建议您硬着头皮使用 .Net 拖放方法来执行此操作。它需要一些阅读,但使用它会更好

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

然后您需要处理Control.DragDrop放置目标控件中的事件。

您可能还需要做一些其他事情来设置它;Control.DoDragDrop()有关示例,请参阅文档。

有关 WPF 拖放支持,请参见此处。

于 2013-04-20T18:45:12.647 回答
1

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

 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 ) 中更改您的标志

于 2013-04-20T19:47:49.520 回答
0

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

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;
    }

}
于 2013-04-20T21:12:52.663 回答
0

我知道这是一个老问题,但我遇到了同样的问题,以上答案都不适合我。在我的情况下,我必须处理目标控件中的 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;
    }
}
于 2016-06-07T11:10:40.357 回答