对于我的应用程序中的组合框,我想允许用户编辑控件绑定的集合。为此,我希望当光标位于控件上时出现一个按钮。所以,我创建了一个用户控件,上面有一个组合框和一个按钮。但是,我遇到了在正确的时间显示按钮的问题。这是我的代码:
public partial class CollectionDropDown : UserControl
{
public CollectionDropDown()
{
InitializeComponent();
SetEventsRecursively(Controls);
}
public void SetEventsRecursively(ControlCollection controls)
{
foreach (Control ctrl in controls)
{
ctrl.MouseLeave += new EventHandler(ctrl_MouseLeave);
ctrl.MouseEnter += new EventHandler(ctrl_MouseEnter);
SetEventsRecursively(ctrl.Controls);
}
}
void ctrl_MouseEnter(object sender, EventArgs e)
{
button1.Visible = true;
}
void ctrl_MouseLeave(object sender, EventArgs e)
{
button1.Visible = false;
}
}
所以这个想法是所有控件都有相同的鼠标进入/离开所以当鼠标进入整个控件时,按钮将是可见的,当它离开时它将是不可见的。问题是鼠标离开事件在输入之前触发。因此,当您将鼠标移动到控件中时,该按钮将变为可见。但是当你试图移动到按钮时,无论光标处于何种控制状态,都会触发鼠标离开,并且在您“输入”它之前按钮将变为不可见。有什么想法吗?
答案 0 :(得分:0)
尝试这样的事情。我不确定语法是否正确
Control ctrl = null;
void ctrl_MouseEnter(object sender, EventArgs e)
{
If (ctrl == null)
{
button1.Visible = true;
ctrl = sender;
}
}
void ctrl_MouseLeave(object sender, EventArgs e)
{
If (ctrl != null && ctrl.Equals(sender))
{
button1.Visible = false;
ctrl = null;
}
}
答案 1 :(得分:0)
我使用了emd的建议来检查鼠标离开事件中鼠标是否在控件的范围内。
if (!this.RectangleToScreen(ClientRectangle).Contains(Cursor.Position))
button1.Visible = false;
这产生了我想要的结果。