2

问题:

当您使用项目源填充列表视图时,项目不再是ListViewItem它们成为类/结构或任何您用作.ItemsSource我不能在我的PreviewMouseMove事件上使用 '.IsMouseOver' 属性的含义

我尝试了什么?

  1. 将 a转换ListViewItem为 aListViewItem然后调用 .IsMouseOver (当您将鼠标放在列表视图上并显示“无法将 ClassName 转换为 ”时,除了在运行时崩溃之外没有任何下划线ListViewItem
  2. 我尝试让我的类继承自 IInputElement public ClassName : IInputElementDunno,如果这可能或没有工作,说它找不到它我对 c# 有点新,所以我不知道这将如何工作,我假设它必须是可见元素为你.IsMouseOver 它。
  3. 我试着让我的班级继承自ListViewItem这样的public ClassName : ListViewItem工作!但 ListViewItem 不包含该.IsMouseOver属性,它仍然不允许我将我的类转换为 ListViewItem 而不会崩溃 <.<

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

4

2 回答 2

3

您仍应将控件绑定到逻辑对象。虽然 SelectedItem 属性不是 ListViewItem,但可视化树仍将包含一个。对鼠标悬停的项目使用 VisualTreeHelper 和 HitTest。获得项目后,检查绑定项目的 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。

于 2012-10-19T15:11:13.520 回答
1

实际上,即使您绑定了 ListView ItemsSource,您的可视化树中仍然会有 ListViewItems。这就是 WPF 所称的项目容器(例如 ListBoxItem)。

您的 ListView 上有一个名为ItemContainerGenerator的属性。这将返回一个 ItemContainerGenerator 对象,该对象具有一个名为ContainerFromItem的方法,该方法将返回与您的对象关联的 ListViewItem。

然后,借助项目容器生成器,您可以在检索到的容器上使用 IsMouseOver。

于 2012-10-19T15:09:03.507 回答