2011-01-28 185 views
1

我试图实现一个点击和拖动选择,如在Windows资源管理器(当你保持鼠标按下,你移动鼠标时发生的蓝色选择矩形)。鼠标输入/鼠标离开和鼠标左键按下

所以基本上我有一个ListView,带有样式和模板ListViewItem。 我在我的ListViewItem上添加了MouseEnter和MouseLeave事件(使用EventSetter), 除了当鼠标左键关闭时,它工作正常。 在这种情况下,事件不会被解雇,这不利于我想实现的目标。

你知道吗,如果有什么好的解决方法,我想知道什么时候我在某件物品上或者没有按下鼠标左键时。

现在我已经尝试了VisualTreeHelper.HitTest(),但我只知道当我穿过ListViewItem,并且我需要知道什么时候离开它。

谢谢。

回答

0

即使您的MouseEnter和Leave事件被触发,也不会提供一种很好的选择方法,因为这两个事件最终都无关紧要:无论您的鼠标是否触碰过该文件夹或文件,所有重要的事情都是如果它是在释放按钮的时间点在矩形中。这意味着Mouse Up & Down应该足够了。根据您的列表,您甚至可以通过查看发生这些事件的两个项目(例如,如果它仅仅是一维列表而不是二维网格)来推断哪些项目应该被选择。

如果你有一个网格,你需要更复杂的机制,比如跟踪哪个区域被覆盖,并检查哪些项目位于内部或边缘。

+0

这种方法的问题是,我的项目只有当用户释放鼠标按钮时才会被选中,在我的情况下,我想更接近Windows资源管理器的行为,这意味着当鼠标/“蓝色选择矩形时选择/取消选择项目“是在一个项目。 如果我在完成作业后做了选择,但外观和用户体验不如预期好,我想尽可能保持与Windows默认行为的一致性。 – StrAbZ 2011-01-28 17:24:43

+0

然后你可以在`ListView`上处理`MouseMove`,测试各个鼠标按钮是否关闭,并检查`Mouse.DirectlyOver`是否返回`ListViewItem`。如果是这样,您可以选择它并/或取消选择鼠标放在最后的项目。有点复杂,但它只是一点逻辑交互。 – 2011-01-28 17:31:55

1

当按下按钮时,您必须捕获鼠标UIElement.CaptureMouse,然后在MouseUp事件期间释放鼠标UIElement.ReleaseMouseCapture。您不必担心任何其他事件,因为捕捉过程中所有鼠标输入都会传送到您的UIElement。

这种选择形式被称为“套索选择”,Windows应用程序中的大多数小部件都支持它。实际上,ListView本身已经做到了。

0

所以我找到了一个不同的解决方案来处理这种行为。

我已经开始,这个StackOverflow的答案Click and drag selection box in WPF

在鼠标移动,修改selectionBox尺寸后,我选择了在该地区selectionBox的项目。

我做这种方式:

//Select all visible items in select region. 
Rect selectRect = new Rect(Canvas.GetLeft(selectionBox), Canvas.GetTop(selectionBox), 
       (Canvas.GetLeft(selectionBox) + selectionBox.Width), (Canvas.GetTop(selectionBox) + selectionBox.Height)); 

RectangleGeometry rr = new RectangleGeometry(selectRect); 
foreach (CustomElement elt in mainList.Items) 
{ 
    ListViewItem item = mainList.ItemContainerGenerator.ContainerFromItem(elt) as ListViewItem; 
    Rect r = LayoutInformation.GetLayoutSlot(item); 
    if (r.IntersectsWith(selectRect)) 
     item.IsSelected = true; 
    else 
     item.IsSelected = false; 
} 

我发现LayoutInformation可以给你,代表你的对象的矩形,这样我就可以检查它是否与selectionBox矩形相交。