c# - 在使用 itemssource 时找出鼠标在 ListView 中的哪个项目

标签 c# wpf

问题:

当您使用项目源填充 ListView 时,项目不再是 ListViewItem 它们成为类/结构或您用作 .ItemsSource 的任何内容,这意味着我可以'不要在我的 PreviewMouseMove 事件上使用“.IsMouseOver”属性

我尝试了什么?

  1. ListViewItem 转换为 ListViewItem,然后对其调用 .IsMouseOver(当您将鼠标放在 ListView 上时,不会在运行时添加任何下划线但会崩溃,并说“无法将 ClassName 转换为 ListViewItem)
  2. 我尝试让我的类继承自 IInputElement public ClassName : IInputElement 不知道这是否可能 行不通 说找不到它 我是 c# 的新手,所以我不知道如何这确实可行,我假设它必须是您可以看到的元素。IsMouseOver。
  3. 我尝试让我的类继承自 ListViewItem,例如 public ClassName : ListViewItem 这奏效了!但是 ListViewItem 不包含 .IsMouseOver 属性,它仍然不允许我在不崩溃的情况下将我的类转换为 ListViewItem <.<

总体目标是突出显示一个列表项并使用鼠标悬停的类中的值填充一堆文本字段,我之前在 winforms 中完成过,但在 winforms 中非常容易

最佳答案

您仍然应该将您的控件绑定(bind)到一个逻辑对象。虽然 SelectedItem 属性不是 ListViewItem,但可视化树仍将包含一个。对鼠标悬停的项目使用 VisualTreeHelper 和 HitTest。获得项目后,检查绑定(bind)项目的 DataContext 属性。

这是一些代码:

private ListViewItem FindListViewItem(DragEventArgs e)
{
    var visualHitTest = VisualTreeHelper.HitTest(_listView, e.GetPosition(_listView)).VisualHit;

    ListViewItem listViewItem = null;

    while (visualHitTest != null)
    {
        if (visualHitTest is ListViewItem)
        {
            listViewItem = visualHitTest as ListViewItem;

            break;
        }
        else if (visualHitTest == _listView)
        {
            Console.WriteLine("Found ListView instance");
            return null;
        }

        visualHitTest = VisualTreeHelper.GetParent(visualHitTest);
    }

    return listViewItem;
}

另一种选择是设置 ItemsContainerStyle 的样式以按照您想要的方式处理 MouseOver。

关于c# - 在使用 itemssource 时找出鼠标在 ListView 中的哪个项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12977046/

相关文章:

c# - 如何检测何时按下向下箭头键/C# WPF

wpf - 数据网格 : How to remove black inner borders?

c# - Azure函数: Is there optimal way to upload file without storing it in process memory?

c# - 从一个队列中删除存在于另一个队列中的元素

c# - 使用 Lambda 表达式进行 try without catch 是一种不好的做法吗?

c# - 多列的sql合并语句

c# - 通过 xmlns 引用访问另一个项目

wpf - 删除窗口的背景图像 WPF

c# - 过滤用户列表 asp.net 身份

WPF/附加属性 - 请解释为什么它有效