Вот ответ, который я придумал. Мне это не очень нравится, потому что это немного хакерство, но это работает. Идея состоит в том, что вы заставляете ваши метки слушать событие MouseRightButtonUp
, которое запускается, когда пользователь отпускает правую кнопку мыши после нажатия, чтобы открыть контекстное меню. В обработчике событий вы устанавливаете частную переменную Label для метки, которую пользователь только что щелкнул правой кнопкой мыши. Затем в вашем обработчике кликов MenuItem вы можете получить доступ к этой закрытой переменной Label. Обратите внимание, что все метки, которые вы хотите сделать, должны использовать тот же обработчик для MouseRightButtonUp.
Например:
<Window.Resources>
<ContextMenu x:Key="MyMenu">
<MenuItem Header="Edit" Click="Edit_Click"/>
<MenuItem Header="Clear" Click="Clear_Click"/>
</ContextMenu>
</Window.Resources>
<StackPanel>
<Label ContextMenu="{StaticResource MyMenu}"
MouseRightButtonUp="Label_MouseRightButtonUp">Some text</Label>
<Label ContextMenu="{StaticResource MyMenu}"
MouseRightButtonUp="Label_MouseRightButtonUp">Some junk</Label>
<Label ContextMenu="{StaticResource MyMenu}"
MouseRightButtonUp="Label_MouseRightButtonUp">Some stuff</Label>
<Label ContextMenu="{StaticResource MyMenu}"
MouseRightButtonUp="Label_MouseRightButtonUp">Some 0000</Label>
</StackPanel>
Код:
private void Edit_Click(object sender, RoutedEventArgs e)
{
if (clickedLabel != null)
{
MessageBox.Show(clickedLabel.Content.ToString());
}
}
private void Clear_Click(object sender, RoutedEventArgs e)
{
if (clickedLabel != null)
{
MessageBox.Show(clickedLabel.Content.ToString());
}
}
private Label clickedLabel;
private void Label_MouseRightButtonUp(object sender, MouseButtonEventArgs e)
{
clickedLabel = (Label)sender;
}