Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/40: Рейтинг темы: голосов - 40, средняя оценка - 4.88
1 / 1 / 1
Регистрация: 03.02.2020
Сообщений: 18
WPF

Как обрабатывать клики на элементы списка ListView?

04.02.2020, 20:07. Показов 8692. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
товарищи, очень нужна помощь, как обработать нажатие левой и правой кнопки мыши на элемент списка в ListView в WPF
есть элемент ListView (menulist)
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 <ListView Name="menulist" ItemsSource="{Binding MENU_LIST_VIEW_ITEMS}"    SelectionChanged="ewr" >
                    <ListView.View >
                        <GridView >
                            <GridViewColumn Header="название блюда" DisplayMemberBinding ="{ Binding Path= name}">
 
                            </GridViewColumn>
                            <GridViewColumn Header ="цена  (р)" DisplayMemberBinding ="{Binding Path= coast}">
 
                            </GridViewColumn>
                            <GridViewColumn Header ="сибестоимость (р)" DisplayMemberBinding ="{Binding Path= coast_prise}">
 
                            </GridViewColumn>
                        </GridView>
                    </ListView.View>
                </ListView>
который привязан к коллекции элементов типа MENU_LIST_VIEW
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
 public class MENU_LIST_VIEW
    {
        public double coast { get; set; } //цена
        public string name { get; set; }// название
        public double coast_prise { get; set; }// сибестоимость
        public MENU_LIST_VIEW(MENU_LIST menu)
        {
            coast = menu.coast;
            name = menu.menu_name;
            coast_prise = coast_prise_made(menu);
           
        }
        public MENU_LIST_VIEW()
        {
 
        }
 
        public double coast_prise_made(MENU_LIST menu)
        {
            double COAST = 0;
            for (int i = 0; i < menu.INGRES.Count; i++)
            {
                for(int j =0; j< MainWindow.sklad.Count; j++)
                {
                    if(menu.INGRES[i] == MainWindow.sklad[j].NAME)
                    {
                        double buff = menu.INGRES_QUANTITY[i] * MainWindow.sklad[j].PRICE;
                        COAST += buff;
                        break;
                    }
                }
            }
            return COAST;
        }
 
        public void create_items_view(ObservableCollection<MENU_LIST_VIEW> d, List<MENU_LIST> menu)
        {
            for(int i =0; i < menu.Count; i++)
            {
                d.Add(new MENU_LIST_VIEW(menu[i]));
            }
           
        }
       
    }
необходимо обрабатывать нажатие на элементы Items по отдельности на правую кнопку мыши и отдельно на левую.
обработки по SelectionChanged недостаточно, а на событие Selected говорит, что такого на существует . кто знает , как это можно сделать помогите плиз.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
04.02.2020, 20:07
Ответы с готовыми решениями:

Нарисовать квадраты, способные обрабатывать клики мышью
Здравствуйте, дамы и господа. Быть может я сейчас немного не правельно поставлю вопрос, но надеюсь суть вопроса вы поймёте... ...

Не отображаются элементы списка ListView, полученного у другого списка
Пытаюсь выполнить добавление нужных элементов во временном списке ListView, а потом присвоить этот список другому списку, который...

При клики в BaseAdapter меняется массив строк, как пересоздать ListView с новым массивом?
Здравствуйте! Имеется класс: package ru.contedevel.mathworker; import java.util.ArrayList; import...

7
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16125 / 11249 / 2888
Регистрация: 21.04.2018
Сообщений: 33,082
Записей в блоге: 2
04.02.2020, 20:59
Цитата Сообщение от Vl__ADD Посмотреть сообщение
обработки по SelectionChanged недостаточно
Почему?
Цитата Сообщение от Vl__ADD Посмотреть сообщение
а на событие Selected говорит, что такого на существует
В WPF в нём нет смысла, поскольку, его функционал полностью поглощается реализацией привязки в SelectedItem.
В WinForms нет привязок, поэтому там есть это событие.

Цитата Сообщение от Vl__ADD Посмотреть сообщение
необходимо обрабатывать нажатие на элементы Items по отдельности на правую кнопку мыши и отдельно на левую.
Не всё так просто.
ListView наследует Selector. А он обрабатывает левый клик для изменения выделения, и дальше это событие не всплывает.
Правый же клик не приводит к выделению и узнать над каким элементов он был произведён затруднительно.

Для дальнейших советов нужно больше деталей вашей реализации и алгоритма который вы хотите получить в интерфейсе пользователя.

Опишите подробнее, каждый пунктик.
Типа такого:
  • Пользователь переводит курсор на нужную ему строку
  • Нажимает ЛКМ - происходит выделение.
  • После отжатия ЛКМ надо вызвать такой-то метод ViewModel из контекста данных такого-то элемента и передать в него такие-то параметры.
  • .....
  • .....
0
1 / 1 / 1
Регистрация: 03.02.2020
Сообщений: 18
04.02.2020, 21:32  [ТС]
- пользователь наводит курсор на нужную ему строку
- нажимает ЛКМ
- после отжатия ЛКМ вызывается метод, который добавляет содержимое элемента в коллекцию элементов типа MENU_LIST_VIEW


- пользователь наводит курсор на нужную ему строку
- нажимает ПКМ
- после отжатия ПКМ вызывается метод, который ищет в коллекции MENU (не важно как она реализована) элемент соответствующий поля namt в выделенной строке и выводит его на экран


по сути проблема именно в том как обрабатывать нажатия разных кнопок мыши по строке, я думал ,что можно было бы сделать элементы ListView как кнопки и уже через них обрабатывать нажатия, но я так и не понял, как это сделать.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16125 / 11249 / 2888
Регистрация: 21.04.2018
Сообщений: 33,082
Записей в блоге: 2
04.02.2020, 21:59
Цитата Сообщение от Vl__ADD Посмотреть сообщение
,что можно было бы сделать элементы ListView как кнопки и уже через них обрабатывать нажатия, но я так и не понял, как это сделать
И кнопок тоже нет всплывающих событий ЛКМ и ПКМ

Добавлено через 2 минуты
Цитата Сообщение от Vl__ADD Посмотреть сообщение
- пользователь наводит курсор на нужную ему строку
- нажимает ЛКМ
- после отжатия ЛКМ вызывается метод, который добавляет содержимое элемента в коллекцию элементов типа MENU_LIST_VIEW
При нажатии ЛКМ отрабатывает SelectionChanged и выделяется строка на которой курсор.
Почему нельзя обработать это изменение?

При отпускании ЛКМ надо обработать выделенную строку или строку над которой будет она отпущена?
Возможны сценарии когда это будут разные строки.

Добавлено через 1 минуту
Цитата Сообщение от Vl__ADD Посмотреть сообщение
- пользователь наводит курсор на нужную ему строку
- нажимает ПКМ
- после отжатия ПКМ вызывается метод, который ищет в коллекции MENU (не важно как она реализована) элемент соответствующий поля namt в выделенной строке и выводит его на экран
Такой же вопрос.
Событие для выделенной строки или для строки над которой отпущена ПКМ?

Добавлено через 2 минуты
И вопрос по обоим клавишам.
Что нужно вызвать:
- метод в CB View
- метод Контекста Данных? Если да, то какого элемента? Или самого окна?
- что надо передать в методы? Ничего, просто вызвать без параметров? Выделенную строку?
1
1 / 1 / 1
Регистрация: 03.02.2020
Сообщений: 18
04.02.2020, 22:07  [ТС]
то есть, в принципе обрабатывать нажатие ПКМ по ListView и потом просто через свойство cursor получать необходимый элемент...
что же, огромное спасибо за объяснение, вы мне очень помогли. Пойду дальше постигать все прелести и особенности WPF
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16125 / 11249 / 2888
Регистрация: 21.04.2018
Сообщений: 33,082
Записей в блоге: 2
04.02.2020, 22:23
Цитата Сообщение от Vl__ADD Посмотреть сообщение
о есть, в принципе обрабатывать нажатие ПКМ по ListView и потом просто через свойство cursor получать необходимый элемент..
Нет.
Вы меня не правильно поняли.
На ListView (и всех производных Selector), на кнопках (производных от ButtonBase) ЛКМ, вообще, невозможно отловить.
Оно на них замещено на SelectionChanged или Click.
Можно поймать туннельные события Preview ЛКМ и ПКМ для нажатия и отпускания.
Но надо понимать, что они возникают ДО самих всплывающих ЛКМ и ПКМ.

То есть PreviewMouseLeftButtonDown возникает до MouseLeftButtonDown. И на момент его возникновения строка ещё не выделена.
Это событие спускается (туннелирует) с самого верха (от OS) до элемента нижнего уровня. Дойдя до самого нижнего уровня, она возбуждает в нём событие MouseLeftButtonDown которое подымается (всплывает) по уровням вверх.
Но всплывающим событиям можно прекратить всплытие. Так поступают кнопки и Selector.

Поэтому я от вас и прошу деталей, где в какой момент и откуда надо вызвать метод, что этому методу надо передать в параметрах.
Можно к элементам в строке прикрепить всплывающие команды которые перехватывать обрабатывать в родительских контейнерах. Но надо понимать, что этим командам нужно передать в параметрах.
0
1 / 1 / 1
Регистрация: 03.02.2020
Сообщений: 18
04.02.2020, 22:52  [ТС]
я так понял, вы советуете через свойство command указывать на самодельные команды, но мне так сложно не надо.
у меня получилось через события MouseLeftButtonUp="leftmouse" и MouseRightButtonUp="ewr"
XML
1
<ListView Name="menulist" ItemsSource="{Binding MENU_LIST_VIEW_ITEMS}"  MouseLeftButtonUp="leftmouse"   MouseRightButtonUp="ewr" >
и потом через свойство SelectedIndex работать с необходимыми мне коллекциями.
вот тестовые обработчики
для ЛКМ
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
private void leftmouse(object sender, EventArgs e)
        {
            int i = menulist.SelectedIndex;
           
            string nam = MENU_LIST_VIEW_ITEMS[i].name;
            string buff = "";
            foreach (MENU_LIST it in MENU)
            {
                if(it.menu_name == nam)
                {
                   for(int j = 0; j < it.INGRES.Count; j ++ )
                    {
                        buff = buff + it.INGRES[j] + "(" +  " " + it.INGRES_QUANTITY[j] + ")  " ;
                    }
                }
            }
            
            MessageBox.Show("left mouse  " + buff);
            
        }
И для ПКМ аналогичный.
всё заработало.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16125 / 11249 / 2888
Регистрация: 21.04.2018
Сообщений: 33,082
Записей в блоге: 2
04.02.2020, 23:06
Цитата Сообщение от Vl__ADD Посмотреть сообщение
И для ПКМ аналогичный.
всё заработало.
Ну, и отлично!
Хорошо, что сами справились.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
04.02.2020, 23:06
Помогаю со студенческими работами здесь

Как обрабатывать выбранный элемент списка Combobox
Здравствуйте . Пытаюсь разобраться с Combobox. Вот код , где я его создаю и заполняю элементами : #include &lt;Windows.h&gt; ...

Как обрабатывать граф в виде списка смежности
Не подскажете, как обрабатывать граф (например поиск в глубину), если он задан списком смежности (,,)? Приводить к обычному виду?

Как обрабатывать не только View элементы
ImageView btn1 = (ImageView)findViewById(R.drawable.gorod_cveta_button1); final Animation anim1 =...

Как обрабатывать элементы массива по типу обычных переменных?
Есть dataGridView, в него заносятся данные, столкнулся с проблемой : Как элементы массива отнимать, по типу обычной переменной? ...

Как обрабатывать элементы содержимого ячеек таблицы на Web странице
Уважаемые форумчане! подскажите, пожалуйста: как с помощью VBA Excell корректно обрабатывать различные элементы содержимого ячеек...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru