-
20-09-2019 - |
题
出于一个非常具体的原因,我想选择 ListViewItem
是在鼠标按钮向上时,而不是实际上在鼠标按钮按下时。我希望将此行为嵌入到控件中。有可能实现这一目标吗?谁能给出提示吗?
解决方案
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();
}
}
我喜欢这种技术,因为涉及的代码较少。
其他提示
是它使用附加属性是绝对有可能。定义附加属性称为SelectOnMouseUp
,当它设置为true,勾你的ItemsContainerGenerator
事件时添加新项容器来发现。然后,当你得到一个新的项目容器的事件,挂接到其PreviewMouseDown
而忽略它(组e.Handled
为true),并挂接到其MouseUp
事件,并进行选择(设置IsSelected
到true
)。
不隶属于 StackOverflow