我有一个简单的列表框,具有扩展选择模式。选择几乎像在资源管理器中一样完美地工作。但是取消选择并不是很好。我想要的是,当我单击列表框元素范围之外的任何位置时,我希望所有元素都被取消选择。默认情况下它似乎并不是这样工作的,我使用了selectionchanged和mouseup的一个不太好的hack来解决它。但一定有更好的方法。有什么想法吗?
在取消选择功能方面,它并不难实现,你已经朝着正确的方向前进。主要问题是,默认情况下,ListBox中的ListBoxItems会横跨整个宽度,这使得不点击其中任何一个变得相当困难。
以下是一个示例ListBox,它修改了默认的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>
要取消选择已选项,我们只需要在EventHandler中将SelectedItem设置为null。当我们单击ListBoxItem时,它会处理MouseDown / Click等事件以设置SelectedItem或修改SelectedItems。由于这个原因以及RoutedEvents的本质,我们只需在想要的时候在ListBox中处理MouseDown。当点击ListBox内部不属于任何项的部分时。
private void ListBox_MouseDown(object sender, MouseButtonEventArgs e)
{
(sender as ListBox).SelectedItem = null;
}
我使用了myListBox.SelectedItems.Clear()。大多数选定项集合都是只读的,但列表框不是。