当鼠标按下时 MouseHover 不触发
MouseHover not firing when mouse is down
我正在开发一个 WordSearch 拼图程序(也称为 WordFind),您必须在其中找到大量字母中的某些单词。我正在使用 C# WinForms。
我的问题是当我想单击并按住 1 个字母 (Label
),然后拖到其他字母以更改它们的 ForeColor
。我试过谷歌搜索但无济于事。
这是我的:
foreach (Letter a in game.GetLetters())
{
this.Controls.Add(a);
a.MouseDown += (s, e2) =>
{
isDown = true;
a.ForeColor = Color.Yellow;
};
a.MouseUp += (s, e2) =>
{
isDown = false;
};
a.MouseHover += (s, e2) =>
{
if (isDown)
a.ForeColor = Color.Yellow;
};
}
但是,MouseHover 事件永远不会触发,除非鼠标没有被按住。也没有运气将 MouseHover
与 MouseEnter
交换。因此,我保留了 MouseDown
和 MouseUp
事件并尝试在表单本身内使用 MouseHover:
private void frmMain_MouseHover(object sender, MouseEventArgs e)
{
if (isDown)
{
foreach (Letter l in game.GetLetters())
if (l.ClientRectangle.Contains(l.PointToClient(Control.MousePosition)))
l.ForeColor = Color.Purple;
}
}
这个事件也没有触发,我不知道为什么它没有触发以及有哪些替代解决方案。任何建议表示赞赏。
您正在寻找各种拖动事件:
https://msdn.microsoft.com/en-us/library/system.windows.forms.control.dragenter(v=vs.110).aspx
https://msdn.microsoft.com/en-us/library/system.windows.forms.control.dragover(v=vs.110).aspx
等...
您 运行 遇到的问题是您使用了错误的事件来实现您想要完成的目标。
您可以使用拖放事件。
- 为每个作为放置目标的控件设置
AllowDrop
属性。
- 为每个拖动开始的控件处理
MouseDown
事件,并在处理程序中调用该控件的 DoDragDrop
事件并设置要拖动的数据。
- 处理
DragEnetr
event of each target of drag and set e.Effect
以确定是否允许删除。在这里您可以检查是否允许掉落,将背景颜色更改为您想要的颜色。
- 处理
DragLeave
以重置背景颜色。
- Hanlde
DragDrop
and use GetData
method if e.Data
获取数据并在拖放时执行操作。
走过
例子
我有 3 个按钮,button1 和 button2 以及 button3 和 button2 是放置目标。在下面的代码中,我将检查按钮 2 上的文本是否是按钮 1 的文本,我将按钮 2 的背景颜色更改为绿色,否则为红色。另外,如果您将鼠标拖出 button2,我会将背景颜色设置为默认值。如果你放弃,我将更改 button2 的文本并将设置 button1 的文本:
//Start drag for button 2
private void button1_MouseDown(object sender, MouseEventArgs e)
{
this.button1.DoDragDrop(this.button1.Text, DragDropEffects.Copy);
}
//Start drag for button 3
private void button3_MouseDown(object sender, MouseEventArgs e)
{
this.button3.DoDragDrop(this.button3.Text, DragDropEffects.Copy);
}
//Check if drop is allowed and change back color
private void button2_DragEnter(object sender, DragEventArgs e)
{
if(e.Data.GetData(DataFormats.Text).ToString()== button1.Text)
{
e.Effect = DragDropEffects.Copy;
this.button2.BackColor = Color.Green;
}
else
{
e.Effect = DragDropEffects.None;
this.button2.BackColor = Color.Red;
}
}
//Perform drop actions
private void button2_DragDrop(object sender, DragEventArgs e)
{
this.button2.Text = e.Data.GetData(DataFormats.Text).ToString();
}
//Reset back color here
private void button2_DragLeave(object sender, EventArgs e)
{
this.button2.BackColor = SystemColors.Control;
}
我正在开发一个 WordSearch 拼图程序(也称为 WordFind),您必须在其中找到大量字母中的某些单词。我正在使用 C# WinForms。
我的问题是当我想单击并按住 1 个字母 (Label
),然后拖到其他字母以更改它们的 ForeColor
。我试过谷歌搜索但无济于事。
这是我的:
foreach (Letter a in game.GetLetters())
{
this.Controls.Add(a);
a.MouseDown += (s, e2) =>
{
isDown = true;
a.ForeColor = Color.Yellow;
};
a.MouseUp += (s, e2) =>
{
isDown = false;
};
a.MouseHover += (s, e2) =>
{
if (isDown)
a.ForeColor = Color.Yellow;
};
}
但是,MouseHover 事件永远不会触发,除非鼠标没有被按住。也没有运气将 MouseHover
与 MouseEnter
交换。因此,我保留了 MouseDown
和 MouseUp
事件并尝试在表单本身内使用 MouseHover:
private void frmMain_MouseHover(object sender, MouseEventArgs e)
{
if (isDown)
{
foreach (Letter l in game.GetLetters())
if (l.ClientRectangle.Contains(l.PointToClient(Control.MousePosition)))
l.ForeColor = Color.Purple;
}
}
这个事件也没有触发,我不知道为什么它没有触发以及有哪些替代解决方案。任何建议表示赞赏。
您正在寻找各种拖动事件:
https://msdn.microsoft.com/en-us/library/system.windows.forms.control.dragenter(v=vs.110).aspx https://msdn.microsoft.com/en-us/library/system.windows.forms.control.dragover(v=vs.110).aspx
等...
您 运行 遇到的问题是您使用了错误的事件来实现您想要完成的目标。
您可以使用拖放事件。
- 为每个作为放置目标的控件设置
AllowDrop
属性。 - 为每个拖动开始的控件处理
MouseDown
事件,并在处理程序中调用该控件的DoDragDrop
事件并设置要拖动的数据。 - 处理
DragEnetr
event of each target of drag and sete.Effect
以确定是否允许删除。在这里您可以检查是否允许掉落,将背景颜色更改为您想要的颜色。 - 处理
DragLeave
以重置背景颜色。 - Hanlde
DragDrop
and useGetData
method ife.Data
获取数据并在拖放时执行操作。
走过
例子
我有 3 个按钮,button1 和 button2 以及 button3 和 button2 是放置目标。在下面的代码中,我将检查按钮 2 上的文本是否是按钮 1 的文本,我将按钮 2 的背景颜色更改为绿色,否则为红色。另外,如果您将鼠标拖出 button2,我会将背景颜色设置为默认值。如果你放弃,我将更改 button2 的文本并将设置 button1 的文本:
//Start drag for button 2
private void button1_MouseDown(object sender, MouseEventArgs e)
{
this.button1.DoDragDrop(this.button1.Text, DragDropEffects.Copy);
}
//Start drag for button 3
private void button3_MouseDown(object sender, MouseEventArgs e)
{
this.button3.DoDragDrop(this.button3.Text, DragDropEffects.Copy);
}
//Check if drop is allowed and change back color
private void button2_DragEnter(object sender, DragEventArgs e)
{
if(e.Data.GetData(DataFormats.Text).ToString()== button1.Text)
{
e.Effect = DragDropEffects.Copy;
this.button2.BackColor = Color.Green;
}
else
{
e.Effect = DragDropEffects.None;
this.button2.BackColor = Color.Red;
}
}
//Perform drop actions
private void button2_DragDrop(object sender, DragEventArgs e)
{
this.button2.Text = e.Data.GetData(DataFormats.Text).ToString();
}
//Reset back color here
private void button2_DragLeave(object sender, EventArgs e)
{
this.button2.BackColor = SystemColors.Control;
}