问题:
当您使用项目源填充 ListView 时,项目不再是 ListViewItem
它们成为类/结构或您用作 .ItemsSource
的任何内容,这意味着我可以'不要在我的 PreviewMouseMove
事件上使用“.IsMouseOver”属性
我尝试了什么?
- 将
ListViewItem
转换为ListViewItem
,然后对其调用 .IsMouseOver(当您将鼠标放在 ListView 上时,不会在运行时添加任何下划线但会崩溃,并说“无法将 ClassName 转换为ListViewItem
) - 我尝试让我的类继承自 IInputElement
public ClassName : IInputElement
不知道这是否可能 行不通 说找不到它 我是 c# 的新手,所以我不知道如何这确实可行,我假设它必须是您可以看到的元素。IsMouseOver。 - 我尝试让我的类继承自
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/