我有以下问题:我有一个具有特定颜色的面板,比如红色。 当用户按下鼠标时,该面板的颜色存储在变量中。然后用户移动,他的鼠标仍然按下,转到另一个面板。当他在那里释放鼠标时,该面板应该获得存储在变量中的第一个颜色。我的代码看起来像这样:
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方法完全正常,颜色很好地存储在变量中。然而,当用户执行上述描述时,secon one甚至不会被触发。当ser点击第二个面板时,它可以正常工作(我猜测还有一个MouseUp部分)。
这里有什么问题?为什么用户在按住鼠标键之前未触发事件?
答案 0 :(得分:3)
(此答案假设您使用的是Windows窗体。)
可能需要通过在源代码管理的MouseDown中设置this.Capture = true
来捕获鼠标。 (See Control.Capture
)
如果您这样做,源窗口将获得MouseUp
事件,而 source 窗口必须确定目标窗口鼠标坐标。您可以使用Control.GetChildAtPoint()
执行此操作(请参阅Stack Overflow上的this answer)。
Use Windows Forms Drag and Drop Support Instead! < - 点击了解更多信息
我建议你咬紧牙关并使用.Net拖放方法来做到这一点。它需要一些阅读,但使用它会更好 。
您通过调用Control.DoDragDrop()
开始拖动以响应MouseDown
事件。
然后,您需要处理放置目标控件中的Control.DragDrop
事件。
您可能还需要做一些事情来设置它;有关示例,请参阅Control.DoDragDrop()
文档。
答案 1 :(得分:1)
当你的鼠标进入目标控件时,鼠标按下触发器获取目标BackColor!你需要为你的代码添加一个布尔标志:
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)中更改您的标志
答案 2 :(得分:0)
正如我在评论中提到的,鼠标事件由原始控件捕获,您可能最好使用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;
}
}
答案 3 :(得分: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;
}
}