Модераторы: gambit, Kefir, Partizan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ListView, проверить входит ли курсор мыши, в коллекцию элементов 
:(
    Опции темы
Rohoss
  Дата 17.10.2010, 17:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Начальник интернета
***


Профиль
Группа: Завсегдатай
Сообщений: 1308
Регистрация: 9.10.2006
Где: Matrix

Репутация: 4
Всего: 18



Есть контрол ListView, который содержит три  элемента. Примерно выглядит всё так.
Код

            List<string> list = new List<string>();
            list.Add("item1");
            list.Add("item1");
            list.Add("item1");

            ListView lv = new ListView();
            lv.ItemsSource = list;

Как мне, при клике правой кнопки мыши на ListView узнать, находится ли курсор на каком-то из трёх элементов ListView или в пустой области (Той области ListView, где нет элементов)? Мне кажется решение должно содержатся в самом ListView, но не нашёл  smile 


--------------------
Файловый менеджер Explorer.Net скачать  video
PM ICQ   Вверх
WolfTheGrey
Дата 17.10.2010, 21:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 207
Регистрация: 21.1.2009
Где: forum.vingrad.ru

Репутация: 2
Всего: 2



Пробовал ни как, Нужно обрабатывать два события: 
MouseLeftButtonDown="ListBox_MouseLeftButtonDown" - который обрабатывается событием MouseButtonEventArgs
 SelectionChanged="ListBox_SelectionChanged" а этот SelectionChangedEventArgs
PM MAIL   Вверх
Rohoss
Дата 18.10.2010, 18:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Начальник интернета
***


Профиль
Группа: Завсегдатай
Сообщений: 1308
Регистрация: 9.10.2006
Где: Matrix

Репутация: 4
Всего: 18



Цитата(WolfTheGrey @  17.10.2010,  21:31 Найти цитируемый пост)
Пробовал ни как, Нужно обрабатывать два события: 
MouseLeftButtonDown="ListBox_MouseLeftButtonDown" - который обрабатывается событием MouseButtonEventArgs
 SelectionChanged="ListBox_SelectionChanged" а этот SelectionChangedEventArgs 

не совсем понял...


--------------------
Файловый менеджер Explorer.Net скачать  video
PM ICQ   Вверх
Kaerus
Дата 18.10.2010, 18:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


WPF'er
*


Профиль
Группа: Участник
Сообщений: 89
Регистрация: 3.9.2010

Репутация: 1
Всего: 1



А зачем тебе это надо и ну что должно произойти (там событие вызваться или что). Потому как есть идеи, но надо цель уточнить.
PM MAIL ICQ   Вверх
Rohoss
Дата 18.10.2010, 23:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Начальник интернета
***


Профиль
Группа: Завсегдатай
Сообщений: 1308
Регистрация: 9.10.2006
Где: Matrix

Репутация: 4
Всего: 18



Цитата(Kaerus @  18.10.2010,  18:57 Найти цитируемый пост)
А зачем тебе это надо и ну что должно произойти (там событие вызваться или что). Потому как есть идеи, но надо цель уточнить.

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


--------------------
Файловый менеджер Explorer.Net скачать  video
PM ICQ   Вверх
WolfTheGrey
Дата 19.10.2010, 01:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 207
Регистрация: 21.1.2009
Где: forum.vingrad.ru

Репутация: 2
Всего: 2



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

<ListBox Width="100" Height="300" Canvas.Left="0" Canvas.Top="20">
                <ListBox.ContextMenu>
                    <ContextMenu BorderThickness="2" >
                        <MenuItem Header="file">
                            <MenuItem Header="open"/>
                            <MenuItem Header="sawe"/>
                        </MenuItem>                        
                    </ContextMenu>
                </ListBox.ContextMenu>                
                
                <ListBoxItem Content="a">
                    <ListBoxItem.ContextMenu>
                        <ContextMenu>
                            <MenuItem Header="Cuit"/>
                            <MenuItem Header="Copu"/>
                            <MenuItem Header="Paste"/>
                        </ContextMenu>
                    </ListBoxItem.ContextMenu>
                </ListBoxItem>
                <ListBoxItem Content="b">
                    <ListBoxItem.ContextMenu>
                        <ContextMenu>
                            <MenuItem Header="Cuit"/>
                            <MenuItem Header="Copu"/>
                            <MenuItem Header="Paste"/>
                        </ContextMenu>
                    </ListBoxItem.ContextMenu>
                </ListBoxItem>
                <ListBoxItem Content="c">
                    <ListBoxItem.ContextMenu>
                        <ContextMenu>
                            <MenuItem Header="Cuit"/>
                            <MenuItem Header="Copu"/>
                            <MenuItem Header="Paste"/>
                        </ContextMenu>
                    </ListBoxItem.ContextMenu>
                </ListBoxItem>
                <ListBoxItem Content="d">
                    <ListBoxItem.ContextMenu>
                        <ContextMenu>
                            <MenuItem Header="Cuit"/>
                            <MenuItem Header="Copu"/>
                            <MenuItem Header="Paste"/>
                        </ContextMenu>
                    </ListBoxItem.ContextMenu>
                </ListBoxItem>
            </ListBox>

Можно сделать и так: (прописать сонекстменю в контейнее листбокса)
но в этом коде чего то не хватает, или что то не правельно.
Код

       <ListBox.ItemContainerStyle>
                    <Style TargetType="ListBoxItem">
                        <Setter Property="Template">
                            <Setter.Value>
                                <ControlTemplate TargetType="ListBoxItem">
                                    <ContextMenu BorderThickness="2">
                                        <MenuItem Header="Cuit"/>
                                        <MenuItem Header="Copu"/>
                                        <MenuItem Header="Paste"/>
                                    </ContextMenu>
                                </ControlTemplate>
                            </Setter.Value>
                        </Setter>
                    </Style>
                </ListBox.ItemContainerStyle>

PM MAIL   Вверх
WolfTheGrey
Дата 19.10.2010, 01:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 207
Регистрация: 21.1.2009
Где: forum.vingrad.ru

Репутация: 2
Всего: 2



забей на то, что выше писал, все на много проще:
Код

<ListBox Width="100" Height="300" Canvas.Left="0" Canvas.Top="20">
                <ListBox.ContextMenu>
                    <ContextMenu BorderThickness="2" >
                        <MenuItem Header="file"/>
                            <MenuItem Header="open"/>
                            <MenuItem Header="sawe"/>
                                             
                    </ContextMenu>
                </ListBox.ContextMenu>

                <ListBox.ItemContainerStyle>
                    <Style TargetType="ListBoxItem">
                        <Setter Property="ContextMenu">
                            <Setter.Value> 
                                    <ContextMenu BorderThickness="2">
                                        <MenuItem Header="Cuit"/>
                                        <MenuItem Header="Copu"/>
                                        <MenuItem Header="Paste"/>
                                    </ContextMenu>
                            </Setter.Value>
                        </Setter>
                    </Style>
                </ListBox.ItemContainerStyle>

                <ListBoxItem>a</ListBoxItem>
                <ListBoxItem>b</ListBoxItem>
                <ListBoxItem>c</ListBoxItem>
                <ListBoxItem>d</ListBoxItem>
                <ListBoxItem>e</ListBoxItem>
            </ListBox>


PM MAIL   Вверх
Rohoss
Дата 19.10.2010, 14:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Начальник интернета
***


Профиль
Группа: Завсегдатай
Сообщений: 1308
Регистрация: 9.10.2006
Где: Matrix

Репутация: 4
Всего: 18



WolfTheGrey, спасибо конечно, но тут дело в другом. Вызывается не контекстное меню WPF, а контекстное меню проводника. Есть класс, который принимает параметром элемент списка и точку(Point) а потом вызывает для них контекстное меню. Поэтому обрабатывать приходится клик правой кнопкой мыши…


--------------------
Файловый менеджер Explorer.Net скачать  video
PM ICQ   Вверх
WolfTheGrey
Дата 19.10.2010, 22:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 207
Регистрация: 21.1.2009
Где: forum.vingrad.ru

Репутация: 2
Всего: 2



Немножко кода в студию пожалуйста.
от части интересует: 
  • контекстное меню проводника
  • Есть класс, который принимает параметром элемент списка и точку(Point) а потом вызывает для них контекстное меню
А зачем тебе параметр Поинт? чтоб определить где щелкнули (на пустом месте или по на каком-то из трёх элементов ListViewна каком-то из трёх элементов ListViewна каком-то из трёх элементов ListViewна каком-то из трёх элементов ListViewна каком-то из трёх элементов ListViewна каком-то из трёх элементов ListViewна каком-то из трёх элементов ListViewна каком-то из трёх элементов ListViewна каком-то из трёх элементов ListViewна каком-то из трёх элементов ListViewна каком-то из трёх элементов ListViewна каком-то из трёх элементов ListViewна каком-то из трёх элементов ListViewна каком-то из трёх элементов ListViewна каком-то из трёх элементов ListViewна каком-то из трёх элементов ListViewна каком-то из трёх элементов ListViewна каком-то из трёх элементов ListViewна каком-то из трёх элементов ListViewна каком-то из трёх элементов ListViewна каком-то из трёх элементов ListViewна каком-то из трёх элементов ListViewна каком-то из трёх элементов ListViewна каком-то из трёх элементов ListViewна каком-то из трёх элементов ListViewна каком-то из трёх элементов ListViewна каком-то из трёх элементов ListViewна каком-то из трёх элементов ListViewна каком-то из трёх элементов ListViewна каком-то из трёх элементов ListViewна каком-то из трёх элементов ListViewна каком-то из трёх элементов ListViewна каком-то из трёх элементов ListViewна каком-то из трёх элементов ListViewна каком-то из трёх элементов ListViewна каком-то из трёх элементов ListViewна каком-то из трёх элементов ListViewна каком-то из трёх элементов ListViewна каком-то из трёх элементов ListViewна каком-то из трёх элементов ListViewна каком-то из трёх элементов ListViewна каком-то из трёх элементов ListViewна каком-то из трёх элементов ListViewна каком-то из трёх элементов ListView). smile 
PM MAIL   Вверх
Kaerus
Дата 21.10.2010, 00:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


WPF'er
*


Профиль
Группа: Участник
Сообщений: 89
Регистрация: 3.9.2010

Репутация: 1
Всего: 1



Как обычно в голову приходит использование WPF Behaviors
Код

class RightClickBehavior : Behavior<FrameworkElement>
{
    protected override void OnAttached()
    {
        base.OnAttached();

        AssociatedObject.MouseRightButtonDown += AssociatedObject_MouseRightButtonDown;
    }

    protected override void OnDetaching()
    {
        base.OnDetaching();

        AssociatedObject.MouseRightButtonDown -= AssociatedObject_MouseRightButtonDown;
    }

    void AssociatedObject_MouseRightButtonDown(object sender, MouseButtonEventArgs e)
    {
        /// Тут можно прописать любой код обработки нажатия правой клавиши
        /// Для примера простой MessageBox
        MessageBox.Show(e.Source.ToString() + "\r\n" + e.GetPosition(e.Source as IInputElement).ToString());
    }
}

А вот применения в шаблоне (оптимальность решения не гарантирую, но работает)
Код

<ListBox ItemsSource="{Binding Items}" HorizontalContentAlignment="Stretch">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <Grid>
                <TextBlock Text="{Binding}" />
                <i:Interaction.Behaviors>
                    <local:RightClickBehavior/>
                </i:Interaction.Behaviors>
            </Grid>
        </DataTemplate>
    </ListBox.ItemTemplate>

    <i:Interaction.Behaviors>
        <local:RightClickBehavior/>
    </i:Interaction.Behaviors>
</ListBox>

PM MAIL ICQ   Вверх
Rohoss
Дата 23.10.2010, 16:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Начальник интернета
***


Профиль
Группа: Завсегдатай
Сообщений: 1308
Регистрация: 9.10.2006
Где: Matrix

Репутация: 4
Всего: 18



Kaerus, я так понимаю, использовать сборку содержащую класс Behavior<T> можно, установив Expression Blend? В библиотеках .NET 3.5 его нет?


--------------------
Файловый менеджер Explorer.Net скачать  video
PM ICQ   Вверх
Kaerus
Дата 23.10.2010, 16:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


WPF'er
*


Профиль
Группа: Участник
Сообщений: 89
Регистрация: 3.9.2010

Репутация: 1
Всего: 1



Где то читал, что формально поведения не являются частью WPF, а появились в Exression Studio. Поэтому нужно будет поставить бленд и желательно 4 (если не ошибаюсь generic behaviors появились именно в 4.0 версии). 

P.S.
A Blend надо ставить однозначно. Лично я сейчас уже не представляю как можно работать с WPF без бленда
PM MAIL ICQ   Вверх
DenWPF
Дата 23.10.2010, 17:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1659
Регистрация: 26.9.2009

Репутация: нет
Всего: 1



если я верно понял задачу, то при нажатии правой кнопки если это listitem то он выделиться, а значит у ListBox будет SelectedItem.

используй это.

только там вроде надо будет повесить событие и функцию
Код


        private void OnPreviewMouseRightButtonDown(object sender, MouseButtonEventArgs e)
        {
            TreeViewItem treeViewItem = VisualUpwardSearch<TreeViewItem>(e.OriginalSource as DependencyObject) as TreeViewItem;

            if (treeViewItem != null)
            {
                treeViewItem.Focus();
                e.Handled = true;
            }
        }
        static DependencyObject VisualUpwardSearch<T>(DependencyObject source)
        {
            while (source != null && source.GetType() != typeof(T))
                source = VisualTreeHelper.GetParent(source);

            return source;
        }


Это сообщение отредактировал(а) DenWPF - 23.10.2010, 17:39
PM MAIL   Вверх
Rohoss
Дата 23.10.2010, 17:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Начальник интернета
***


Профиль
Группа: Завсегдатай
Сообщений: 1308
Регистрация: 9.10.2006
Где: Matrix

Репутация: 4
Всего: 18



если элементы будут выделены и щёлкнуть правой кнопкой в пустую область они и останутся выделенными.


--------------------
Файловый менеджер Explorer.Net скачать  video
PM ICQ   Вверх
DenWPF
Дата 23.10.2010, 19:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1659
Регистрация: 26.9.2009

Репутация: нет
Всего: 1



может быть я уже не помню что этот код делал...аа вроде он наоборот что когда нажимаешь правой кнопкой на элементе что бы он выделлялся
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | WPF и Silverlight | Следующая тема »


 




[ Время генерации скрипта: 0.0973 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.