如何右键单击列表框中的项目并在WPF上打开菜单

时间:2012-03-03 19:41:22

标签: c# wpf

我有包含文件的Listbox,我希望能够右键单击并打开像Delete这样的菜单,以便从列表框中删除文件。

目前我在右键单击列表框中的项目

后有此功能
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 个答案:

答案 0 :(得分:30)

您已经有一个带有标记的上下文菜单。

如果要执行某些操作,其中一种方法是检查菜单的Click功能中单击了哪个项目。 例如,您有下一个列表框:

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

2012年3月5日更新:

以下是列表框的另一种变体。您可以不将上下文菜单添加到列表框,而是添加到列表框项目。例如:

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

答案 1 :(得分:1)

不需要listBoxFiles_PreviewMouseRightButtonDown 你写的时候

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

右键单击后它已经正常工作