我有包含文件的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);
}
答案 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>
右键单击后它已经正常工作