【发布时间】:2022-04-30 18:58:06
【问题描述】:
我正在使用MouseMove、MouseUp、MouseDown 事件来移动无边界表单(此处以示例为例)。
它很好用,但对于 ListView,它只有在我单击列表中的一个项目(其文本)时才有效。如果我单击不包含任何项目的 ListView 的空间,它将不起作用。
有没有办法解决这个问题?
private bool mouseDown;
private Point lastLocation;
private void ListView1_MouseDown(object sender, MouseEventArgs e)
{
mouseDown = true;
lastLocation = e.Location;
}
private void ListView1_MouseMove(object sender, MouseEventArgs e)
{
if(mouseDown)
{
this.Location = new Point(
(this.Location.X - lastLocation.X) + e.X, (this.Location.Y - lastLocation.Y) + e.Y);
this.Update();
}
}
private void ListView1_MouseUp(object sender, MouseEventArgs e)
{
mouseDown = false;
}
【问题讨论】:
-
我想你会为包含 ListView 的容器使用这些事件处理程序,无论是你想移动它的表单还是只是容器。
-
不清楚你想在那里做什么。显然,您处理 ListView 的鼠标事件,但随后尝试移动
this(表单)- ListView 在其所有客户端区域表面上引发鼠标事件,无论是否被某些项目占用。 -
ListView 鼠标事件的提升/处理有点奇怪;例如,如果您在非项目区域上启动 MouseDown,则不会引发 MouseMove 事件。另一个例子,当你在一个项目上启动一个 MouseDown,然后将鼠标按钮释放到控件的区域之外,那么它会在你下次将鼠标移到控件上时引发一个 MouseUp 事件,而忽略鼠标按钮的状态。
-
这是一个非常好的实现@Jimi。对于
ListView控件,您需要设置MultiSelect = false以使其工作,即使您开始在非项目区域中拖动控件。 (或者也许您可以找到更好的解决方法。) -
@RezaAghaei 您的意思是,设置
MultiSelect = false,然后您可以拖动表单单击ListView 上的任意位置?是的,就可以了。我会留下一个注释,很可能 选择矩形 在 OP 的场景中没有那么有用。 -- 谢谢,顺便说一句:) -- 如果我有空闲时间,我会看看是否有可能避免它(我这次很忙)。