如何强制 ListView 忽略单击/不突出显示单击的项目?

Posted

技术标签:

【中文标题】如何强制 ListView 忽略单击/不突出显示单击的项目?【英文标题】:How can I force a ListView to disregard clicking/not highlight a clicked item? 【发布时间】:2012-09-20 19:05:43 【问题描述】:

由于我没有根据用户可能选择的内容处理 ListView 中的项目(处理总是使用列表中的所有内容),我想禁止选择可能使用户认为他在限制的项目对那个项目的处理(我已经有了 multiselect = false,所以这不是问题)。

【问题讨论】:

【参考方案1】:

ListView 中没有任何属性可以禁用项目选择。

您可以做的是通过将事件处理程序附加到ItemSelectionChanged 来处理通知已选择项目的事件,然后取消选择该项目:

yourListView.ItemSelectionChanged += yourListView_ItemSelectionChanged;

private void yourListView_ItemSelectionChanged(
    object sender,
    ListViewItemSelectionChangedEventArgs e)

   if (e.IsSelected)
      e.Item.Selected = false;

【讨论】:

【参考方案2】:

添加到 Adriano Repettis 独奏中,我有类似的事情,我将我想阻止的项目变灰,他的解决方案阻止了蓝色突出显示,但项目仍然有焦点,这会导致问题项目的背景色设置为除白色以外的任何颜色,因为某些选定的行变为白色。为了解决这个问题,我建议添加以下行:

e.Item.Focused = false;

最终代码:

yourListView.ItemSelectionChanged += yourListView_ItemSelectionChanged;

private void yourListView_ItemSelectionChanged(
    object sender,
    ListViewItemSelectionChangedEventArgs e)

    if (e.Item.BackColor == Color.LightGray)
    
        e.Item.Selected = false;
        e.Item.Focused = false;
    

【讨论】:

【参考方案3】:

该解决方案可能会导致闪烁。您可能想要捕获 mousedown 和 mouseup 事件。在 mousedown 中,您可以通过将 WM_SETREDRAW 消息发送到具有 0 wParam 的列表视图或通过调用 LockWindowUpdate 传递列表视图的窗口句柄来禁用列表视图的重绘。 例

SendMessage(listview.Handle, WM_SETREDRAW, 0, 0);

或者

LockWindowUpdate(listview.Handle);

在 mouseup 中,您将通过以下任一方法启用重绘。

SendMessage(listview.Handle, WM_SETREDRAW, 1, 0);

或者

LockWindowUpdate(IntPtr.Zero);

...而且,您不必立即使列表视图无效。必要时它会自己做。

请注意,您必须在此方法中执行 dllimports。

你觉得这有点矫枉过正吗?

这是另一个:

扩展 ListView 类,重写 WndProc,等待 WM_NOTIFY 反映到控件,检查 m.LParam 的前四个字节是否为 -100,如果是则设置 m.Result = (IntPtr)1是并且不将消息传递给 base.WndProc。

-100 是 LVN_ITEMCHANGING。通过 m.Result 返回 1 或 0 将不允许或允许更改发生。 m.LParam 的前四个字节是通知代码,接下来的四个字节是发送消息的控件的标识,第三个字节是发送消息的控件的窗口句柄。有关详细信息,请参阅 NMHDR 和 NMLISTVIEW 结构。 Google 是您的朋友。

不过,答案迟了。你可能会认为写这么久我花了好几年才完成。

【讨论】:

以上是关于如何强制 ListView 忽略单击/不突出显示单击的项目?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Listview 中获取选定的 SubItem 索引并突出显示它?

如何选择/突出显示列表视图中的项目而不触摸它?

ListView 项目在滚动后保持突出显示

Android - 单击后保持 ListView 的项目突出显示

Android ListView 突出显示会导致奇怪的行为

在android的listview中突出显示所选项目