出于一个非常具体的原因,我想ListViewItem
在鼠标按钮向上时选择 s,而不是在鼠标按钮向下时选择。我希望将此行为嵌入到控件中。有可能实现这一目标吗?任何人都可以给出提示吗?
问问题
479 次
2 回答
3
是的,使用附加属性绝对是可能的。定义一个名为的附加属性SelectOnMouseUp
,当它设置为 true 时,挂钩到您的ItemsContainerGenerator
事件以发现何时添加了新的项目容器。然后,当您获得新项目容器的事件时,挂钩PreviewMouseDown
并忽略它(设置e.Handled
为 true),并挂钩其MouseUp
事件并执行选择(设置IsSelected
为true
)。
于 2010-01-11T19:15:44.243 回答
2
Aviad P. 的答案是一个很好的答案,并且巧妙地使用了附加属性,但我大多数时候倾向于使用不同的技术:
- 子类 ListViewItem。
- 重写 OnMouseLeftButtonDown 和 OnMouseRightButton 以不执行任何操作。
- 重写 OnMouseLeftButtonUp / OnMouseRightButtonUp 以调用 base.OnMouseLeftButtonDown / base.OnMouseRightButtonDown。
- 子类列表视图。
- 覆盖 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 回答