如果在ListView
中选择了多个项目并单击其中一个选定项目,则默认行为是取消选中所有其他项目,只保留选中的项目。我喜欢完全相反的行为:单击其中一个选定的项目会取消选择该项目并保留其他项目。
我看过像this one和this one这样的答案。第一个是谈论防止鼠标点击做任何我不想要的事情,第二个是关于取消索引更改事件。我尝试根据自己的需要调整后者,但仍会导致其他项目被取消选择。
private void HandleIncludableFilesListViewSelectedIndexChanging
(object sender, Controls.Events.ListViewItemChangingEventArgs e)
{
if (_includableFilesListView.Items[e.Index].Selected) e.Cancel = true;
}
上述事件处理程序仅针对单击的单个项目触发,而不会触发所有其他项目,因为它们被取消选择。
有没有办法实现这个目标?
答案 0 :(得分:1)
作为选项,您可以覆盖DefWndProc
并处理WM_LBUTTONDOWN
。然后执行命中测试并检查点击的点是否为项目,还原项目的Selected
属性:
public class MyListView : ListView
{
const int WM_LBUTTONDOWN = 0x0201;
protected override void DefWndProc(ref Message m)
{
if (m.Msg == WM_LBUTTONDOWN)
{
int x = (m.LParam.ToInt32() & 0xffff);
int y = (m.LParam.ToInt32() >> 16) & 0xffff;
var item = this.HitTest(x, y).Item;
if (item != null)
item.Selected = !item.Selected;
else
base.DefWndProc(ref m);
}
else
{
base.DefWndProc(ref m);
}
}
}