WPF:ListBox取消选择

时间:2010-01-27 17:25:13

标签: wpf select listbox

  1. 当用户点击我的单选ListBox中的项目时,该项目已被选中。
  2. 当用户第二次点击某个项目时,除非他们持有控制键,否则不会取消该项目。
  3. 将#2更改为不需要控制键的推荐方法是什么?

4 个答案:

答案 0 :(得分:4)

确保选择模式为Multiple。选择多个:

  

只需单击鼠标即可使用鼠标选择和取消选择所需的任何项目。但是,如果您一次只需要一个选定的项目,则必须在SelectionChanged事件中取消选择代码中的其他项目。

Source

Private Sub MainList_SelectionChanged(ByVal sender As System.Object, ByVal e As System.Windows.Controls.SelectionChangedEventArgs)
    If e.AddedItems.Count > 0 Then
        Dim valid = e.AddedItems(0)
        For Each item In New ArrayList(MainList.SelectedItems)
            If item IsNot valid Then MainList.SelectedItems.Remove(item)
        Next
    End If
End Sub

答案 1 :(得分:4)

抱歉复活这个话题......

但是接受的答案并不能很好地满足我的所有需求,所以我对它进行了一些改进。我有几十个ListBox,这一切都需要取消选择点击行为。

因此,我创建了一个自定义控件,覆盖SelectionModeProperty(将其默认值设置为SelectionMode.Multiple)并自动跟踪SelectionChanged事件。让我们看一下代码:

public class UnselectableListBox : ListBox
{
    public UnselectableListBox() : base()
    {
        SelectionChanged += new SelectionChangedEventHandler((sender, e) =>
        {
            if (e.AddedItems.Count > 0)
            {
                var last = e.AddedItems[0];
                foreach (var item in new ArrayList(SelectedItems))
                    if (item != last) SelectedItems.Remove(item);
            }
        });
    }

    static UnselectableListBox()
    {
        SelectionModeProperty.OverrideMetadata(typeof(UnselectableListBox),
            new FrameworkPropertyMetadata(SelectionMode.Multiple));
    }
}

然后,我只需要用以下代码替换我的XAML:

<local:UnselectableListBox ... />

不再需要为每个SelectionChanged上的每个ListBox代码Window

答案 2 :(得分:1)

没有试图击败死马,但我有同样的问题,不能使用答案中使用的任何方法...希望有人可以从我的答案中受益:

我将选择模式设置为单一。我有双击事件,这使得多个选择模式不那么令人满意,很难获得双击工作。

SelectionChanged仅在所选项目不同时才会触发。简单方法:使用PreviewLeftMouseDownClickPreviewLeftMouseUpClick。将MyListBox.SelectedIndex存储到预览鼠标按下事件中的对象变量中。

在预览鼠标向上事件中,将该事件从down事件与MyListBox.SelectedIndex进行比较,如果它们是同一组MyListBox.SelectedIndex = -1

如果项目相同,则会取消选择该项目,因为索引编号的更改发生在预览之后和预览之前!

答案 3 :(得分:0)

使用Control键建议的方法。这是一个在所有Windows中都保持一致的UI手势。你应该警惕改变这种行为。