WPF Listview修改

时间:2010-01-11 18:17:10

标签: wpf listview wpf-controls mouseevent listviewitem

出于一个非常特殊的原因,我想在鼠标按钮上选择ListViewItem,而不是实际按下鼠标按钮。我希望将此行为嵌入控件中。是否有可能实现这一目标?任何人都可以提示吗?

2 个答案:

答案 0 :(得分:3)

是的,绝对可以使用附加属性。定义名为SelectOnMouseUp的附加属性,当它设置为true时,挂钩ItemsContainerGenerator事件以发现添加新项目容器的时间。然后,当您获得新项容器的事件时,挂钩到其PreviewMouseDown并忽略它(将e.Handled设置为true),并挂钩到其MouseUp事件并执行选择(设置IsSelectedtrue)。

答案 1 :(得分:2)

Aviad P.的回答很好,巧妙地使用附加属性,但我倾向于在大多数时候使用不同的技术:

  1. Subclass ListViewItem。
  2. 覆盖OnMouseLeftButtonDown和OnMouseRightButton以不执行任何操作。
  3. 覆盖OnMouseLeftButtonUp / OnMouseRightButtonUp以调用base.OnMouseLeftButtonDown / base.OnMouseRightButtonDown。
  4. Subclass ListView。
  5. 覆盖GetContainerForItemOverride()以返回ListViewItem覆盖
  6. 这比订阅ItemContainer事件和动态添加处理程序更容易。

    这就是它的样子:

    public class MouseUpListViewItem : ListViewItem
    {
      protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e) {}
      protected override void OnMouseRightButtonDown(MouseButtonEventArgs e) {}
    
      protected override void OnMouseLeftButtonUp(MouseButtonEventArgs e)
      {
        base.OnMouseLeftButtonDown(e);
      }
      protected override void OnMouseRightButtonUp(MouseButtonEventArgs e)
      {
        base.OnMouseRightButtonDown(e);
      }
    }
    public class MouseUpListView : ListView
    {
      protected override DependencyObject GetContainerForItemOverride()
      {
        return new MouseUpListViewItem();
      }
    }
    

    我喜欢这种技术,因为涉及的代码较少。