WPF: ListBox не выбран - PullRequest
       52

WPF: ListBox не выбран

1 голос
/ 27 января 2010
  1. Когда пользователь нажимает на элемент в моем одиночном выборе ListBox, элемент выбирается.
  2. Когда пользователь щелкает элемент во второй раз, элемент не отменяется, если он не удерживает нажатой клавишу управления.

Каков рекомендуемый способ изменить # 2, чтобы не требовался ключ управления?

Ответы [ 4 ]

4 голосов
/ 25 августа 2011

Извините, что воскресил эту тему ...

Но принятый ответ не полностью покрывал все мои потребности, поэтому я немного его улучшил. У меня есть десятки 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.

4 голосов
/ 27 января 2010

Убедитесь, что выбран режим выбора Multiple. Выбрав несколько:

Вы можете использовать мышь для выбора и отмены выбора любого элемента (ов), который вы хотите, просто щелкнув мышью. Но если вы хотите, чтобы только один выбранный элемент за раз, вам придется отменить выбор других элементов в коде в событии SelectionChanged.

Источник

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 голос
/ 20 июля 2016

Не пытался победить мертвую лошадь, но у меня была та же проблема, и я не мог использовать ни один из методов, использованных в ответах здесь ... надеюсь, кто-то может извлечь пользу из моего ответа:

У меня установлен режим выбора одиночный. У меня есть события двойного щелчка, что делает режим множественного выбора не очень желательным и трудным для получения двойного щелчка.

SelectionChanged срабатывает, только если выбранный элемент отличается. Простой способ: используйте PreviewLeftMouseDownClick и PreviewLeftMouseUpClick. Сохраните MyListBox.SelectedIndex в переменной объекта в событии предварительного просмотра мыши.

В событии предварительного просмотра при нажатии мыши сравните эту переменную из события down с MyListBox.SelectedIndex и, если они совпадают, установите MyListBox.SelectedIndex = -1.

Элемент будет отменен, если он такой же, потому что смена номеров индекса происходит после предварительного просмотра и до предварительного просмотра!

0 голосов
/ 27 января 2010

Использование клавиши управления - рекомендуемый способ сделать это. Это жест пользовательского интерфейса, который одинаков для всех Windows. Вы должны опасаться изменения этого поведения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...