在具有扩展选择模式的列表框中单击取消选择

Deselect on single click in a ListBox with Extended SelectionMode

我有一个 ListBoxSelectionMode="Extended"。您只能通过在单击时按住 ctrl 来取消选择最后一个项目。我希望能够通过单击取消选择该项目,而不更改 Extended 选择模式以外的行为。

我只找到 one question 关于这个主题,它实际上有一个不同的目标(能够通过点击 ListBox 以外的地方来取消选择所有项目)。

如果我正确理解了您的要求,您可以处理 ListBoxItem 容器的 PreviewMouseLeftButtonDown 事件,如果它已经 selected,则取消 select 事件:

<ListBox SelectionMode="Extended">
    <ListBox.ItemContainerStyle>
        <Style TargetType="ListBoxItem">
            <EventSetter Event="PreviewMouseLeftButtonDown" Handler="OnMouseLeftButtonDown"/>
        </Style>
    </ListBox.ItemContainerStyle>
    <ListBoxItem>1</ListBoxItem>
    <ListBoxItem>2</ListBoxItem>
    <ListBoxItem>3</ListBoxItem>
</ListBox>

private void OnMouseLeftButtonDown(object sender, MouseEventArgs e)
{
    ListBoxItem lbi = sender as ListBoxItem;
    if (lbi != null)
    {
        if (lbi.IsSelected)
        {
            lbi.IsSelected = false;
            e.Handled = true;
        }
    }
}

这应该允许您在不使用 CTRL 键的情况下取消 select 一个项目。