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

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

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

private void listBoxFiles_PreviewMouseRightButtonDown(object sender, MouseButtonEventArgs e)
{

}

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

          <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);
}

Ответ 1

У вас уже есть контекстное меню с вашей разметкой.

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

<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);
}

Ответ 2

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

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

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