【发布时间】:2016-01-26 12:40:50
【问题描述】:
我有一个 ListView,其 View 设置为 LargeIcon。
我特别需要通过用鼠标在它们周围拖动一个选择框来检测何时选择了多个项目。
(例如我不想知道 CTRL + Click 何时选择项目)
我想我可以简单地通过跟踪鼠标在移动时是否按下来指示拖动,然后在鼠标向上时如果是拖动,那么我可以设置另一个变量来指示这一点。
在下面的示例中,mouseDown 设置为 true,但是当我按住鼠标并移动它时,isDrag 从未设置为 true,我看不出我做错了什么。
(编辑:如果我删除 if 子句,isDrag 变为真,这很奇怪,因为正如我所说,mouseDown 绝对是真的)。
我意识到代码比实际需要的要长一些,但为了清楚起见。
bool mouseDown;
bool isDrag;
bool wasDrag;
private void listView1_MouseDown(object sender, MouseEventArgs args)
{
wasDrag = false;
mouseDown = true;
}
private void listView1_MouseMove(object sender, MouseEventArgs args)
{
if (mouseDown)
isDrag = true; // <-- Never becomes true, even though mouseDown is true
}
private void listView1_MouseUp(object sender, MouseEventArgs args)
{
if (isDrag)
wasDrag = true;
mouseDown = false;
isDrag = false;
}
我知道这会很愚蠢。请让我摆脱痛苦。
或者,如果有人知道更好的方法是检测拖动选择(正确的术语是什么?),那么我全神贯注。
【问题讨论】:
-
在 mouseup 中,获取 ListView1.SelectedItems 属性。释放鼠标后,在拖动过程中选择的任何项目都应在此属性中可用。
-
这将包括在按住控制时通过单击选择的项目。我想要通过拖动特别选择的项目。
-
听起来可能是个愚蠢的问题,但我还是要问:你确定
listView1_MouseMove方法实际上是分配给listview1的MouseMove事件处理程序的吗?看看InitializeComponent()方法 -
肯定是赋值的,触发了该处理程序内部设置的断点。亚历克斯,我已经更新了我的问题,使其更清晰,谢谢!
-
你能钩
listView1_PreviewMouseDown和listView1_PreviewMouseMove吗?可能只是事件在它冒泡到足以让 MouseDown 和 MouseMove 响应之前就被处理了。你的方法似乎是合理的,只要你能尽早挂钩事件。