1

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

4

2 回答 2

3

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

于 2010-01-11T19:15:44.243 回答
2

Aviad P. 的答案是一个很好的答案,并且巧妙地使用了附加属性,但我大多数时候倾向于使用不同的技术:

  1. 子类 ListViewItem。
  2. 重写 OnMouseLeftButtonDown 和 OnMouseRightButton 以不执行任何操作。
  3. 重写 OnMouseLeftButtonUp / OnMouseRightButtonUp 以调用 base.OnMouseLeftButtonDown / base.OnMouseRightButtonDown。
  4. 子类列表视图。
  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();
  }
}

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

于 2010-01-11T23:40:56.603 回答