WPF列表框扩展选择模式下的取消选择

5

我有一个简单的列表框,具有扩展选择模式。选择几乎像在资源管理器中一样完美地工作。但是取消选择并不是很好。我想要的是,当我单击列表框元素范围之外的任何位置时,我希望所有元素都被取消选择。默认情况下它似乎并不是这样工作的,我使用了selectionchanged和mouseup的一个不太好的hack来解决它。但一定有更好的方法。有什么想法吗?

2个回答

3

在取消选择功能方面,它并不难实现,你已经朝着正确的方向前进。主要问题是,默认情况下,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;
}

谢谢,这有点帮助,但我看到两个问题。首先,它没有考虑到你有两个列表框并且想要取消选择两个的情况。其次,它似乎只取消选择了一个项目。 - Anders Rune Jensen
将SelectedItem设置为null将始终取消选择列表框中的所有项目。如果需要在单击任何一个列表框时影响多个列表框,则可以简单地给它们一个x:Name,并在MouseDown中明确设置它们的所选项目。例如: <ListBox x:Name="uiListBox1" SelectionMode="Extended" Mouse.MouseDown="ListBox_MouseDown">..</..> <ListBox x:Name="uiListBox2" SelectionMode="Extended" Mouse.MouseDown="ListBox_MouseDown">..</..>private void ListBox_MouseDown(object sender, MouseButtonEventArgs e) { uiListBox1.SelectedItem = null; uiListBox2.SelectedItem = null; } - rmoore

3

我使用了myListBox.SelectedItems.Clear()。大多数选定项集合都是只读的,但列表框不是。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接