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

有帮助吗?

解决方案

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();
  }
}

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

其他提示

是它使用附加属性是绝对有可能。定义附加属性称为SelectOnMouseUp,当它设置为true,勾你的ItemsContainerGenerator事件时添加新项容器来发现。然后,当你得到一个新的项目容器的事件,挂接到其PreviewMouseDown而忽略它(组e.Handled为true),并挂接到其MouseUp事件,并进行选择(设置IsSelectedtrue)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top