2010-11-19 66 views
1

我有一个带有扩展选择模式的ListView。默认情况下,当我按下左按钮时,选择一个项目,当我移动鼠标光标(缓慢)时,它将移动选择项(只要按钮仍然处于按下状态)。当鼠标移动按钮时,阻止ListView改变选择

由于我在列表顶部实施拖放操作,它变得有点烦人。如何防止在鼠标按钮关闭时更改所选项目?我试图在PreviewMouseMove中说e.Handled = true,但它没有帮助。

回答

4

更新
最后的解决方案没有工作。这是禁用鼠标移动选择的两个事件的组合。问题是,当选择一个已经选择的项目(没有SelectionChanged发生),那么我们仍然可以上下移动鼠标来改变选择。我发现解决这个问题的唯一方法是欺骗ListView再次选择相同的项目。如果您的选择功能已更改,这可能会很不方便,但否则这似乎会完成工作。

<ListView SelectionMode="Extended" 
      Name="listView"> 
    <ListView.ItemContainerStyle> 
     <Style TargetType="{x:Type ListViewItem}"> 
      <EventSetter Event="Selected" Handler="listViewItem_Selected"/> 
      <EventSetter Event="PreviewMouseDown" Handler="listViewItem_PreviewMouseDown"/> 
     </Style> 
    </ListView.ItemContainerStyle> 
</ListView> 

而在事件处理

void listViewItem_Selected(object sender, RoutedEventArgs e) 
{ 
    listView.ReleaseMouseCapture(); 
} 
private void listViewItem_PreviewMouseDown(object sender, MouseButtonEventArgs e) 
{ 
    ListViewItem listViewItem = sender as ListViewItem; 
    if (listViewItem.IsSelected == true) 
    { 
     // Unselecting the item in the Preview event 
     // "tricks" the ListView into selecting it again 
     listViewItem.IsSelected = false; 
    } 
} 
+0

这工作得更好一点,但仍然不是100%,现在如果我把鼠标移动速度快,但只是一个项目下来它仍然选择它的列表。看起来像SelectionChanged在PreviewMouseMove之前被调用。 – Vitalik 2010-11-19 17:06:12

+0

你是对的,当两次选择同一个项目时,它仍然失败。我试着打印出每个ReleaseMouseCapture并确实调用了它,但ListView仍然在MouseMove上更改项目 – 2010-11-19 17:30:04

+0

已更新我的答案 – 2010-11-19 18:27:31