powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / ListBox, работа событий KeyDown и MouseLeftButtonDown
1 сообщений из 1, страница 1 из 1
ListBox, работа событий KeyDown и MouseLeftButtonDown
    #37033628
enigmatic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Допустим, у нас есть ListBox.
Он привязан к источнику данных через биндинг в зэмле.
Код: plaintext
ItemsSource={Binding}
Источник данных задается в конструкторе Page (на которой ListBox)
Код: plaintext
this.DataContext = collection;
ListBox выводит только имена объектов и статическую картинку. Задается отображение через
Код: plaintext
1.
2.
3.
4.
5.
<DataTemplate>
    <StackPanel Orientation="Horizontal">
        <Image Source="myPicture.png" />
        <TextBlock Text="{Binding Name}" VerticalAlignment="Center" />
    </StackPanel>
</DataTemplate>

Нам нужно как-то взаимодействовать с ListBox. Для этого используем KeyDown и MouseLeftButtonDown.
Тут возникают проблемы: KeyDown работает отлично, в отличие от MouseLeftButton.

Взаимодействие с KeyDown следующее:
Нажатие на клавишу -> вызов обработчика, в e.OriginalSource которого -- объект из коллекции. Что и требуется.

Здесь начинается интересное:
ListBox сам обрабатывает событие клика, только если в нем нет элементов,
а если есть, то событие перенаправляется в ListBoxItem, где выставляется e.Handled в true, после чего сам ListBox его уже не обрабатывает.
Из рефлектора:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e) {
    base.OnMouseLeftButtonDown(e);
    if (!e.Handled) {
        e.Handled = true;
        base.Focus();
        if (this._parentSelector != null)
            this._parentSelector.OnListBoxItemClicked(this);
    }
}


Для того, чтобы событие обрабатывал и сам ListBox, нужно следующее:
Код: plaintext
1.
ListBox.AddHandler(UIElement.MouseLeftButtonDownEvent, new MouseButtonEventHandler(ListBox_MouseLeftButtonDown), true);
Т.е. указываем ListBox обрабатывать событие, даже если оно уже Handled.

Теперь, когда по левому клику в ListBox вызывается обработчик левого клика, вроде бы все хорошо.
Но в e.OriginalSource при обработке приходит не объект коллекции, а либо Image, либо TextBlock, в зависимости от того где был клик.

Как вернуть объект коллекции по клику?
Почему обработка KeyDown и MouseLeftButtonDown отличается?
Возможно следует делать по другому?
...
Рейтинг: 0 / 0
1 сообщений из 1, страница 1 из 1
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / ListBox, работа событий KeyDown и MouseLeftButtonDown
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]