2010-01-11 34 views
1

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

回答

2

阿维亚德P.的回答是一个很好的,并巧妙地利用附加属性,但我倾向于使用不同的技术大部分的时间:

  1. 子类的ListViewItem。
  2. 重写OnMouseLeftButtonDown和OnMouseRightButton不执行任何操作。
  3. 重写OnMouseLeftButtonUp/OnMouseRightButtonUp来调用base.OnMouseLeftButtonDown/base.OnMouseRightButtonDown。
  4. 子类ListView。
  5. 覆盖GetContainerForItemOverride()返回你的ListViewItem的覆盖

这似乎不是订阅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(); 
    } 
} 

我喜欢这个技术,因为这牵涉更少的代码。

+0

好的答案,我设法实现了我的附属属性解决方案,但结果只是一点点太复杂和棘手比我希望的! :) – 2010-01-12 05:11:42

3

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

+0

感谢您的回复,是否有可能在XAML中使用它? – 2010-01-11 19:32:51

+0

您无法在纯XAML中“掩盖”正常的“MouseDown”行为。 – 2010-01-11 19:37:25

+0

+1为聪明的使用附加属性和'ItemContainerGenerator',但也看到我的答案,更简单地使用'GetContainerForItemOverride'解决问题 – 2010-01-11 23:46:46