как щелкнуть правой кнопкой мыши на элемент из списка и открыть меню на WPF

У меня есть Listbox с файлами, я хочу иметь возможность щелкнуть правой кнопкой мыши и открыть меню, такое как Удалить, чтобы удалить файлы из списка.

в настоящее время у меня есть эта функция после щелчка правой кнопкой мыши на элементе внутри моего списка

private void listBoxFiles_PreviewMouseRightButtonDown(object sender, MouseButtonEventArgs e)
{

}

и я реализую в меню удаления XAML после щелчка правой кнопкой мыши

          <ListBox.ContextMenu>
                <ContextMenu>                                                        
                    <MenuItem Header="Delete"/>
                </ContextMenu>
            </ListBox.ContextMenu>

функция, которая удаляет файл из моего ListBox:

private void MenuItemDelete_Click(object sender, RoutedEventArgs e)
{            
    if (listBoxFiles.SelectedIndex == -1)
    {
        return;
    }

    //string filePath = (listBoxFiles.SelectedItem).ToString();
    int index = listBoxFiles.SelectedIndex;
    listBoxFiles.Items.RemoveAt(index);
}

Ответы на вопрос(2)

не нужноlistBoxFiles_PreviewMouseRightButtonDown когда ты написал

<ListBox>
            <ListBox.ContextMenu>
                <ContextMenu>
                    <MenuItem Header="Delete"></MenuItem>
                </ContextMenu>
            </ListBox.ContextMenu>
        </ListBox>

он уже работает после щелчка правой кнопкой мыши

 user97903304 мар. 2012 г., 22:42
Я хочу добавить 3 функции в меню (каждая опция в меню будет иметь разные функции), поэтому все еще необходимо проверить, какой элемент был нажат? и я не понял последние 2 строки в функции меню MenuItemDelete_Click
 user97903304 мар. 2012 г., 22:11
Хорошо, спасибо, теперь, как я могу "поймать" имя файла (путь), на который я нажал?
 user97903305 мар. 2012 г., 11:55
Ошибка: невозможно привести объект типа «System.String» к типу «System.Windows.Controls.ListBoxItem».
 user97903305 мар. 2012 г., 13:56
теперь все в порядке, но у меня есть другие вопросы: 1. почему каждое нажатие на элемент в окне списка меняет его статус с выбранного (синий цвет) на невыбранный, и если файл выбран, и я нажимаю на пустое место в списке, файл остается выбранным ? 2. Я реализую функцию, которая, если я нажимаю правую кнопку мыши на элементе в списке и в меню нажимаю Удалить элемент, удаленный из моего списка, но это происходит, только если файл не был выбран ранее, я имею в виду, если я нажимаю на элемент в списке а затем щелкните правой кнопкой мыши и удалите файл, указанный в списке и не удаленный, см. мое обновление
 user97903304 мар. 2012 г., 11:27
спасибо, вечером попробую и обновлю.

Если вы хотите выполнить какую-либо операцию, один из способов - проверить, какой элемент был нажат в функции щелчка в меню. Например, у вас есть следующий список:

<ListBox Name="someListBox">
    <ListBox.ContextMenu>
         <ContextMenu>
             <MenuItem Header="Delete" Click="MenuItemDelete_Click"/>
         </ContextMenu>
    </ListBox.ContextMenu>

    <ListBoxItem>...</ListBoxItem>
    <ListBoxItem>...</ListBoxItem>
    <ListBoxItem>...</ListBoxItem>

</ListBox>

И функция может быть следующей:

private void MenuItemDelete_Click(object sender, RoutedEventArgs e)
{
    if (someListBox.SelectedIndex == -1) return;

    // Hypothetical function GetElement retrieves some element
    var element = GetElement(someListBox.SelectedIndex);

    // Hypothetical function DeleteElement
    DeleteElement(element);
}

Обновлено 5 марта 2012 года:

Вот еще один вариант вашего списка. Вы можете добавить контекстное меню не в список, а в элементы списка. Например:

<ListBox Name="someListBox" MouseDown="someListBox_MouseDown">
    <ListBox.Resources>

        <!--Defines a context menu-->
        <ContextMenu x:Key="MyElementMenu">
            <MenuItem Header="Delete" Click="MenuItemDelete_Click"/>
        </ContextMenu>

        <!--Sets a context menu for each ListBoxItem in the current ListBox-->
        <Style TargetType="{x:Type ListBoxItem}">
             <Setter Property="ContextMenu" Value="{StaticResource MyElementMenu}"/>
        </Style>

    </ListBox.Resources>
    <ListBoxItem>...</ListBoxItem>
    <ListBoxItem>...</ListBoxItem>
    <ListBoxItem>...</ListBoxItem>
</ListBox>

1) Эта функция отменяет выбор всех элементов при нажатии на пустое место в списке:

private void someListBox_MouseDown(object sender, MouseButtonEventArgs e)
{
    someListBox.UnselectAll();
}

2) Когда вы щелкаете по элементу lisboxt, он становится синим. Когда вы щелкаете правой кнопкой мыши по элементу списка, он остается синим, но если появляется контекстное меню, элемент списка становится серым, возможно, потому, что этот элемент теряет фокус.

3) Функция удаления работает отлично:

private void MenuItemDelete_Click(object sender, RoutedEventArgs e)
{
    if (someListBox.SelectedIndex == -1)
    {
        return;
    }

    someListBox.Items.RemoveAt(someListBox.SelectedIndex);
}
 Taras Feschuk05 мар. 2012 г., 11:22
Поскольку все элементы списка имеют общее контекстное меню, вы должны проверить, по какому элементу щелкнули. Последние 2 строки не обязательны, я написал их только для того, чтобы показать пример. Вы должны определить, по какому элементу щелкнули, и выполнить некоторые операции с этим элементом.
 user97903304 мар. 2012 г., 22:32
Я хочу добавить 3 функции в меню, поэтому все еще необходимо проверить, какой элемент был нажат? и я не понял последние 2 строки в функции меню MenuItemDelete_Click
 user97903304 мар. 2012 г., 11:27
спасибо, вечером попробую и обновлю.
 user97903304 мар. 2012 г., 22:49
Я хочу добавить 3 функции в меню (каждая опция в меню будет иметь разные функции), поэтому все еще необходимо проверить, какой элемент был нажат? и я не понял последние 2 строки в функции меню MenuItemDelete_Click
 Taras Feschuk05 мар. 2012 г., 11:32
Если вы хотите получить текстовое значение выбранного элемента, вы можете написать:string elementText =((ListBoxItem)someListBox.SelectedItem).Content.ToString();

Ваш ответ на вопрос