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

use*_*033 11 c# wpf

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

目前我右键单击列表框中的项目后有此功能

private void listBoxFiles_PreviewMouseRightButtonDown(object sender, MouseButtonEventArgs e)
{

}
Run Code Online (Sandbox Code Playgroud)

然后我在右键单击后在XAML删除菜单中实现

          <ListBox.ContextMenu>
                <ContextMenu>                                                        
                    <MenuItem Header="Delete"/>
                </ContextMenu>
            </ListBox.ContextMenu>
Run Code Online (Sandbox Code Playgroud)

从我的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);
}
Run Code Online (Sandbox Code Playgroud)

Tar*_*huk 31

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

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

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

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

</ListBox>
Run Code Online (Sandbox Code Playgroud)

功能可能是下一个:

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);
}
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

1)当您单击列表框中的空白区域时,此功能将取消选择所有项目:

private void someListBox_MouseDown(object sender, MouseButtonEventArgs e)
{
    someListBox.UnselectAll();
}
Run Code Online (Sandbox Code Playgroud)

2)单击lisboxt项时,它为蓝色.当你右键点击列表框中的项目,它仍然是蓝色的,但如果出现一个上下文菜单,列表框项目变得灰色,也许是因为这个项目失去焦点.

3)删除功能正常:

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

    someListBox.Items.RemoveAt(someListBox.SelectedIndex);
}
Run Code Online (Sandbox Code Playgroud)


小智 2

listBoxFiles_PreviewMouseRightButtonDown 当你写的时候不需要

<ListBox>
            <ListBox.ContextMenu>
                <ContextMenu>
                    <MenuItem Header="Delete"></MenuItem>
                </ContextMenu>
            </ListBox.ContextMenu>
        </ListBox>
Run Code Online (Sandbox Code Playgroud)

右键单击后它已经可以工作了