【问题标题】:how to right click on item from Listbox and open menu on WPF如何右键单击列表框中的项目并在 WPF 上打开菜单
【发布时间】:2012-03-03 19:41:21
【问题描述】:

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

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

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

【问题讨论】:

    标签: c# wpf


    【解决方案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);
    }
    

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

    【讨论】:

    • 我想在菜单中添加 3 个功能,所以仍然需要检查单击了哪个项目?我不明白函数 MenuItemDelete_Click 中的最后两行
    • 我想在菜单中添加3个功能(菜单中的每个选项都有不同的功能)所以仍然需要检查哪个项目被点击了?我不明白函数 MenuItemDelete_Click 中的最后两行
    • 因为所有列表元素共享一个上下文菜单,您应该检查单击了哪个项目。最后两行不是必需的,我写它们只是为了展示一些例子。您应该确定单击了哪个元素并对该元素执行一些操作。
    • 如果你想检索点击元素的文本值,你可以写:string elementText =((ListBoxItem)someListBox.SelectedItem).Content.ToString();
    • 错误:无法将“System.String”类型的对象转换为“System.Windows.Controls.ListBoxItem”类型。
    【解决方案2】:

    不需要listBoxFiles_PreviewMouseRightButtonDown 你写的时候

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

    右键点击后就可以使用了

    【讨论】:

    • 好的,谢谢,现在我如何“捕捉”我点击的文件名(路径)?
    • 我想在菜单中添加3个功能(菜单中的每个选项都有不同的功能)所以仍然需要检查哪个项目被点击了?我不明白函数 MenuItemDelete_Click 中的最后两行
    • 错误:无法将“System.String”类型的对象转换为“System.Windows.Controls.ListBoxItem”类型。
    • 现在可以了,但我还有另一个问题:1.为什么每次按下列表框中的项目都会将其状态从选中(蓝色)更改为未选中,如果选择了文件并且我按下一个空列表框上的空间文件保持选中状态? 2.我实现的功能是,如果我在列表框中按右键单击项目并在菜单中按删除从我的列表框中删除的项目,但这仅在之前未选择文件时发生,我的意思是如果我按下列表框中的项目而不是右键单击并删除列表框中的文件并没有删除,请参阅我的更新
    猜你喜欢
    • 2020-11-24
    • 2015-06-15
    • 1970-01-01
    • 2012-12-09
    • 2010-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-02
    相关资源
    最近更新 更多