2009-06-03 86 views
5

我有扩展选择模式的简单列表框。选择工作几乎完美,就像它在探险家中工作一样。但取消选举并不能真正奏效。我想要的是当我单击列表框中元素范围之外的某个元素时,我想要取消选择所有元素。我似乎没有默认行为,我做了一个晦涩的黑客行为,包括selectchanged和mouseup来破解它。但是必须有更好的方法。有任何想法吗?取消选择在WPF列表框与扩展选择模式

回答

3

这不是脏在取消的功能添加,并且你在正确的轨道上。主要的问题是,默认情况下列表框里面的ListBoxItems将跨越延伸一路,使得它非常艰难点击一个。

这里有一个例子是列表框修改默认ItemContainerStyle,这样的项目只是占用列表的左侧,还有就是项目之间的一些间距为好。

<ListBox SelectionMode="Extended" 
     Width="200" Mouse.MouseDown="ListBox_MouseDown"> 
    <ListBox.ItemContainerStyle> 
     <Style TargetType="{x:Type ListBoxItem}"> 
      <Setter Property="Background" 
        Value="LightBlue" /> 
      <Setter Property="Margin" 
        Value="2" /> 
      <Setter Property="Padding" 
        Value="2" /> 
      <Setter Property="Width" 
        Value="100" /> 
      <Setter Property="HorizontalAlignment" 
        Value="Left" /> 
     </Style> 
    </ListBox.ItemContainerStyle> 
    <ListBoxItem >Item 1</ListBoxItem> 
    <ListBoxItem >Item 2</ListBoxItem> 
    <ListBoxItem >Item 3</ListBoxItem> 
    <ListBoxItem >Item 4</ListBoxItem> 
</ListBox> 

要取消选择的项目,我们只需要设置的SelectedItem为空的事件处理程序。当我们点击一​​个ListBoxItem时,它将处理MouseDown/Click等设置SelectedItem或修改SelectedItems。正因为如此,RoutedEvents的本质我们只是在我们想要的时候处理ListBox中的MouseDown。当ListBox内的某个地方被点击时,它不是一个项目的一部分。

private void ListBox_MouseDown(object sender, MouseButtonEventArgs e) 
{ 
    (sender as ListBox).SelectedItem = null; 
} 
+0

谢谢,但有点帮助,但我看到两个问题。首先它没有考虑到你有两个列表框并且你想取消两个列表框的情况。其次它似乎只取消选择一个项目。 – 2009-06-04 08:11:25

3

我已经使用myListBox。 SelectedItems.Clear()。大多数选择的项目集合是只读的,但不是列表框。

相关问题