我希望在鼠标输入时为BackColor
的{{1}}属性着色。
当PictureBox
事件触发时,我将BackColor
变为黄色,并在MouseEnter
重置为透明。
然后,当我点击MouseLeave
时,我会更改其位置,因此我还有一个PictureBox
事件会将其重置为透明。
问题是,一旦我移动它,我需要用鼠标输入Move
两次来激活MouseEnter事件!
这是一个非常图形化的问题,所以我上传了一点video来向您展示正在发生的事情,它肯定会比我更好地解释我的问题。
我尝试了另一种方法,改变颜色不在PictureBox
但在MouseEnter
。在这种情况下,它运行良好,除了我在触发Move事件之前有500ms的延迟,这显然不是我想要的。
我现在没有可行的解决方案。
对于代码,它非常简单,目前我有:
MouseHover
在Designer.cs中,每个PictureBox的事件都是:
private void pictureBoxMouseUp(object sender, MouseEventArgs e)
{
// I move the PictureBox here
}
private void pictureBoxMove(object sender, EventArgs e)
{
(sender as PictureBox).BackColor = Color.Transparent;
}
private void pictureBoxMouseEnter(object sender, MouseEventArgs e)
{
(sender as PictureBox).BackColor = Color.LightYellow;
}
private void pictureBoxMouseLeave(object sender, MouseEventArgs e)
{
(sender as PictureBox).BackColor = Color.Transparent;
}
编辑:要回答我的问题,这是我现在使用的代码:(评论是法语)
this.pictureBox2.MouseDown += new System.Windows.Forms.MouseEventHandler(this.pictureBoxMouseDown);
this.pictureBox2.MouseEnter += new System.EventHandler(this.pictureBoxMouseEnter);
this.pictureBox2.MouseLeave += new System.EventHandler(this.pictureBoxMouseLeave);
this.pictureBox2.MouseUp += new System.Windows.Forms.MouseEventHandler(this.pictureBoxMouseUp);
this.pictureBox2.Move += new System.EventHandler(this.pictureBoxMove);
我使用与以前相同的方法,并且由于未知原因,现在它可以工作。 感谢各位帮助我:)
答案 0 :(得分:4)
问题是当您重新定位foreach (DataRow dr in ds.Tables[0].Rows)
{
var Total = Convert.ToInt32(Convert.ToDouble(dr["Total"]));
var Present = Convert.ToInt32(Convert.ToDouble(dr["Present"]));
dr["Present%"] = (Present * 100) / Total;
}
时,它将不会收到鼠标离开事件。也许您已经注意到了,这也是您在PictureBox
事件中设置BackColor
的原因。
移动控件后,只有在您再次将鼠标移开并再次打开后,再次将鼠标悬停时,它才会收到第二个Move
。
尝试手动发送鼠标离开事件(我还没有测试过):
MouseEnter
答案 1 :(得分:1)
我会避免移动PictureBox
。很明显,你的错误来自于此。
移动组件时,鼠标不再显示,但状态不会更新。
你可以在the windows form reference code深入游泳,或者你可以说你有 N 小预览(底线上的图片)和一个大预览(上一个)。
创建N + 1图片框,不要更改它。只需更改他们的image property。
点击小预览后,使用大预览切换它的图像属性。
此外,建议使用MVC pattern。