Ответ 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);
}